Con este juego, la idea fue aplicar algunos de los conceptos aprendidos hasta ahora, y algunas cosas extras que encontré en el camino.
Se trata del juego de memoria, donde hay parejas de cartas, mezcladas, todas boca abajo, se voltean dos para revelar su imagen y se vuelven a ocultar si no son pareja, si lo son, se dejan visibles. Así hasta terminar de revelar todas las parejas de cartas.
En esta pequeña implementación, se muestran dos filas de números, que representan las cartas, y se le pide al jugador que escoja dos, las cuales se mostrarán por un breve tiempo, si no coinciden, se vuelven a ocultar. Así hasta que termine el juego al encontrar todas las parejas.
Explicación en el código
import random
import os
import platform
import time
'''
Esta lista contendrá las cartas que se van a utilizar en el juego.
'''
figuritas = ["💝", "⭐", "🐻", "🍰", "🍹", "🌻"]
'''
En una variable guardo la cantidad de figuritas, para más adelante.
Creo una nueva lista duplicando figuritas para crear las parejas
y la mezclo con random.shuffle(...)
'''
num_figuritas = len(figuritas)
pares = figuritas + figuritas
random.shuffle(pares)
'''
Creo una estructura, con un dicionario.
La "llave" será un índice de carta, comenzando desde 1,
para esto usamos enumerate(...) y la "comprensión de listas" (el for que está ahí)
El "valor" será una lista de dos elementos:
- la carta (figurita o emoji)
- el estado de la carta, si encontró su pareja: True o False
'''
pares_ocultos = {
index: [figurita, False] for index, figurita in enumerate(pares, start=1)
}
'''
De momento esto no se ha visto, es una función.
Es para limpiar la pantalla, pero depende si es windows o linux/unix,
se usa diferente.
El extraño if, se llama "operador ternario":
valor_si_condicion_verdadera if condicion else valor_si_condicion_falsa
'''defclean():
os.system("cls"if platform.system() == "Windows"else"clear")
##-----------------'''
Ya comienza el juego.
Inicializamos las variables que vamos a utilizar:
- contador_fin: contador de parejas encontradas
- contador_movimientos: contador de intentos o movimientos
- carta_1 y _2: cartas seleccionadas por el usuario
'''
carta_1 = ""
carta_2 = ""
contador_fin = 0
contador_movimientos = 0'''
Mientras no se hayan encontrado todas las parejas, el juego sigue.
A menos que se detenga con la palabra exit.
'''whileTrue:
clean()
print("-------- 👑 ENCUENTRA LA PAREJA 👑 ---------\n")
'''
Muestra las cartas ocultas
Es decir, de la estructura diccionario, mostraremos los índices
o identificaciones de las cartas, las llaves.
Pero, si la carta ya encontró su pareja, en vez de mostrar el índice,
mostraremos el valor o figurita.
El separador es para que haya un salto de línea, a la mitad de la lista
para hacer mas cómoda la visualización. De nuevo, usa el operador ternario.
'''for key, value in pares_ocultos.items():
separador='\n'if key % num_figuritas == 0else''if value[1]: #-- ya encontró su pareja
print(f"[ {value[0]} ]", end=separador)
else:
print(f"[ {key} ]", end=separador)
'''
En esta parte, se hace la captura de las dos cartas
seleccionadas por el usuario en cada turno.
Se usa strip() para eliminar los espacios en blanco al inicio y al final,
y lower() para convertir a minúsculas.
Se hacen varias validaciones:
- si es exit, sale del juego con break,
- si no es un valor numérico,
o lo es pero no está en el rango de índices válidos,
o sí está pero es una carta que ya encontró su pareja,
se salta a la siguiente iteración con continue.
- si digitó el mismo número como carta 1 y 2, se muestra un mensaje de alerta y
se salta a la siguiente iteración con continue.
'''
carta_1 = input(
"\nEscoge la primera carta (exit para salir): ").strip().lower()
if carta_1 == "exit":
breakifnot carta_1.isdigit() or int(carta_1) notin pares_ocultos.keys() or pares_ocultos[int(carta_1)][1]:
continue
carta_2 = input(
"Escoge la segunda carta (exit para salir): ").strip().lower()
if carta_2 == "exit":
breakifnot carta_2.isdigit() or int(carta_2) notin pares_ocultos.keys() or pares_ocultos[int(carta_2)][1]:
continueif carta_1 == carta_2:
print("😱 No puedes elegir la misma carta dos veces!")
time.sleep(1.5)
continue'''
Una vez pasó las validaciones, se van a revelar las cartas seleccionadas!
para ello limpiamos primero pantalla, repetimos el título del juego,
aumentamos el contador de movimientos,
e iteramos los items de la estructura (diccionario) mostrando los índices,
pero para las cartas seleccionadas por el usuario,
y para las cartas que ya han encontrado su pareja,
se muestran son los valores o figuritas.
'''
clean()
print("-------- 👑 ENCUENTRA LA PAREJA 👑 ---------\n")
contador_movimientos+=1for key, value in pares_ocultos.items():
separador='\n'if key % num_figuritas == 0else''if key == int(carta_1) or key == int(carta_2) or pares_ocultos[key][1]:
print(f"[ {value[0]} ]" , end=separador)
else:
print(f"[ {key} ]", end=separador)
'''
Ahora validaremos si se ha encontrado una pareja.
Para ello, comparamos los valores de las cartas seleccionadas.
Si coinciden, marcamos en la lista de la estructura diccionario,
el segundo valor o posición[1] como True,
y aumentamos el contador de parejas encontradas y salimos del ciclo.
Pero antes de seguir el ciclo, verificamos si se han encontrado todas las parejas,
en cuyo caso, se muestra un mensaje de felicitación y se termina el juego.
'''if pares_ocultos[int(carta_1)] == pares_ocultos[int(carta_2)]:
pares_ocultos[int(carta_1)][1] = True
pares_ocultos[int(carta_2)][1] = True
contador_fin+=1if contador_fin == num_figuritas:
print("\n🥳👋👋👋 -- LO HAS LOGRADO -- 👋👋👋🥳")
print(f"... en {contador_movimientos} movimientos\n")
breakelse:
print("\n😎 Felicidades, encontraste una pareja!")
time.sleep(1.8)
print("------------ 👑 GAME OVER 👑 -------------\n\n")