#importamos librerias para utilizar mas adelante
from machine import Pin
from utime import sleep
import random
# Nombramos los pines de salida (leds)
led_azul = Pin(12, Pin.OUT)
led_amarillo = Pin(14, Pin.OUT)
led_morado = Pin(27, Pin.OUT)
led_celeste = Pin(26, Pin.OUT)
# Nombramos pinees de salida (led ganar o perder)
led_rojo_perder = Pin(4, Pin.OUT)
led_verde_ganar = Pin(2, Pin.OUT)
# Nombramos pines de entrada (botones)
boton_start = Pin(25, Pin.IN)
boton_led_azul = Pin(21, Pin.IN,)
boton_led_amarillo = Pin(19, Pin.IN,)
boton_led_morado = Pin(18, Pin.IN,Pin.PULL_DOWN )
boton_led_celeste = Pin(5, Pin.IN,Pin.PULL_DOWN)
#diccionario de leds
"""El objetivo de este diccionario de leds es tener almacenada la informacion
de cada led de forma ordenada y accesible, asi podemos checar en cualquier momento
que led esta encendido o apagado
"""
lista_randoms = {
'led_azul': led_azul,
'led_amarillo': led_amarillo,
'led_morado': led_morado,
'led_celeste': led_celeste
}
#diccionario de botones
"""El objetivo del diccionario de botones es poder hacer seguimiento al estado
de cada boton al momento de ejecutar el codigo, asi sabremos si fue presionado
y si es asi cuantas veces.
"""
lista_botones = {
'led_azul': boton_led_azul,
'led_amarillo': boton_led_amarillo,
'led_morado': boton_led_morado,
'led_celeste': boton_led_celeste
}
# variables de control que nos permite determinar estados de ejecucion
""" ESto quiere decir que podemos saber en que punto se encuentra
la ejecucion del codigo dependiendo del estado de estas variables
"""
bandera_start = True
bandera_botones = False
terminar = ''
def crear_random(n, lista_randoms):
"""Este funcion se encarga de generar una secuencia aleatorio de leds
y almacenar la secuencia en una lista. El valor de n representa
la cnatidad maxima de secuencias generadas
"""
lista_random_creada = []
lista_random_solucion = []
for valores in range(n):
aleatorio = random.choice(list(lista_randoms.keys()))
aleatorio_solucion = lista_randoms[aleatorio]
lista_random_solucion.append(aleatorio_solucion)
lista_random_creada.append(aleatorio)
return lista_random_solucion, lista_random_creada
def encender_secuencia(secuencia):
"""Enciende la secuencia generada
"""
for elemento in secuencia:
elemento.value(1)
sleep(1) # Ajusta el tiempo según la velocidad deseada
elemento.value(0)
sleep(0.5)
return 'termino'
def checar_secuencia(n, lista_botones, lista_random_creada):
"""Checa los botones presionados para guardar la secuencia
operada por el usuario
"""
list_usuario = []
while len(list_usuario) < n:
for nombre, boton in lista_botones.items():
if boton.value() == 1:
list_usuario.append(nombre)
print(f'{nombre} presionado')
sleep(0.5) # Espera para evitar múltiples registros por una sola pulsación
return list_usuario
def es_ganador(botones_usuario, lista_random_creada):
"""
revisa la lista generada por el usuario al presionar la secuencia de botones
con la secuencia generada por el sistema y si es igual devuelve true
"""
return botones_usuario == lista_random_creada
#preguntamos al usuario la cantidad de leds aleatorios que se encenderan
valor_secuencia = int(input('Ingrese el numero de la secuencia: '))
while True:
"""checamos si el boton de start fue presionado y si la bandera start es True
"""
if boton_start.value() == 1 and bandera_start:
# se crean las secuencias de leds y se encienden
lista_random_solucion, lista_random_creada = crear_random(valor_secuencia, lista_randoms)
print('Secuencia generada:', lista_random_creada)
terminar = encender_secuencia(lista_random_solucion)
bandera_start = False
if terminar != '' and not bandera_start:
# iniciamos el codigo para poder checar la secuencia de botones presionados
print('Puede Ingresar Secuencia')
secuencia_usuario = checar_secuencia(valor_secuencia, lista_botones, lista_random_creada)
# se verifica si la secuencia es igual:
if es_ganador(secuencia_usuario, lista_random_creada):
# si es verdadero se prende el led verde y se termina el codigo
led_verde_ganar.value(1)
sleep(2)
led_verde_ganar.value(0)
print('¡Ganaste!')
break
else:
# si no es verdadero se cambia prende el led de color rojo y
# se le pide al usuario que oprima el boton de start de nuevo
led_rojo_perder.value(1)
print('Has perdido, presiona el boton start para un nuevo intento')
bandera_start = True # Permitir un nuevo juego
terminar = ''
sleep(2)
led_verde_ganar.value(0)
led_rojo_perder.value(0)
else:
print('No iniciado')
sleep(0.1) # Pequeña espera para evitar que el bucle consuma demasiado recurso