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.
Respuestas:
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.
fuente
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
¿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.
fuente
sin(cos(tan(x)))
?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:
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.
fuente
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:
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".
fuente
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.
fuente
Aquí hay una lista de algunas opciones, algunas de las cuales ya se han cubierto:
fuente
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.
fuente