Concevoir Snake AI

9

Je suis nouveau dans ce changement de pile gamedev, mais j'ai déjà utilisé les sites mathématiques et cs.

Donc, je suis dans une compétition pour créer de l'IA pour un serpent qui rivalisera avec quatre autres serpents en tours de 5 minutes où les règles ressemblent beaucoup au jeu de serpent Nokia traditionnel sauf qu'il y a cinq serpents, la planche est 30x30 et il y a un certain nombre de petits obstacles sur le terrain.

Comme le jeu Nokia, votre serpent grandit lorsque vous atteignez le fruit et si vous vous écrasez contre vous-même, un autre serpent ou le mur vous mourrez. Le jeu s'exécute avec un délai de 30 ms entre les coups et le serveur envoie le nouvel état de jeu toutes les 50 ms que le code doit analyser et ce qui ne l'est pas et produire le coup suivant.

Le gagnant est le serpent qui avait la plus longue longueur à tout moment du jeu. Les bris d'égalité sont décidés par des éliminations.

Jusqu'à présent, ce que j'ai fait est de mettre en œuvre une recherche de graphique A * à partir de chaque serpent pour déterminer si mon serpent est le plus proche de la pomme et si c'est le cas, cela vaut pour la pomme. Sinon, j'ai fait un petit algorithme pour déterminer la zone la plus vide de la planche, pour laquelle mon serpent va, pour anticiper la prochaine pomme.

À part cela, j'ai quelques petits contrôles de survie pour m'assurer que mon serpent ne marche pas dans un piège qu'il ne peut pas sortir et s'il se bloque, j'ai quelque chose pour lui donner une meilleure chance de sortir.

...

Quoi qu'il en soit, j'ai testé mon serpent sur un serveur de test et ça marche plutôt bien. En règle générale, ma stratégie consistant à n'utiliser la pomme que lorsqu'elle est sûre et de trouver de l'espace lorsqu'elle ne la fait pas pousser plus vite que tous les autres serpents (certains serpents font la même chose mais vont souvent au milieu ou dans un coin), parfois, elle gagne ces jeux d'essai, mais est le plus souvent battu par le même serpent qui semble avoir un avantage sur la capacité de survie (mon serpent grandit plus vite mais meurt d'une manière ou d'une autre et cet autre serpent marche lentement et gagne sur la cohérence.

Je me demandais donc quelles idées quelqu'un pouvait essayer d'améliorer mon serpent. Ou peut-être des idées sur une nouvelle approche à adopter. Mes fonctions et mes classes sont bonnes, donc les changements qui peuvent sembler drastiques ne devraient pas être trop mauvais. J'encourage toutes les idées.

Des pensées?

Rawb
la source

Réponses:

5

Une bonne stratégie défensive pourrait être de faire une forme parfaite (donc votre tête et votre dos sont toujours à 1 espace l'un de l'autre, et vous faites un carré complet ou tout ce qui est possible de former à votre longueur donnée), cela vous ferait à peu près immortel car aucun serpent ne pourrait jamais pénétrer dans votre espace clos et vous ne rencontrerez jamais vous-même (à moins qu'une pomme n'apparaisse d'une manière ou d'une autre dans votre bouche, mais j'imagine que c'est impossible s'il n'y a pas d'espace).

Cela ferait en sorte que si la pomme apparaît réellement dans votre espace clos, vous pourriez être programmé pour ne pas y aller et les autres serpents mourront probablement en essayant de l'obtenir, puis après un certain temps, vous pourriez l'obtenir de telle manière à la transition revenir dans votre forme le mieux possible (pourrait être un peu un algorithme délicat mais semble faisable)

Quand choisir des pommes dépendrait simplement de la distance à laquelle elles se trouvent, peut-être que si vous êtes le plus proche par une bonne marge, vous pourriez y aller, mais sinon restez conservateur, difficile à dire, il faudrait probablement l'ajuster en fonction des essais et des erreurs , mais je pense que ce serait une bonne stratégie.

Kevin DiTraglia
la source
1
Donc, fondamentalement, son "serpent" devrait "tortue". xD +1 bonne idée.
Cypher
Bon. Mais il y a des obstacles sur le plateau. Ainsi, d'autres programmeurs de serpents doivent avoir fait leurs serpents pour vérifier s'il y a une obstruction (qu'il s'agisse d'un mur ou d'un autre serpent entourant la pomme). Ils peuvent ne pas venir et simplement mourir. Une chose peut être faite pour éviter ce problème est d'avoir un espacement considérable entre la tête et la queue.
Shashwat
hmm idée intéressante, je pense que je pourrais mettre en œuvre quelque chose comme ça pour quand mon serpent traîne juste en attendant la prochaine pomme à frayer .. haha, je suis un peu inquiet à propos de la pomme qui fraie dans ma bouche, ce qui entraînerait certains la mort et ces jeux sont souvent décidés par une mort prématurée
Rawb
@Ronald En fait, si vous détectez le frai des pommes dans votre bouche, vous pouvez simplement vous tourner vers l'intérieur et vers l'arrière et continuer, car l'IA a un réflexe parfait, il devrait en fait être facile d'y remédier (et pourrait même se réparer) en fonction de la façon dont vous l'appliquez.
Kevin DiTraglia
0

Le serpent devrait adapter sa stratégie à sa longueur actuelle.

Un très long serpent peut utiliser son corps pour barrer ses adversaires. Cela signifie qu'il doit faire un joint avec un mur.

Si le serpent se déplace vers l'est, avec une pomme au nord-est, il doit se rendre jusqu'au mur avant de tourner vers le nord, de sorte que les itinéraires possibles pour d'autres serpents sont sévèrement limités.

  0123456789
a ··········
b ··········
c ········A·
d ··········
e ooooooC···
f o·········
g o·········
h oooooooo··
i ··········
j ··········

Ce serpent avec la tête C, devrait tourner vers le nord à e9, pas à e8, de sorte que tout adversaire en dessous, sera piégé et incapable de manger des pommes qui apparaissent au-dessus de la ligne `` e ''.

Plus la zone que vous pouvez couper est grande et plus vous pouvez la tenir longtemps, mieux c'est.

Bram
la source