2011-01-02 16 views
24

Después de implementar Pacman and Snake, estoy implementando el siguiente juego muy clásico: Pong.Pong: ¿Cómo sabe la paleta dónde golpeará la pelota?

La implementación es realmente simple, pero 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 golpeará el lado de la paleta controlada por computadora. Y entonces podría colocar la paleta allí mismo. Pero, sin embargo, en el juego real, hay una probabilidad de que la paleta de la computadora pierda la pelota. ¿Cómo puedo implementar esta probabilidad?

Si uso solo 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 tocará el borde.

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

Respuesta

20

Hicimos un (pseudo-) juego de ping-pong en 3D para nuestra clase de CS de la escuela secundaria. 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 perderse la pelota si está demasiado lejos, pero sigue siendo inteligente. ¿Esto ayuda?

+5

Así es como el Pong original, trabajó, creo. – Lucas

+0

¡Whoa! No sabía eso. ¡Guay! :) – Mehrdad

+2

Cuando estaba en la universidad, lo hicimos estableciendo el centro de la paleta para igualar el centro de la pelota (menos el radio). Era imposible que la computadora fallara. –

5

Creo que debería hacer que la paleta se mueva siempre 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 unos X píxeles, y un 25% de probabilidad de que rebase el límite. Una forma aún mejor de hacerlo podría ser que se mueva a esa posición en una curva de campana para que falle en diferentes cantidades cada vez.

2

Después de varias iteraciones, si su paddle (que es la 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 simplemente puede seguir el valor y de la pelota. Si estás demasiado lejos, te perderás.

Como alternativa, puede hacer que el restablecimiento de AI para centrar después de cada golpe, o viajar hacia el centro, siempre y cuando la pelota se está alejando (es decir, hacia el oponente)

O más brevemente:
- avanzar hacia el centro mientras la bola 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 pelota (más consistente y probablemente como fue la implementación original, ya que las dificultades se abstraen en coeficientes de velocidad simples) o agregando un error aleatorio a cada movimiento o de lo contrario.

4

no estoy seguro de cuál es la forma 'oficial' para hacer esto es, pero Siempre he utilizado (pseudocódigo)

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

Entonces me di la paleta una velocidad que varía ligeramente de que era lo suficientemente lenta que no siempre puede mantenerse al ritmo de la pelota. Es un poco crudo, pero funciona.

Este hilo también tiene algunas ideas interesantes que usted puede ser que desee mirar: http://www.gamedev.net/community/forums/topic.asp?topic_id=439576

4

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

29

Citando el libro muy agradable "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:

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

Incluso este comportamiento se debe modificar ligeramente para que el juego funcione en absoluto. Si el jugador AI simplemente dejara de seguir la pelota cada ocho fotogramas, estaría irremediablemente fuera de 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 pelota colisiona 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 que la pelota golpeó la pared por última vez. El resultado es una desalineación estocástica y una realineación de la paleta y la bola de la computadora.

4

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

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

AI 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 máxima. No tiene en cuenta los rebotes verticales, pero eso es una especie de intención (para hacer que la IA sea derrotable).

Aquí es 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(); 
}; 
+0

Gracias. Parece que soy un jugador de pong muy pobre. Perdí 1:10;) Tal vez porque se sentía muy extraño que la computadora esté en el lado derecho y no en el humano;) – RoflcoptrException

Cuestiones relacionadas