Juego de Memorama (memoria) en Python con PyGame

Hoy te mostraré un juego que recién he programado usando el lenguaje de programación Python y la librería PyGame.

Se trata del videojuego Memorama, también conocido como Memoria. Es un juego en donde hay varias tarjetas en donde hay que voltearlas y encontrar el par de cada una. El jugador gana cuando encuentra todos los pares de tarjetas.

El juego que he desarrollado en PyGame cuenta con imágenes, música de fondo y sonidos, además de que este Memorama o juego de memoria es totalmente jugable.

Obviamente el código es open source y gratuito, así que puedes descargarlo, probarlo, usarlo y modificarlo a tu gusto.

Características del juego memoria en Python

Como lo mencioné anteriormente, este juego está desarrollado con PyGame. Utiliza imágenes tomadas de flaticon y sonidos de freesound. Muchas gracias a ambas páginas por poner a la disposición del público tan buenas creaciones.

Memorama en Python y PyGame – Juego de memoria

En el inicio del juego se muestran todas las imágenes originales y sin ser ocultadas. En cuanto se hace clic en el botón de “Iniciar juego” las imágenes son mezcladas y ahora se muestra el lado oculto de cada tarjeta o carta.

Al hacer clic en cada imagen, la misma gira o “se voltea” para mostrar la imagen real. Y después se puede buscar su pareja.

El jugador gana cuando ya no hay tarjetas ocultas; y puede volver a iniciar el juego. Cuando el juego de memoria es reiniciado, se mezclan y ocultan las imágenes. Así de manera infinita.

A través del post te explicaré los fragmentos del código más importantes de este juego de Memorama open source y gratuito programado con Python y PyGame.

Recuerda que para probarlo debes contar con Python y PIP. Además, debes instalar pygame con:

pip install pygame

Algoritmo general

Lo que hacemos es tener una matriz que representa al juego en sí. La matriz, que no es otra cosa más que un arreglo de arreglos, tiene filas. Cada fila tiene un cuadro. En esos cuadros guardamos toda la información relacionada a la tarjeta.

Por ejemplo, cada cuadro tiene propiedades como descubierto que indica si se debería mostrar porque el jugador lo descubrió antes, así como la fuente de la imagen o la propiedad mostrar que indica si la imagen original se debería mostrar porque se está buscando su par.

Luego, pintamos todos esos cuadros en la pantalla usando PyGame, escuchamos el clic del usuario y verificamos cuál clic es.

En caso de que sea el primer clic, entonces modificamos algunas variables para esperar el segundo clic (que será cuando el jugador busque la pareja de la tarjeta anteriormente seleccionada).

Cuando escuchamos el segundo clic verificamos a través de la ruta de la imagen si las imágenes son iguales, en ese caso reproducimos el sonido de éxito y ponemos ambos cuadros como descubiertos.

Si el jugador se equivoca en la tarjeta, entonces establecemos una marca de tiempo para indicarle al programa que las tarjetas deben ocultarse dentro de determinados segundos.

El jugador gana el juego de Memorama cuando todos los cuadros tienen la propiedad descubierto en True.

Recuerda que todo el proceso del juego se estará realizando en un ciclo infinito.

Por cierto, ya he hecho este juego anteriormente en JavaScript.

Clase Cuadro

Como lo dije, todo el juego es una matriz de instancias de la clase Cuadro que se ve así:

En la línea 19 estamos cargando la imagen, de este modo cada instancia tendrá su propia imagen. Recuerda que también guardamos la fuente de la imagen (la cadena) para más tarde comparar si dos imágenes son iguales.

Una vez definida la clase, veamos también el tablero del juego:

El constructor de Cuadro recibe únicamente una cosa: la ruta de la imagen. En este caso definimos dos cuadros por cada imagen, pues recuerda que debe buscarse el par de cada una. Más tarde veremos cómo mezclarlas.

Fíjate bien en la matriz, pues es un arreglo que tiene arreglos. Cada arreglo interno tiene 4 imágenes o mejor dicho, 4 instancias de Cuadro.

En total hay 16 imágenes en este juego de Memoria en Python, aunque recordemos que se repiten, así que solo hay 8 imágenes únicas.

Colores y sonidos

Definimos algunos colores del juego (para el color del botón, color de fondo, etcétera) y también los sonidos que vamos a reproducir a lo largo del mismo:

Botón para iniciar juego

El usuario debe hacer clic en un botón para iniciar el juego. En este caso el botón no es más que un rectángulo. Primero definimos la fuente que vamos a usar para escribir texto dentro del botón, y luego el botón:

Los cálculos que ves son para posicionar el botón en la parte inferior. Al analizar el código fuente completo verás a lo que me refiero.

Para dibujar el botón hacemos lo siguiente, dependiendo de si el juego está o no iniciado:

Funciones útiles

Aunque el juego no reside en una clase separada, y todo está de manera global, tenemos algunas funciones útiles que nos permiten separar el código.

Tenemos varias funciones que, espero, se expliquen por sí mismas. Por ejemplo, una función oculta todos los cuadros del arreglo. Otra función verifica si el jugador ha ganado, existe otra que mezcla las tarjetas, etcétera.

Recuerda que usamos la palabra reservada global para modificar una variable global, pues en Python podemos leer pero no modificar las variables globales, al menos que usemos esta palabra reservada.

Eventos del juego

Ahora vamos a ver cómo detectar el clic de las imágenes o el botón, además del evento para cerrar el juego. Para cerrar el juego en la señal de Python, invocamos a sys.exit:

Existe otro evento, que es el clic del botón. Debido a que es un rectángulo, podemos usar los métodos de PyGame para saber si el clic colisiona con el botón:

En este caso collidepoint recibe x e y, mismos que ya están dentro de event.pos.

Finalmente veamos cómo detectar si el usuario hizo clic en una imagen, pues en este método es en donde se lleva la mayor parte del funcionamiento del juego memorama en Python:

Los comentarios son los que explican todo el código que ya expliqué anteriormente en el algoritmo. Solo fíjate en el truco que hace que sepamos en cuál imagen hicieron clic, pues debido a que todo es una cuadrícula, podemos obtener los índices a partir de las coordenadas.

Presta atención a la variable ultimos_segundos, esa variable indica si se debe ocultar alguna imagen dentro de determinados segundos. Se usa la misma lógica que el ejercicio de Semáforo en arduino sin delay.

También fíjate que en cada clic de la imagen comprobamos si el usuario gana, invocando en la línea 53 a la función que previamente mostré.

Ocultar imágenes si no se encuentra pareja

Cuando se hace clic en la segunda imagen, en caso de que esta no sea el par de la anteriormente seleccionada, se ocultan de nuevo. El código que hace eso posible es:

Dibujar memorama

Ya vimos todos los eventos, ahora veamos cómo dibujar el juego de memoria, mostrar las imágenes ya sea ocultas o volteadas, etcétera. El dibujo de la pantalla queda así:

Para saber si se dibuja la imagen oculta o la real, accedemos a la propiedad mostrar y descubierto de cada cuadro. En caso de que alguna de estas esté en True, mostramos la imagen del cuadro.

Caso contrario, dibujamos la imagen oculta. Recuerda que todo esto se estará repitiendo varias veces por segundo.

Poniendo todo junto

Como lo dije anteriormente, solo expuse el código más importante. El código completo lo encuentras en mi GitHub.

Al final, solo debes instalar Python y Pip, instalar la dependencia de PyGame y ejecutar el script de memoria.py con:

python memoria.py

Acá una captura de mí jugando:

Jugando Memorama en Python – Juego gratuito y open source

Te invito a leer más sobre programación usando Python en mi blog. También te dejo el código de un memorama para la web usando JavaScript.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

6 comentarios en “Juego de Memorama (memoria) en Python con PyGame”

  1. Tienes algun ejemplo para crear una mazmorra en Python, con matriz de 5 x 5 con una entrada, una salida, una trampilla, el aventurero solo tiene 4 movimientos (norte,sur,este y oeste) con el objetivo de salir de la mazmorra sin caer en la trampilla porque sino muere, puede ser un esqueleto o una trampilla.
    Es para un ejercicio que estoy haciendo con un curso de la Once. Solo me falta eso para terminarlo y no logro hacerlo. Me puede ayudar por favor

  2. Hola que tal !, se me hace super interesante tu implementación del memorana usando pygame. Pero en caso de que quisiéramos usar imágenes diferentes para el memorama, es decir, en una carta usar la imagen y en otra carta que sea texto, ya no se podría usar la fuente para encontrar el par … ahi cómo se podría hacer??? ,… le agradecería me pudiese apoyar con una idea, estoy trabajando con algo similar en python.

Dejar un comentario