from machine import Pin, PWM
import time
import random
# ======================
# CONFIGURACION
# ======================
PUNTAJE_OBJETIVO = 10
TIEMPO_MAX_REACCION = 5
# dificultad
DELAY_BASE = 0.5 # velocidad inicial
DELAY_MIN = 0.2 # velocidad máxima
# ----------------------
# Pines Jugador 1
# ----------------------
botones_j1 = [Pin(p, Pin.IN, Pin.PULL_UP) for p in [13,14,27,26]]
leds_j1 = [Pin(p, Pin.OUT) for p in [16,17,18]]
buzzer_j1 = PWM(Pin(19))
# ----------------------
# Pines Jugador 2
# ----------------------
botones_j2 = [Pin(p, Pin.IN, Pin.PULL_UP) for p in [25,33,32,23]]
leds_j2 = [Pin(p, Pin.OUT) for p in [4,5,21]]
buzzer_j2 = PWM(Pin(22))
# ----------------------
boton_inicio = Pin(15, Pin.IN, Pin.PULL_UP)
puntaje1 = 0
puntaje2 = 0
tonos = [262, 330, 392, 523]
# ======================
# FUNCIONES AUXILIARES
# ======================
def apagar_todo():
for led in leds_j1 + leds_j2:
led.off()
buzzer_j1.duty(0)
buzzer_j2.duty(0)
def sonar(buzzer, freq, tiempo):
buzzer.freq(freq)
buzzer.duty(512)
time.sleep(tiempo)
buzzer.duty(0)
def efecto_ganador(jugador):
leds = leds_j1 if jugador == 1 else leds_j2
for _ in range(6):
for led in leds:
led.on()
time.sleep(0.15)
for led in leds:
led.off()
time.sleep(0.15)
def esperar_boton(lista):
while True:
for i, b in enumerate(lista):
if b.value() == 0:
time.sleep(0.2)
return i + 1
# ======================
# JUEGO REACCION
# ======================
def juego_reaccion():
v1 = 0
v2 = 0
while v1 < 2 and v2 < 2:
apagar_todo()
time.sleep(random.uniform(1,4))
obj = random.randint(1,4)
if obj <= 3:
leds_j1[obj-1].on()
leds_j2[obj-1].on()
else:
sonar(buzzer_j1, 800, 0.2)
sonar(buzzer_j2, 800, 0.2)
inicio = time.time()
ganador = None
while time.time() - inicio < TIEMPO_MAX_REACCION:
for i,b in enumerate(botones_j1):
if b.value() == 0:
ganador = 1 if i+1 == obj else 2
break
for i,b in enumerate(botones_j2):
if b.value() == 0:
ganador = 2 if i+1 == obj else 1
break
if ganador:
break
apagar_todo()
if ganador is None:
print("Ronda nula")
continue
if ganador == 1:
v1 += 1
print("J1 gana ronda")
else:
v2 += 1
print("J2 gana ronda")
print("Marcador:", v1, "-", v2)
time.sleep(1)
ganador_final = 1 if v1 == 2 else 2
print("Gana reacción:", ganador_final)
efecto_ganador(ganador_final)
return ganador_final
# ======================
# SIMON DICE PRO
# ======================
def juego_simon(jugador):
global puntaje1, puntaje2
secuencia = []
botones = botones_j1 if jugador == 1 else botones_j2
leds = leds_j1 if jugador == 1 else leds_j2
buzzer = buzzer_j1 if jugador == 1 else buzzer_j2
delay = DELAY_BASE
print("\n--- SIMON ---")
while True:
secuencia.append(random.randint(1,4))
print("Secuencia:", secuencia)
# mostrar secuencia
time.sleep(0.7)
for paso in secuencia:
if paso <= 3:
leds[paso-1].on()
sonar(buzzer, tonos[paso-1], delay)
leds[paso-1].off()
else:
sonar(buzzer, tonos[3], delay + 0.1)
time.sleep(delay)
print("Tu turno")
# jugador replica
for paso in secuencia:
pulsado = esperar_boton(botones)
# feedback
if pulsado <= 3:
leds[pulsado-1].on()
sonar(buzzer, tonos[pulsado-1], 0.2)
leds[pulsado-1].off()
else:
sonar(buzzer, tonos[3], 0.3)
if pulsado != paso:
print("Fallaste")
time.sleep(1)
return
print("Correcto")
# sumar punto
if jugador == 1:
puntaje1 += 1
else:
puntaje2 += 1
mostrar_puntaje()
# aumentar dificultad
if delay > DELAY_MIN:
delay -= 0.05 # cada ronda más rápido
time.sleep(1)
# ======================
def mostrar_puntaje():
print("Jugador 1:", puntaje1, "| Jugador 2:", puntaje2)
# ======================
# MAIN
# ======================
while True:
apagar_todo()
print("Presiona inicio")
while boton_inicio.value() == 1:
pass
time.sleep(0.3)
while puntaje1 < PUNTAJE_OBJETIVO and puntaje2 < PUNTAJE_OBJETIVO:
ganador = juego_reaccion()
if ganador in [1,2]:
juego_simon(ganador)
if puntaje1 >= PUNTAJE_OBJETIVO:
print("GANA J1")
efecto_ganador(1)
else:
print("GANA J2")
efecto_ganador(2)
break