¿algo imposible? fallo con mi IA para un pong

Resuelve tus dudas sobre emulación y reconstrucción
User avatar
Chacal
Usuario habitual
Posts: 20
Joined: Sun Dec 31, 2006 2:15 pm
Location: Los Barrios

¿algo imposible? fallo con mi IA para un pong

Postby Chacal » Sun Feb 18, 2007 6:32 pm

¿Os ha pasado alguna vez que algo que no teneis programado y que pensais que para que ocurra debeis de escribirlo a conciencia, y sin embargo, ocurre? pues eso me ocurre a mi con una IA para un jueguecillo que casi tengo terminado (excepto por la parte grafica :P) un Pong. El caso es que programo un sencillo metodo para que la CPU mueva su raqueta, segun donde se encuentre la bola situada en "y", se asignara una velocidad positiva para bajar, negativa para subir, o "0" para pararse. Codigo:

Code: Select all

//--Inteligencia artificial de CPU if(eJuego.modo == MOD_JUGVSCPU)//Si estamos en modo contra cpu { if(sBola.y > sPaddle2.y + bPaddle->h && sBola.x + bBola->w > SCREEN_W/3) { sPaddle2.vy = 2; } if(sBola.y < sPaddle2.y && sBola.x + bBola->w > SCREEN_W/3) { sPaddle2.vy = -2; } if(sBola.y > sPaddle2.y && sBola.y < sPaddle2.y + bPaddle->h && sBola.x + bBola->w > SCREEN_W/3) { sPaddle2.vy = 0; } }
entonces, es lo que deberia de hacer, sin embargo, si lo hace, pero en cuanto a la velocidad, parece como si yo hubiese programado que cuando la CPU no pueda llegar a cojerla, esta aumentara la velocidad de su raqueta para alcanzarlo y eso no es lo que programe ni lo quiero. ¿Como es posible que esto ocurra? ya he mirado yo que se cuantas veces este codigo, y no veo nada del por que puede estar ocurriendo esto, lo he posteado en 2 foros de esta tematica y no han sabido aun darme solución.
Este es el procedimiento logico del juego, fuera de esta funcion no se manipula para nada el movimiento de las raquetas ni de la bola:

Code: Select all

void logica() { if(eJuego.j1puntos == 10 || eJuego.j2puntos == 10) { if(key[KEY_ENTER])eJuego.estado = EST_TERMINANDO; return; } if(eJuego.estado == EST_ESPERANDO_RESPUESTA) { if(key[KEY_SPACE]) { sBola.vx = -4; sBola.vy = 0; eJuego.estado = EST_JUGANDO; } } if(eJuego.estado == EST_PUNTO_J1) { if(key[KEY_ENTER]) { eJuego.estado = EST_JUGANDO; sBola.vx = -4; sBola.vy = 0; } } if(eJuego.estado == EST_PUNTO_J2) { if(key[KEY_ENTER]) { eJuego.estado = EST_JUGANDO; sBola.vx = 4; sBola.vy = 0; } } //Recojer pulsaciones de teclado y ajustar la velocidad segun cada caso if(key[KEY_W]) sPaddle1.vy = -2; if(key[KEY_S]) sPaddle1.vy = 2; if(eJuego.modo == MOD_DOSJUG) { if(key[KEY_O]) sPaddle2.vy = -2; if(key[KEY_L]) sPaddle2.vy = 2; } //INTELIGENCIA ARTIFICIAL DE CPU if(eJuego.modo == MOD_JUGVSCPU)//Si estamos en modo contra cpu { if((sBola.y > (sPaddle2.y + bPaddle->h)) && ((sBola.x + bBola->w) > SCREEN_W/3)) { sPaddle2.vy = 2; } else if((sBola.y < sPaddle2.y) && ((sBola.x + bBola->w) > SCREEN_W/3)) { sPaddle2.vy = -2; } else if((sBola.y > sPaddle2.y) && (sBola.y < (sPaddle2.y + bPaddle->h)) && ((sBola.x + bBola->w) > SCREEN_W/3)) { sPaddle2.vy = 0; } } //Crear Movimiento //-Calcular vx y vy //--Para los Paddles(Raquetas) if(sPaddle1.y > (SCREEN_H - bPaddle->h) || sPaddle1.y < 0){ if(sPaddle1.y > (SCREEN_H - bPaddle->h)) { if(sPaddle1.vy == 2) sPaddle1.vy = 0; } if(sPaddle1.y < 0) { if(sPaddle1.vy == -2) sPaddle1.vy = 0; } } if(sPaddle2.y > (SCREEN_H - bPaddle->h) && sPaddle2.y < 0){ if(sPaddle2.y > (SCREEN_H - bPaddle->h)) { if(sPaddle2.vy == 2) sPaddle2.vy = 0; } if(sPaddle1.y < 0) { if(sPaddle2.vy == -2) sPaddle2.vy = 0; } } //--Para la bola //--bola--eje x if(sBola.x >= SCREEN_W) { eJuego.j2puntos = eJuego.j2puntos + 1; eJuego.estado = EST_PUNTO_J1; nuevo_saque(); } if(sBola.x + bBola->w <= 0) { eJuego.j1puntos = eJuego.j1puntos + 1; eJuego.estado = EST_PUNTO_J2; nuevo_saque(); } //--bola--eje y if(sBola.y >= SCREEN_H - bBola->h) { sBola.vy = sBola.vy * -1; } if(sBola.y <= 0) { sBola.vy = sBola.vy * -1; } //COLISIONES //-Choque bola con Paddle 1 if(sBola.x >= sPaddle1.x && sBola.x <= sPaddle1.x + bPaddle->w && sBola.y + bBola->h >= sPaddle1.y && sBola.y <= sPaddle1.y + bPaddle->h) { if(sBola.toque == 0) { sBola.vx = sBola.vx * -1; if(sBola.y + bBola->h >= sPaddle1.y && sBola.y <= sPaddle1.y + (bPaddle->h/3)) { sBola.vy = -1; } if(sBola.y + bBola->h >= sPaddle1.y + (bPaddle->h/3) && sBola.y <= sPaddle1.y + 2*(bPaddle->h)) { sBola.vy = 0; } if(sBola.y + bBola->h >= sPaddle1.y + 2*(bPaddle->h/3) && sBola.y <= sPaddle1.y + bPaddle->h) { sBola.vy = 1; } sBola.toque = 1; } } else{ sBola.toque = 0; } //-Choque bola con Paddle 2 if(sBola.x + bBola->w >= sPaddle2.x && sBola.x <= sPaddle2.x + bPaddle->w && sBola.y + bBola->h >= sPaddle2.y && sBola.y <= sPaddle2.y + bPaddle->h) { if(sBola.toque == 0) { sBola.vx = sBola.vx * -1; if(sBola.y + bBola->h >= sPaddle2.y && sBola.y <= sPaddle2.y + (bPaddle->h/3)) { sBola.vy = -1; } if(sBola.y + bBola->h >= sPaddle2.y + (bPaddle->h/3) && sBola.y <= sPaddle2.y + 2*(bPaddle->h)) { sBola.vy = 0; } if(sBola.y + bBola->h >= sPaddle2.y + 2*(bPaddle->h/3) && sBola.y <= sPaddle2.y + bPaddle->h) { sBola.vy = 1; } sBola.toque = 1; } } else{ sBola.toque = 0; } //-Aplicar la velocidad a la posicion // Movemos la pelota con la velocidades vx y vy calculadas sBola.y = sBola.y + sBola.vy; sBola.x = sBola.x + sBola.vx; //--Para las raquetas if(sPaddle2.vy > 2) sPaddle2.vy = 2; if(sPaddle2.vy < -2) sPaddle2.vy = -2; sPaddle1.y = sPaddle1.y + sPaddle1.vy; sPaddle2.y = sPaddle2.y + sPaddle2.vy; //Reestableciendo el dato de velocidad una vez movidas las raquetas /* Esto hace que al soltar los botones de direccion de las raquetas, las raquetas se paren, de lo contrario la velocidad segura siendo la misma aun soltando los botones */ sPaddle1.vy = 0; sPaddle2.vy = 0; }
Ojala alguno de ustedes pueda darme una solución, un saludo!
PD: Si necesitais el codigo entero del juego, decidmelo que lo subo a algun sitio para que lo mireis.
User avatar
R Granado
Usuario avanzado
Posts: 124
Joined: Fri Jul 25, 2003 10:39 am

Postby R Granado » Tue Feb 20, 2007 10:33 pm

Hola,

No he compilado el código ni he realizado pruebas sobre el :P, solo le he dado un vistazo y es posible que meta la pata en el comentario...

Me da la impresión de que mueves las raquetas en el eje Y más rápido que la Bola en el mismo eje, concretamente una unidad la bola y dos la raqueta (a no ser que no haga falta, entonces la detienes). Bajo esta premisa la máquina debería ser practicamente infalible.

Tampoco veo en el código que la bola se acelere, ¿es esto correcto?, es decir, ¿la bola se mueve a velocidad constante?

Dicho está, a ver si el comentario sirve de ayuda... prueba a meterle más velocidad a la bola a ver que pasa :lol:
No importa cuantas veces fracase, inténtelo de nuevo
User avatar
Chacal
Usuario habitual
Posts: 20
Joined: Sun Dec 31, 2006 2:15 pm
Location: Los Barrios

Postby Chacal » Wed Feb 21, 2007 7:55 pm

al fin pude saber por que es, estuve confuso en una cosa, la raqueta de la CPU no iba mas rapida que la del jugador, en ningun momento, por eso el limitador que le tengo puesto al final no funciona, lo que ha ocurrido es que como la pala comprueba la posicion de la bola para asignarse una velocidad u otra, cuando la posicion en el eje y de la bola esta mas arriba que la de la pala de cpu y se dirije en sentido contrario a la direccion que se va a mover la pala para cojerlo (p ej;la bola para abajo y la pala para arriba), esta va a su velocidad, cuando posicion y de la bola este entre el espacio en y que ocupa la pala, la pala del cpu se para, pero al salir la bola de el espacio en y que ocupa la pala, esta asigna de nuevo una velocidad y la vuelve a alcanzar en el eje y, al alcanzarla se para, y como la bola sigue moviendose, se vuelve a salir del espacio que ocupa la pala, y de nuevo la pala se movera hasta alcanzar la bola, produciendo un efecto de "ralentización". En esto fue en lo que yo me equivoque, y por eso no pude resolver el problema, :D . Entonces, he heco de reducir el "campo de reacción" vamso a llamarlo asi, que dispone la CPU para comprobar la posicion de la bola en y y moverse ella, de tal manera que si la bola ha cruzado la mitad del campo pasando a la parte del jugador este se queda quieto, hasta que vuelva a pasar a la parte de su campo, ahora si se le puede ganar ! :P y encima el efecto de ralentizacion, involuntariamente, queda un bien ya que asi choca con los picos de la pala haciendo que la bola rebote en otro sentido jajaja.

Gracias de todos modos R Granado ;) es que soy muy despistao jajaja
From the 16-Bit era...
Image
User avatar
Anderson
Usuario avanzado
Posts: 70
Joined: Sun Jan 09, 2005 9:43 pm
Contact:

Postby Anderson » Sat Mar 03, 2007 12:30 pm

Tengo yo ya ganas de ver cómo es ese Pong... :wink:
:P

Return to “Consultas”

Who is online

Users browsing this forum: No registered users and 4 guests