Para la correcta comprensión de este tutorial es necesario haber visto la primera parte: Seleccionando una carta al azar.
En esta segunda parte nos encargaremos de modificar nuestro código para evitar que se ponga en juego dos veces la misma carta, podríamos afrontar este problema de diferentes maneras, desde la más simple hasta la más complicada, pero hay que tener en cuenta que nuestro juego es más bien sencillo por lo que no es necesario complicarnos con una comprobación muy elaborada,
A tener en cuenta
- Siempre habrá 10 cartas en juego. Nunca más. Nunca menos.
Teniendo lo anterior en cuenta implementaremos una comprobación que es sencilla, pero tiene el inconveniente de ser menos eficaz conforme es mayor el número de cartas creadas, miraremos a fondo por qué más adelante.
Lo primero que hacemos es crear una lista vacía, esta lista la utilizaremos para ir añadiendo las cartas que salen y poder consultarla posteriormente.
cartas_en_juego = []
Luego definimos tres variables: un diccionario que utilizamos en la anterior entrega, una variable booleana llamada cambiar inicialmente True y una variable carta.
palos = {0:"corazon", 1:"pica", 2:"diamante", 3:"trebol"}
cambiar = True
carta = ""
Luego vamos a crear un bucle que se va a repetir siempre que la variable cambiar sea True, esta variable la utilizaremos para determinar si el bucle debe repetirse una vez más o no.
while cambiar:
x = random.randrange(0,4)
palo = palos[x]
y = str(random.randrange(2, 15))
carta = y + palo
if len(cartas_en_juego) != 0:
for a in cartas_en_juego:
if carta == a:
cambiar = True
break
cambiar = False
En las tres primeras lineas dentro del bucle encontramos algo que nos debería sonar familiar, estas lineas hacen parte de nuestra función seleccionar_carta () que creamos anteriormente y nos asigna un valor palo con nuestro mazo y un valor y con el valor de la carta.
x = random.randrange(0,4)
palo = palos[x]
y = str(random.randrange(2, 15))
Luego tomamos estos valores y los unimos en un único string que asignamos a la variable carta que hemos creado, esto nos dará entonces como resultado siempre un string del tipo: "3corazon" o "11diamante", así logramos crear un 'código' para guardar en nuestra lista y luego poder comparar fácilmente.
carta = y + palo
Luego creamos un condicional, que será necesario para comprobar si la lista está vacía o no, ya que si está vacía no necesitaremos la comprobación y saldremos de ella colocando cambiar en False para salir del bucle.
if len(cartas_en_juego) != 0:
for a in cartas_en_juego:
if carta == a:
break
cambiar = False
En caso de que no esté vacío recorremos con un for cada posición de la lista y la comparamos con nuestra variable carta, si en alguna posición hay un valor igual a carta dejamos de recorrer la lista con un break para provocar que se repita el while, pues cambiar sigue siendo True, y se elija otro par de valores aleatorios. Si ninguna posición comparada es igual a nuestra variable carta terminará el for y colocará la variable cambiar en False ya que no encontramos ninguna coincidencia, y provocará que salgamos del while.
for a in cartas_en_juego:
if carta == a:
break
cambiar = False
Ahora que conocemos las entrañas del código quizá hayamos notado porque entre más cartas menos eficiente: entre más cartas en juego nuestra lista será mayor, por lo que recorrerla es más complicado y además la comprobamos toda, y siempre, incluso se puede enviar a comprobación un valor que ya se envió, pero igual se realiza de nuevo la comprobación; en fin, en un juego mayor no sería recomendable esta comprobación, pero para nuestro objetivo cumple perfectamente con el cometido así que no ahondaremos en sus deficiencias.
Esta comprobación la incluimos en nuestra función seleccionar_carta () quedándonos así:
# Definimos cartas en juego de maner global
cartas_en_juego = []
def seleccionar_carta():
palos = {0:"corazon", 1:"pica", 2:"diamante", 3:"trebol"}
cambiar = True
carta = ""
while cambiar:
x = random.randrange(0,4)
palo = palos[x]
y = str(random.randrange(2, 15))
carta = y + palo
if len(cartas_en_juego) != 0:
for a in cartas_en_juego:
if carta == a:
break
cambiar = False
# Se añadirá la carta 'diferente'
# en el la lista de cartas que ya han salido
cartas_en_juego.append(carta)
return PATH_CARTAS + "/" + palo + "/" + y + ".png"
Al salir de la comprobación utilizamos el método append() de la lista para añadir el valor. Realizando estos cambios en nuestra función seleccionar_carta () ya habremos solucionado el problema y no tendremos que preocuparnos por que nos salgan dos cartas iguales en nuestra escena.
En la próxima entrega se empieza a modificar la funcionalidad del juego.







No hay comentarios:
Publicar un comentario