Juego en PyGame - PONG - Parte 3

Jugando PONG en la Magnavox Odyssey

En la
entradas anteriores:



Juego en PyGame - PONG - Parte 1
Juego en PyGame - PONG - Parte 2

Creamos las barras y la pelota con sus respectivos
comportamientos, en esta tercera y ultima parte vamos a agregar los detalles
faltantes como hacer que la pelota inicie su movimiento cuando presionemos
ESPACIO, agregar las puntuaciones y dibujar la cancha.

Animo! Ya casi terminamos….

Para empezar en nuestra función principal main() vamos a agregar esto:

Variables función principal
En sonido_pierdes cargamos el sonido que se
reproducirá cuando un jugador pierda, la variable pausa la usaremos para iniciar la
partida, en texto_inicio cargamos el
texto que se mostrara antes de iniciar la partida y por ultimo puntuacion.. amm creo que no hay que
explicar para que es xD. Muy bien continuemos…..

El terreno
de juego

Vamos a empezar dibujando la cancha que como habrás visto en
el vídeo son 3 simples lineas; 2 en los limites de las barras y 1 en el medio,
nos vamos a la función principal en la sección de dibujo y ponemos lo
siguiente:


Dibujando la cancha

Con pygame.draw.line() nos permite dibujar
una linea en la pantalla, este nos pide donde se va a dibujar (pantalla), color
de la linea, el punto donde inicia y el punto donde termina.

Cancha


Recuerda
que todo debe de llevar orden por lo que debes de dibujar la cancha primero y
después las barras y pelota.

*En este juego realmente no se
nota la diferencia pero en juegos mas elaborados es muy importante.


Se empieza cuando yo diga!
En la sección de la lógica del juego hacemos esta pequeña
modificación:

Pausando el juego
Con el
fin de que la pelota no se mueva mientras el juego este en pausa.


Y en la
sección de dibujo agregamos esto:

Pausando el juego
Si el
juego esta en pausa, que nos muestre el texto de inicio, en la posición que le
dimos al final.


Ejecutamos
y vemos que todo esta pintado correctamente, presionamos la tecla ESPACIO y..... no
pasa absolutamente nada (
)ノ彡┻━┻ tranquilo, en este punto creo que ya te imaginaras porque…
pues no hemos asignado que debe de hacer la tecla ESPACIO en los manejadores de
eventos, así que vamos  a esa sección y
agregamos esto:

Tecla ESPACIO
aquí le decimos que si el juego se encuentra en pausa y en algún momento
presionamos le tecla ESPACIO, que comience el juego. Sencillo!

♪~ ()
¿Cuánto vamos?
Ahora
vamos a mostrar las puntuaciones en la pantalla escribiendo lo siguiente en la
sección de dibujo:

Dibujando las puntuaciones
Bueno y aquí
tal vez te preguntes porque no lo hice como con el texto de inicio, bueno
resulta que con texto_inicio asignamos
un texto que nunca va a cambiar por lo que ocupamos que solo se cargue una vez,
pero aquí las puntuaciones van a estar cambiando constantemente por lo que es
necesario  cargarlo cada vez que esta
cambie y otra cosa importante es que esta función solo admite en formato String  es por eso que convertimos los números con str().

*puedes pasarte por articulo Tipos de datos en python
Y tal vez
te surga otra pregunta como; ¿y porque la formula (ANCHO * 3 / 4) – 20 para colocar un mugriento numero?  Bueno tal y como lo mencione anteriormente,
tienes que pensar en todas las posibilidades, con esa formula que realmente
no tiene mucha ciencia, el numero siempre se colocara donde le corresponde
independientemente de que dimensiones le demos a la ventana.
Ya estamos
a un solo paso de terminar!  (~˘
˘)~
La recta final
Ya solamente nos falta escribir la lógica del juego de que debe
pasar cuando un jugador pierde pero antes ¿recuerdas que a nuestra clase Bola() le creamos la variable self.lado_impacto para saber que lado
perdió? Pues vamos a necesitar tener acceso a esta información, así que vamos y
creamos un método que llamaremos hayImpacto():

Método hayImpacto() de Bola()
Como veras
es un sencillo método que nos dirá que hay en la variable self.lado_impacto.



Ahora
vamos a la lógica del juego y agregamos lo siguiente:

¿Quien perdió?
Como
recordaras la variable self.lado_impacto
la iniciamos como un string vacio (“”)  por lo que la condición if bola.hayImpacto() la considera como falso, si en algún momento
la pelota impacta cualquiera de los 2 lados (derecha o izquierda) quiere decir
que alguien perdió por lo que reproducimos el audio sonido_pierdes y ponemos el juego en pausa, enseguida verificamos
que lado fue el que impacto y le damos 1 punto al que gano.
Ejecuta,
el juego funciona bien…, pero cuando un lado pierde encuentras un problema, la
pelota se queda atorada… A pues claro! ¿como pude olvidarlo?, tenemos que reiniciar
la pelota con cada partida nueva.

Nos vamos a la clase Bola()
y le creamos el método reiniciar();


Método reiniciar() de Bola()
en el que
reiniciamos su posición y velocidad, la condición if  lo que hace es cambiar la
dirección de la pelota dependiendo de quien gano, es decir, si la partida la
gano el jugador 1 en la siguiente la pelota comenzara yendo hacia la izquierda
y volvemos a poner la variable self.lado_impacto
vacía.
 

Solo nos
queda llamar este método en la lógica del juego:

Llamamos al método reiniciar() de la pelota
Y por increíble que parezca... hemos terminado!!

(ノ◕ヮ◕)ノ*:・゚✧

Por ultimo, eres libre de probar cambiando valores como el tamaño de la pelota o de las barras, la dimensión de la ventana o mejor aun; agregar nuevas características a tu juego, las posibilidades son infinitas..




Para concluir
Hay muchos tutoriales de como crear un PONG en Python (la gran mayoría en ingles), pero quise hacer el mio tratando de explicar cada concepto con la intención de que pueda ser entendido por cualquiera y al mismo tiempo también aprender yo.


Extra:
Crea un ejecutable de este juego para que lo puedas compartir y presumir a tus amigos

Con esto concluyo este articulo, cualquier pregunta, comentario, sugerencia y critica es bienvenida, Gracias por su atención.

Salvador Ramírez  Google+

Parte 1 - Parte 2 - Parte 3


  1. PythonDiario dice:

    Excelente artículo Salvador. Felicitaciones 😉

  2. Anónimo dice:

    Se puede descargar el codigo fuente del juego?

    1. SalvaMX dice:

      Claro que si, voy a agregar un link de descarga al final del articulo

    2. SalvaMX dice:

      el link ya esta subido

  3. Anónimo dice:

    Muchas gracias por los tutoriales. Sobre todo, por que no abundan muchos sobre juegos. Que por otra parte, ayudan mucho aprender programacion evitando algoritmos mas tediosos. Por otro lado, seria fenomenal un tuto sobre el 3 en raya y juegos de logica. Mas que nada, para explicar con detalle el algoritmo minimax. Y el tema de arboles de estado y binarios. Algo hay por la red. Pero algunas explicaciones se quedan a medias o dan por entendidos algunos conceptos. Muchas gracias!

    1. SalvaMX dice:

      Por el momento mi intención es hacer estos tutoriales como una introducción a los videojuegos utilizando PyGame mas que nada conceptos basico y poco a poco ir incrementando la dificultad.

      Hace poco termine un curso donde enseñan el 3 en raya en el que utilizábamos 2 técnicas: Monte Carlo y Minimax, pero todavía me siento muy verde como para intentar hacer algún tipo de tutorial, probablemente ya que comprenda bien el tema haga alguno.

      Por si te interesa este es el curso:
      https://www.coursera.org/course/principlescomputing1

      Saludos

    2. Anónimo dice:

      Gracias por el enlace. Aunque buscaba algo en la lengua de Cervantes. Por eso di con tu blog. Saludos!

    3. SalvaMX dice:

      Si, lamentablemente casi toda la buena documentación sobre estos temas esta en ingles.

  4. Unknown dice:

    Como todos vuestros artículos excelente y muy bien explicado. Gracias por la info.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Te has suscrito correctamente al boletín

Se produjo un error al intentar enviar tu solicitud. Inténtalo de nuevo.

Mi Diario Python will use the information you provide on this form to be in touch with you and to provide updates and marketing.