Diseñando Snake AI

9

Soy nuevo en este intercambio de gamedev pero he usado los sitios de matemáticas y cs antes.

Entonces, estoy en una competencia para crear IA para una serpiente que competirá con otras cuatro serpientes en rondas de 5 minutos donde las reglas son muy parecidas al juego tradicional de serpientes de Nokia, excepto que hay cinco serpientes, el tablero es 30x30 y hay Una serie de pequeños obstáculos en el campo.

Al igual que el juego de Nokia, tu serpiente crece cuando llegas a la fruta y si chocas contra ti mismo, otra serpiente o la pared mueren. El juego se ejecuta con un retraso de 30 ms entre movimientos y el servidor envía el nuevo estado del juego cada 50 ms que el código debe analizar y qué no, y generar el siguiente movimiento.

El ganador es la serpiente que tuvo la mayor longitud en cualquier momento del juego. Los desempates se deciden por asesinatos.

Hasta ahora, lo que he hecho es implementar una búsqueda de gráfico A * de cada serpiente para determinar si mi serpiente es la más cercana a la manzana y si lo es, va por la manzana. De lo contrario, hice un pequeño algoritmo para determinar el área más vacía del tablero, a la que va mi serpiente, para anticipar la próxima manzana.

Aparte de esto, tengo algunas pequeñas comprobaciones de supervivencia para asegurarme de que mi serpiente no esté entrando en una trampa que no puede salir y si se atasca, tengo algo para darle una mejor oportunidad de salir.

...

De todos modos, he probado mi serpiente en un servidor de prueba y funciona bastante bien. En general, mi estrategia de ir solo por la manzana cuando es algo seguro y encontrar espacio cuando no lo hace, crece más rápido que cualquier otra serpiente (algunas serpientes hacen algo similar pero a menudo solo van al medio o una esquina) a veces gana estos juegos de prueba, pero la mayoría de las veces es vencida por la misma serpiente que parece tener ventaja en la supervivencia (mi serpiente crece más rápido pero luego muere de alguna manera y esta otra serpiente avanza lentamente y gana en consistencia.

Así que me preguntaba sobre cualquier idea que alguien tenga para probar y mejorar mi serpiente. O tal vez ideas para adoptar un nuevo enfoque. Mis funciones y clases son buenas, por lo que los cambios que pueden parecer drásticos no deberían ser tan malos. Animo todas las ideas.

¿Alguna idea?

Rawb
fuente

Respuestas:

5

Una buena estrategia defensiva podría ser hacer una forma perfecta (de modo que su cabeza y su parte trasera estén siempre a 1 espacio de distancia entre sí, y haga un cuadrado completo o lo que sea posible formar a su longitud dada), esto lo haría más o menos inmortal ya que ninguna serpiente podría entrar en su área cerrada y nunca se topará con usted mismo (a menos que una manzana engendre de alguna manera en su boca, pero me imagino que eso es imposible si no hay espacio).

Esto haría que si la manzana realmente apareciera en su área cerrada, podría estar programado para que no lo haga y las otras serpientes probablemente mueran tratando de obtenerla, luego, después de un tiempo, podría obtenerla de tal manera que haga la transición. volver a su forma lo mejor posible (podría ser un algoritmo un poco complicado pero parece factible)

Cuando ir por manzanas solo dependería de qué tan lejos estén, tal vez si eres el más cercano por un buen margen podrías ir por él, pero de lo contrario mantente conservador, difícil de decir probablemente necesitaría ajustarlo en base a prueba y error , pero creo que sería una buena estrategia.

Kevin DiTraglia
fuente
1
Básicamente, su "serpiente" debería "tortuga". xD +1 buena idea.
Cypher
Bueno uno Pero hay obstáculos en el tablero. Entonces, otros programadores de serpientes deben haber hecho sus serpientes para verificar si hay una obstrucción (ya sea una pared u otra serpiente que encierra la manzana). Puede que no vengan y simplemente mueran. Una cosa que se puede hacer para evitar este problema es tener un espacio considerable entre la cabeza y la cola.
Shashwat
hmm idea interesante, creo que podría implementar algo como esto para cuando mi serpiente esté dando vueltas esperando que la próxima manzana se reproduzca ... jaja, estoy un poco preocupado por la aparición de la manzana en mi boca, aunque eso resultaría en cierta muerte y estos juegos a menudo se deciden por una muerte prematura
Rawb
@Ronald En realidad, si detecta el desove de manzanas en la boca, podría girar hacia adentro y hacia atrás y continuar, ya que la IA tiene un reflejo perfecto, en realidad debería ser fácil de remediar (e incluso podría arreglarse) en función de cómo lo implemente.
Kevin DiTraglia
0

La serpiente debe adaptar su estrategia a su longitud actual.

Una serpiente muy larga puede usar su cuerpo para cercar a los oponentes. Esto significa que debe hacer un sello con una pared.

Si la serpiente viaja hacia el este, con una manzana al noreste, debe viajar hasta la pared antes de girar hacia el norte, por lo que las posibles rutas para otras serpientes están muy limitadas.

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

Esta serpiente con cabeza C, debe girar hacia el norte en e9, no en e8, para que cualquier oponente debajo de él quede atrapado y no pueda comer ninguna manzana que se genere por encima de la línea 'e'.

Cuanto más grande sea el área que pueda cortar y cuanto más tiempo pueda sostenerla, mejor.

Bram
fuente