Pénurie alimentaire dans le Snakepit
Pour la première fois en 35 ans, le serpent est à court de nourriture. Les serpents habitants doivent maintenant se battre pour survivre à cette pénurie alimentaire. Un seul serpent peut se tenir au sommet de la chaîne alimentaire!
Classement
Pas encore là!
Dernière mise à jour le 24 février
Lien vers les visualisations des derniers matchs
La description
Si vous voulez vous battre pour les dernières pommes / cerises / autres restantes, vous devez fournir un serpent sous la forme d'un programme qui accepte une entrée donnée et retourne son prochain mouvement.
La seule torsion est que vous n'êtes pas seul dans votre fosse. Un autre serpent tentera également d'obtenir la nourriture rare! Mais il fait sombre à l'intérieur du serpent, donc vous ne pouvez voir que vous et la pomme. Entrer en collision avec votre adversaire entraînera votre mort, tout comme vous mordre ou frapper un mur. De plus, comme les pommes sont rares de nos jours, vous mourez de faim si votre adversaire a mangé suffisamment pour atteindre une longueur de 7.
Le serpent est une carte en deux dimensions avec une largeur et une hauteur de 15, tandis que les tuiles les plus à l'extérieur construisent un mur infranchissable:
0 1 2 . . . c d e
0 # # # # # # # # #
1 # #
2 # x #
. # #
. # #
. # #
c # #
d # #
e # # # # # # # # #
Les coordonnées sont indexées à zéro, donc le point où le x
serait 12,2
.
Votre bot sera appelé avec deux arguments:
- L'emplacement de la nourriture
- Les emplacements de vos segments corporels, séparés par
/
Il doit ensuite écrire l'un des éléments suivants sur stdout:
L
pendant un quart de tour à gauche comme prochain mouvementR
pour un quart de tour à droite- Autre chose pour un mouvement dans la même direction
Exemple:
Projects/Snakepit> python bot.py 12,2 4,8/4,9/3,9/2,9
'R'
Projects/Snakepit>
Règles
Votre bot est autorisé à:
- Afficher n'importe quoi, car tout est un mouvement valide
- Lire / écrire des fichiers dans son propre répertoire situé sous ./snakes/ThisIsYourSnake
- Fonctionne sur Ubuntu 14.04 et Windows 7 (il doit en fait)
Votre bot ne doit pas:
- Lire / écrire des fichiers en dehors de son propre répertoire
- Utiliser des ressources externes comme Internet
- Avoir un temps d'exécution supérieur à 10 secondes par exécution
Vous devez fournir dans votre réponse:
- Le code source du bot
- Un nom de bot / serpent
- (Votre propre nom)
- Une commande pour exécuter votre bot
Si vous voulez me faciliter la vie, veuillez fournir une ligne comme
CoolSnake MyOwnName python bot.py
.
Notation
Votre serpent obtient un point pour avoir gagné un match contre un autre serpent. Une partie est gagnée dans les circonstances suivantes:
- Votre adversaire se frappe, vous ou un mur
- Vous atteignez la longueur 7
De plus, les deux serpents meurent de faim après 200 cycles.
Chaque serpent combattra 10 matchs pour sa survie contre l'autre serpent.
Exemples de bots
Juste pour vous donner une idée, je vais vous fournir ces deux exemples de serpents (participants):
SneakySnake
#!/usr/bin/env python
import sys, random
def main(food, me) :
food = [int(i) for i in food.split(",")]
me = [[int(i) for i in seg.split(",")] for seg in me.split("/")]
head = me[0]
v = [head[0] - me[1][0], head[1] - me[1][1]]
if food[0] < head[0] :
vn = [-1, 0]
elif food[0] > head[0] :
vn = [1, 0]
elif food[0] == head[0] :
if food[1] < head[1] :
vn = [0, -1]
elif food[1] > head[1] :
vn = [0, 1]
if v == vn :
return "..."
elif [-v[1], v[0]] == vn :
return "R"
elif [v[1], -v[0]] == vn :
return "L"
else :
return random.choice(("R", "L"))
if __name__ == "__main__" :
print main(*sys.argv[1:3])
SneakySnake Cipher python bot.py
ViciousViper
#!/usr/bin/env python
import sys, random
def main(food, me) :
food = [int(i) for i in food.split(",")]
me = [[int(i) for i in seg.split(",")] for seg in me.split("/")]
head = me[0]
v = [head[0] - me[1][0], head[1] - me[1][1]]
vn = [food[0] - head[0], food[1] - head[1]]
if 0 not in vn :
vn[v.index(0)-1] = 0
vn[vn.index(0)-1] = vn[vn.index(0)-1] / abs(vn[vn.index(0)-1])
if v == vn :
return "..."
elif [v[0] + vn[0], v[1] + vn[1]] == [0, 0] :
return random.choice(("R", "L"))
else :
return "R" if [-v[1], v[0]] == vn else "L"
if __name__ == "__main__" :
print main(*sys.argv[1:3])
ViciousViper Cipher python bot.py
Et leurs matchs:
Programme de contrôle
Vous pouvez trouver le programme de contrôle sur github , avec tous les bots et les enregistrements des matchs passés.
Exigences:
- Python 2 + les bibliothèques
numpy
etpillow
(vous pouvez vérifier si elles sont présentes viapython -c "import numpy, PIL"
, si cela génère des erreurs les modules sont manquants) - La copie de la structure complète des dossiers est requise pour que le contrôleur fonctionne
- Enregistrez votre ou vos robots dans le
./snakes/list.txt
fichier dans le style deCoolSnake MyOwnName Command To Run My Bot
- Placez votre bot dans un répertoire avec son nom sous
./snakes
- Ni votre, ni le nom de votre bot ne sont autorisés à contenir des espaces blancs!
Usage:
python run.py [-h] [-n int] [-s int] [-l int] [-c int] [-g]
python run.py
exécutera le tournoi avec tous les bots enregistrés dans list.txt et les propriétés standard. Les options avancées sont:
-h
affiche un message d'aide-n int
tours de batailles pour chaque combinaison d'adversaires-s int
détermine la taille de la grille (largeur et hauteur)-l int
définit la longueur requise pour gagner-c int
fixe la limite des cycles-g
ou--no-gifs
ne crée aucun gif des matchs
la source
Réponses:
Zen - C ++
Ce Codémon n'est pas là pour manger mais pour se battre. Il sait qu'un ennemi mort ne volera pas ses pommes.
Name| Author |Launch with
Zen GholGoth21 Zen.exe
Stratégie
Tout le monde (sauf CircleOfLife) se précipite vers les pommes, mais pas zen, pas toujours. Si l'ennemi peut atteindre la nourriture devant lui, il attend simplement au centre (quoi? Mais que faites-vous ici, CircleOfLife?). Sinon, Zen va vers la pomme et se retourne en attendant que quelque chose se passe. En fait, il utilise la pomme comme appât.
Je n'ai rien codé contre la curieuse stratégie de CircleOfLife car il ne peut gagner qu'avec beaucoup de chance.
Le code
Il s'agit du code complet du projet C ++. Coupez les 11 fichiers source et le Makefile et compilez avec
make
Ou téléchargez le fichier zip: Zen.zip
Résultats
Et quelques batailles typiques (ViciousViper vs Zen et SneakySnake vs Zen):
Edit : J'ajoute cette bataille très intéressante contre CircleOfLife:
la source
CircleOfLife (Java)
CircleOfLife Manu java CircleOfLife
(Compiler avecjavac CircleOfLife.java
)Coure vers le milieu et y reste. J'espère que certaines soumissions s'y crasheront sur le chemin de la nourriture.
la source