Imperfecto pong AI

19

Así que estoy empezando a aprender Java y algo de OpenGL mientras uso el LWJGL. Para empezar, estoy escribiendo un clon del Atari Pong. Configuré correctamente la pantalla del juego, la detección de colisión, y todo el juego funciona principalmente, en realidad, si se tratara de un juego de 2 jugadores, ya estaría terminado, pero como planeo hacer este juego para un solo jugador , Tengo que encontrar una IA simple para controlar al segundo jugador.

Saber dónde golpeará la pelota parece bastante trivial, y crear una IA que siempre golpee la pelota parece algo fácil de hacer, pero quiero que se pueda ganar el juego, por lo que no siempre puedo hacer que el IA golpee la pelota. pelota.

Así que aquí está mi pregunta, ¿cómo debo codificar esto para agregar imperfecciones similares a las humanas a la IA? ¿Debo decidir al azar si la IA fallará en un punto dado? ¿O hay algo más inteligente (o quizás obvio) que me estoy perdiendo aquí?

Muchas gracias.

Setzer22
fuente
55
Bueno, en general, haces que el bate AI solo se mueva a una velocidad determinada, por lo que si la pelota está bien colocada por el jugador, la IA no puede alcanzarla ...
44
Comenzaría limitando la velocidad a la que la IA puede mover la paleta, y / o construyendo en un retraso aleatorio (corto) antes de que la IA comience a responder a un golpe.
44
@ byte56 Realmente no lo llamaría un engaño de esa pregunta. Se siente como el ejemplo dado aquí blog.stackoverflow.com/2011/01/… bajo "Si va a cerrar la pregunta de un usuario como un duplicado, tiene que ser un duplicado real". Esa pregunta es un buen recurso (y alguien probablemente podría usar esa pregunta para derivar una respuesta ellos mismos dado el contenido allí), pero no responde realmente los detalles de esta pregunta, no creo.
Tetrad
1
@Tetrad Creo que las respuestas terminan siendo muy similares, pero tienes razón, las preguntas son diferentes. Creo que esta pregunta es una especie de versión más específica de la pregunta vinculada. Si el OP hubiera visto al otro primero, no estoy seguro de si esta pregunta se hubiera hecho. Cuando voté, estaba indeciso, así que voté por la pregunta y las respuestas y voté por duplicado. Podría ir de cualquier manera para mí.
MichaelHouse

Respuestas:

20

Mi IA imperfecta de pong favorita es brutalmente simple, pero permite hacer una falla de IA bastante agradable.

Bola invisible AI

Configuración de AI : cuando la pelota se refleja en tu pala, sabes dónde está y qué tan rápido va. Genera una bola invisible en ese punto pero a una mayor velocidad. Terminará donde va la bola visible. Cada cuadro, haga que la IA se mueva hacia la ubicación de la bola invisible. Detén la bola invisible una vez que llegue al lado de la IA, así es donde la IA debe mover su paleta.

Resultados : Parece que la IA está tratando de predecir el camino de la pelota. Digamos que el jugador ha reflejado la pelota en un ángulo pronunciado para que rebote en una pared. La IA rastreará la pelota hacia abajo un poco, y luego, al ser más lenta que la pelota, no podrá rastrearla lo suficientemente rápido. Has engañado a la IA, y parece bastante lógico desde el punto de vista humano. Puedes ver la computadora tratando de predecir dónde irá la pelota, y luego, oh, falló, fue demasiado lenta y has ganado un punto.

Esto es significativamente mejor que insertar aleatoriedad, ya que hace que la IA parezca relativamente inteligente. Un digno oponente. También permite que la IA juegue exactamente con las mismas reglas que el humano, lo que se ve mejor para el jugador y facilita su trabajo.

Configuraciones : también puedes ajustar la velocidad de la bola invisible, ya que eso determinará qué tan lejos planeará la IA. Cuanto más rápida sea la bola invisible, más tiempo tendrá que moverse la paleta para bloquear y mejor tendrá que apuntar el jugador.

DDR
fuente
Todas las respuestas dadas proporcionaron información realmente buena, pero como tuve que marcar una para ser la respuesta correcta, elegí esta ya que realmente me gusta su enfoque. Esto, combinado con algunas otras cosas dijo en otras respuestas (como jugar con el tiempo de reacción) podría conseguir una muy similar a la humana AI, y con una dificultad ajustable fácil
Setzer22
Esto funcionó perfectamente para mi configuración porque tengo ángulos variables, velocidad y aceleración basados ​​en ciertos movimientos especiales, por lo que la pelota puede estar potencialmente en todo el lugar. La IA estaba adquiriendo propiedad, pero ahora es mucho mejor. Puedo ver por qué este método no es el mejor para la velocidad bloqueada y los ángulos de 45 grados, pero ese no es mi juego en absoluto.
jackrugile
1
Si bien me gusta este enfoque, tuve problemas con mi implementación. El problema es que, dado que la bola trazadora se mueve más rápido que la bola que representa, podría perderse algunas colisiones que sucederán con la bola que representa. La razón es, por supuesto, que la bola trazadora se moverá una mayor distancia entre cuadros.
Wolfgang Schreurs el
Si desea una mayor fidelidad, puede volver a calcular la posición de la bola trazadora dos veces por cuadro y reducir a la mitad la velocidad para cada cálculo.
DDR
22

Los juegos de Pong que he jugado parecen comportarse de la siguiente manera: la paleta controlada por IA sabe dónde golpeará la pelota, pero está limitada en la rapidez con que puede alcanzar esa posición. Entonces a veces se pierde. Creo que esta es la forma más obvia de hacerlo.


fuente
Esta. No ayuda a la IA a saber dónde golpeará la pelota si solo puede moverse, digamos, 3px por cuadro y tiene que moverse de arriba hacia abajo.
KeithS
14

¿Cuando creé un clon casi tan pacífico en mi TI83? calculadora, el mayor problema con el que me encontré fue que los "fantasmas" eran demasiado rápidos. Tuve que frenarlos de alguna manera. Entonces, puse un gran pecado viejo (cos (tan (coordenada x))) allí. Los niveles más fáciles harían ese cálculo varias veces, y los niveles más difíciles solo harían una de las operaciones.

El punto es, TIEMPO DE REACCIÓN. Investigue cuál es el tiempo de reacción humano típico y agregue 10 ms. Use eso como punto de partida. A medida que los niveles se vuelven más difíciles, elimine el tiempo del tiempo de reacción ... que puede ser simple Thread.sleep(time);para la IA. Espere ese tiempo antes de que la IA comience a moverse.

También puede controlar qué tan rápido se mueve la paleta o, si REALMENTE desea complicarse, determinar dónde se basará la pelota en función de diversos grados de información ... digamos solo 2 píxeles en lugar de un vector. Agregue modificadores de ángulo a las paredes para agregar un grado de aleatoriedad, lo que obligará a la IA a volver a calcular.

Russell Uhl
fuente
2
¿Podría explicar por qué exactamente lo usó sin(cos(tan(x)))?
nullpotent
55
porque era joven, estúpido y en un TI83, sin (cos (tan (x))) creó una buena unidad de retraso en la IA. También porque, que yo sepa, la calculadora no tenía un comando de espera que pudiera usar milisegundos. Quizás algo de claridad: no utilicé el ensamblado o el micro script ni el lenguaje que pueda compilar para ejecutar esas cosas. Usé el código de programación en el firmware (el botón prgm). Tenía MÁXIMO 8 líneas de código en la pantalla en cualquier momento. No podía recordar nada más complicado por un tiempo de retraso.
Russell Uhl
2
Aprendí a programar en el código del firmware de la TI83. Luego tuve que volver a aprender la programación estructurada en C ++. Diría que la TI83 me enseñó qué es el código de cadena de espagueti y por qué es malo. No he usado una declaración goto desde entonces. Buenos tiempos sin embargo.
ContextSwitch
2
oh buen señor, los gotos. Reviso el código de vez en cuando ... y me rindo rápidamente. No tengo idea de cómo logré programar esto durante un período de semanas durante mis clases de matemáticas.
Russell Uhl
1
No es necesario que te pongas a la defensiva sobre tu retraso de trigonometría. La matemática de punto flotante en un bucle era una forma común de hacer una pausa en los programas escritos hace varias décadas y el rendimiento / las capacidades de sus calculadoras están en línea con una computadora de principios de los 80.
Dan Neely
6

Si simplemente reduce la velocidad de la paleta, cada vez que golpea la pelota en un ángulo agudo (es decir, se mueve hacia arriba y hacia abajo mucho en lugar de ir directamente al otro lado), la computadora casi siempre falla porque la pelota se mueve hacia arriba / abajo más rápido de lo que la pala puede compensar.

En cambio, lo que haría sería jugar con la velocidad de la pala y el punto en el que la IA reacciona. Por ejemplo:

  • cuando el usuario golpea la pelota
    • la IA puede reaccionar de inmediato e ir a donde estará la pelota. Si es lo suficientemente rápido, llegará a tiempo
  • cuando la pelota cruza el centro del campo
    • la IA debe esperar hasta que cruce el centro del campo antes de reaccionar

Otra cosa a cambiar es cómo reacciona la IA. Has resaltado una estrategia en la que la paleta siempre se mueve a la posición donde estará la pelota. Una persona no siempre puede hacer eso. Es más probable que sigan la pelota hacia arriba y hacia abajo, sin saber exactamente dónde estará la pelota cuando llegue a ellos debido a todos los rebotes.

Por lo tanto, un ser más humano método de reacción es moverse siempre hacia la pelota. Por ejemplo, si la pelota se mueve hacia arriba, entonces la pala se mueve hacia arriba. Si la pala es lo suficientemente rápida, puede reaccionar a los rebotes de la parte superior e inferior. Si la pala no es lo suficientemente rápida, entonces se compensará en exceso al moverse hacia arriba cuando la pelota se mueve hacia arriba, pero luego, cuando rebota, la pala puede no ser capaz de moverse lo suficientemente rápido.

Por último, también puedes jugar con el tamaño de la paleta para aumentar / disminuir la dificultad.

Trenin
fuente
2

Un factor a considerar es la aleatoriedad: los jugadores humanos siempre tienen algún grado de variación en su juego, por lo que si quieres que tu IA parezca humana, también querrás tener alguna variación en su juego.

Puede configurar rangos para:

  • Tiempo de reacción (qué tan rápido comienza a moverse la IA)
  • Velocidad (qué tan rápido la IA mueve la pala)
  • Precisión (qué tan cerca estará la IA de donde realmente quiere mover su paleta, dando la oportunidad de sublimar o rebasar donde quiere estar)

Luego, en cada golpe del oponente, la IA puede elegir un valor dentro de esos rangos y tomar sus decisiones (y movimientos) en función de eso. Para oponentes de IA más fáciles, puedes hacer que esos rangos sean bastante pobres, pero también tienen amplios rangos para darle a la IA algunos "golpes de suerte". Para oponentes más difíciles, puedes ajustar esos rangos y ponerlos a todos en el rango "bueno".

Blobinador
fuente
2

Voy a sugerir una solución más general que no es específica solo para pong. Creo que esto podría aplicarse a cualquier juego, no solo al pong. Quieres un comportamiento humano, ¿verdad? Para que un humano pueda sentir que está jugando a ser humano ... y por lo tanto, por extensión, espero ganar. ¿Entonces, Qué haces?

¡Observa a un humano! ¿Cómo puede un jugador perder en el pong? Bueno, si vemos dos jugadores de pong es bastante obvio. Por lo general, la pérdida se debe a que la pelota es simplemente demasiado rápida y el tiempo de reacción de los jugadores se retrasó. Esos son dos parámetros, uno de los cuales es ajustable. La otra es la capacidad de los jugadores de presionar en la dirección correcta. Por lo tanto, tiene una frecuencia de error y una frecuencia de reacción; ambas se pueden ajustar según la dificultad.

Una IA fácil tendría un mayor retraso de entrada y una mayor tendencia a cometer errores aleatorios, donde, como una IA más difícil, se sintonizaría para tener estos parámetros orientados a ser difíciles.

Esto se puede aplicar a casi cualquier juego, incluso uno como el tic tac toe o incluso modelos más complejos. Este enfoque se descompone en escenarios más complicados, pero es lo suficientemente suficiente donde los juegos en los que el número de parámetros y el alcance es limitado.

Vaughan Hilts
fuente
1

Aquí hay una lista de algunas opciones, algunas de las cuales ya se han cubierto:

  • Haga que los jugadores de computadora más inteligentes apunten la pelota para que sea más difícil de alcanzar con muchos rebotes, y haga lo contrario para los oponentes fáciles.
  • Un jugador inteligente moverá su paleta hacia el medio mientras la pelota está en camino hacia el oponente y no sabe a dónde volverá.
  • Antes del rebote final es más difícil para un humano predecir dónde terminará la pelota. Haz que la IA tenga una imprecisión similar.
  • Limite la velocidad de la pala para que sea más lenta que la pelota. Se necesita menos de la mitad de la velocidad vertical para fallar con un juego perfecto.
  • Aumenta la velocidad de la pelota según la dificultad, la duración del partido, etc.
  • Los humanos no reaccionan instantáneamente. Los jugadores de IA tampoco deberían hacerlo.
  • Dale a la IA una oportunidad aleatoria de cometer un error y perder la pelota.
Adán
fuente
0

También hice un pequeño clon de Pong (en LUA).

Mi IA es muy simple pero no es tan mala, en mi humilde opinión.

Solo verifico la posición y de la pelota y, si está más abajo, muevo la pala hacia abajo, si estoy más arriba, muevo la pala hacia arriba.

Luego, para afinar la dificultad, aumento o disminuyo la distancia desde la pelota desde la cual la paleta de la computadora comienza a moverse.

Pitto
fuente