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


Después de implementar Pacman y Snake estoy implementando el siguiente juego muy 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) es 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 donde va a golpear el lado de la paleta controlada por ordenador. Y así podría posicionar la paleta justo ahí. Pero sin embargo en el juego real, hay una probabilidad de que la paleta de la computadora se pierda la pelota. ¿Cómo puedo implementar esta probabilidad?

Si solo utilizo 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 paleta actual posición y la posición de la bola golpeará el borde.

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

Author: Mehrdad, 2011-01-02

7 answers

Hicimos un (pseudo-)juego de ping-pong 3D para nuestra clase de CS de la escuela secundaria. Lo que hicimos fue hacer que la computadora siempre moviera la pala hacia la pelota, pero con una velocidad máxima could de esa manera, podría fallar la pelota si está demasiado lejos, pero sigue siendo inteligente. ¿Esto ayuda?

 20
Author: Mehrdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-02 09:29:32

Citando el muy agradable libro "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 fotogramas. El comportamiento resultante es visiblemente imperceptible, pero permite que el objetivo del jugador de la computadora se desvíe lo suficiente como para que ocasionalmente falla la pelota. También es técnicamente trivial de implementar, requiriendo solo una sola máscara y el binario Y la operación, para lo cual existe una instrucción 6502 correspondiente. El programador puede probar si el resultado es cero con otro opcode único, ramificando 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 IA simplemente dejara de rastrear el balón cada ocho fotogramas, sería irremediablemente fuera de sincronización en unos segundos. Para evitar esto, la IA sigue un esquema secundario de seguimiento del balón cerca de la parte superior e inferior del campo de juego. Si la pelota choca con una de estas paredes mientras la pala también está alineada con ella, la pala se reajusta, recuperándose de cualquier deriva que se haya acumulado desde la última vez que la pelota golpeó la pared. El resultado es una desalineación estocástica y realineación de la paleta y la bola de la computadora.

 29
Author: James Greenhalgh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-02 12:12:27

Creo que debería hacer que la paleta siempre se mueva desde su posición actual a un punto específico, que sería donde se espera que la bola se alinee verticalmente con la paleta. Entonces podrías 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, tal vez por algunos píxeles X, y un 25% de probabilidad de que se subestime. Una manera aún mejor de hacerlo podría ser hacer que se mueva a esa posición en una curva de campana para que se pierda por cantidades diferentes cada vez.

 5
Author: cjroth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-02 09:24:42

No estoy seguro de cuál es la forma' oficial ' de hacer esto, pero siempre 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 como para que no siempre pudiera mantenerse al día con la pelota. Un poco crudo, pero funciona.

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

 4
Author: Keysmack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-02 09:35:41

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

 4
Author: j_random_hacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-02 09:48:50

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

Usted puede jugar aquí y ver el código fuente aquí.

La IA toma la velocidad actual de la bola 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 una especie de intención (para hacer que la IA sea derrotable).

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();
};
 4
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-02 15:34:38

Después de varias iteraciones, si su paleta (que es la suya o la IA, dependiendo de su perspectiva) está demasiado cerca de la parte superior o inferior de la pantalla, es simplemente imposible cubrir la distancia requerida. La paleta puede seguir fácilmente el valor y de la pelota. Si estás demasiado lejos, fallarás.

Alternativamente, puede hacer que la IA se restablezca al centro después de cada golpe, o viajar hacia el centro siempre que la pelota se esté alejando (es decir, hacia el oponente)

O más brevemente:
- muévete hacia el centro mientras la pelota se aleja - imita la coordenada y de la bola mientras se acerca.

Desde aquí puede cambiar la dificultad haciendo que el mecanismo de imitación de y-coord sea más lento que la bola (más consistente, y probablemente como era la implementación original; ya que las dificultades se resumen en coeficientes de velocidad simples), o agregando errores aleatorios a cada movimiento o de otra manera.

 2
Author: sova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-02 09:35:37