algorithm artificial-intelligence pong

algorithm - Pong: ¿Cómo sabe la paleta dónde golpeará la pelota?



artificial-intelligence (7)

Después de implementar Pacman y Snake, estoy implementando el próximo juego muy clásico: Pong.

La implementación es realmente simple, pero solo me queda un pequeño problema. Cuando una de las paletas (no estoy seguro de si se llama paleta) está controlada por la computadora, tengo problemas para colocarla en la posición correcta.

La bola tiene una posición actual, una velocidad (que por ahora es constante) y un ángulo de dirección. Así que podría calcular la posición en la que golpeará el lado de la paleta controlada por computadora. Y así podría colocar la paleta allí mismo. Pero sin embargo, en el juego real, existe la posibilidad de que la paleta de la computadora pierda el balón. ¿Cómo puedo implementar esta probabilidad?

Si solo uso una probabilidad de digamos 0.5 que la paleta de la computadora golpeará la pelota, el problema está resuelto, pero creo que no es tan simple.

Desde el juego original, creo que la probabilidad depende de la distancia entre la posición actual de la paleta y la posición en que la pelota golpeará el borde.

¿Alguien tiene alguna sugerencia de cómo se calcula esto exactamente?


Citando el libro muy divertido "Racing the Beam" (Google Books: http://books.google.co.uk/books?id=DqePfdz_x6gC&lpg=PP1&dq=racing%20the%20beam&pg=PA40#v=onepage&q&f=false ) La técnica original fue:

Para ayudar a simular el error humano inherente al posicionamiento preciso de la paleta, la paleta AI omite su ajuste cada ocho cuadros. El comportamiento resultante es visiblemente imperceptible, pero permite que el objetivo del jugador de computadora se desvíe lo suficiente como para que ocasionalmente pierda el balón. También es técnicamente trivial de implementar, ya que requiere solo una máscara y la operación binaria AND, para lo cual existe una instrucción 6502 correspondiente. El programador puede probar si el resultado es cero con otro código de operación único, bifurcarse si es necesario para omitir las instrucciones que mueven la paleta.

Incluso este comportamiento debe modificarse ligeramente para que el juego funcione. Si el jugador de la IA simplemente dejara de rastrear la bola cada ocho cuadros, se perdería la sincronización en unos pocos segundos. Para evitar esto, la IA sigue un esquema secundario de seguimiento de la pelota cerca de la parte superior e inferior del campo de juego. Si la bola choca con una de estas paredes mientras la paleta también está alineada con ella, la paleta se reajusta, recuperándose de cualquier deriva que se haya acumulado desde la última vez que la bola golpeó la pared. El resultado es una desalineación y realineación estocástica de la paleta y la pelota de la computadora.


Creo que debería hacer que la paleta siempre se mueva desde su posición actual a un punto específico, que es donde se espera que la bola se alinee verticalmente con la paleta. Luego, podría tener un 50% de probabilidad de que la paleta se mueva a este punto exacto y desvíe la pelota, un 25% de probabilidad de que se sobrepase, quizás por algunos X píxeles, y un 25% de probabilidad de que no alcance el tamaño adecuado. Una forma aún mejor de hacerlo es hacer que se mueva a esa posición en una curva de campana para que se pierda en diferentes cantidades cada vez.


Da la casualidad de que escribí un clon de pong el otro día solo por diversión.

Puedes jugarlo here y ver el código fuente here .

La IA toma la velocidad actual de la pelota y multiplica la distancia x de la pared. Luego se mueve hacia esa posición calculada a una velocidad limitada. No tiene en cuenta los rebotes verticales, pero eso es algo intencionado (para hacer que la IA sea superable).

Aquí está el fragmento relevante:

/* Update enemy based on simple AI */ enemy.update = function (delta) { var impactDistance, impactTime, targetY, speed; speed = .25; // a little slower than the human player if (ball.vx < 0) { // Ball is moving away, AI takes a nap .. return; } // Figure out linear trajectory .. impactDistance = width - ball.width - ball.x; impactTime = impactDistance / (ball.vx * .25 * 1000); targetY = ball.y + (ball.vy * .25 * 1000) * impactTime; if (Math.abs(targetY - (this.y + this.height/2)) < 10) { // AI doesn''t need to move return; } if (targetY < this.y + (this.height / 2)) { // Move up if ball is going above paddle speed = -speed; } this.y += speed * delta; this.keepInBounds(); };


No estoy seguro de cuál es la forma "oficial" de hacer esto, pero siempre lo he usado (pseudocódigo)

if (ball is above paddle) { move paddle up } if (ball is below paddle) { move paddle down }

Luego le di a la paleta una velocidad ligeramente variable que era lo suficientemente lenta para que no siempre pudiera seguir el ritmo de la pelota. Tipo de crudo, pero funciona.

Este hilo también tiene algunas ideas interesantes que podría querer ver: http://www.gamedev.net/community/forums/topic.asp?topic_id=439576


Otras respuestas discuten cómo decidir la dirección correcta para moverse en diferentes circunstancias. También puede agregar un tiempo de retraso antes de que el jugador de la computadora "reaccione" al comenzar a moverse en esta dirección, lo que refleja la respuesta típica de los jugadores humanos.


después de varias iteraciones, si su paleta (que es suya o la de AI según su perspectiva) está demasiado cerca de la parte superior o inferior de la pantalla, es simplemente imposible cubrir la distancia requerida. La paleta puede simplemente seguir el valor de y de la pelota. Si estás demasiado lejos te lo perderás.

Alternativamente, puedes hacer que la IA se restablezca al centro después de cada golpe, o viajar hacia el centro siempre que la bola se aleje (es decir, hacia el oponente)

O más brevemente:
- muévase hacia el centro mientras la pelota se aleja - imite la coordenada y de la pelota mientras se está acercando.

desde aquí puede cambiar la dificultad haciendo que el mecanismo de imitación de coordenada y sea más lento que la pelota (más consistente y probablemente lo que era la implementación original; las dificultades se resumen en coeficientes de velocidad simple), o agregando un error aleatorio a cada movimiento o de otra manera.


Hicimos un (pseudo-) juego de ping-pong en 3D para nuestra clase de CS de preparatoria. Lo que hicimos fue hacer que la computadora siempre moviera la paleta hacia la pelota, pero con una velocidad máxima, de esa manera, podría perder la pelota si está demasiado lejos, pero aún así es inteligente. ¿Esto ayuda?