import machine
import time
import random
from machine import Pin, PWM
print("=== JEU SIMON - ESP32 ===")
print("Prêt à jouer!")
time.sleep(2)
# --- CONFIGURATION DES PINS ---
buzzer = PWM(Pin(2))
# LEDs
led_vert = Pin(18, Pin.OUT)
led_rouge = Pin(19, Pin.OUT)
led_bleu = Pin(21, Pin.OUT)
led_jaune = Pin(22, Pin.OUT)
# Boutons (avec pull-up)
btn_vert = Pin(34, Pin.IN)
btn_rouge = Pin(35, Pin.IN)
btn_bleu = Pin(32, Pin.IN)
btn_jaune = Pin(33, Pin.IN)
# --- VARIABLES DU JEU ---
sequence = []
reponse_joueur = []
numero_tour = 1
faute = False
# --- MAPPING COULEURS ---
couleurs = {
1: {'led': led_vert, 'btn': btn_vert, 'freq': 1000, 'nom': 'VERT'},
2: {'led': led_rouge, 'btn': btn_rouge, 'freq': 800, 'nom': 'ROUGE'},
3: {'led': led_bleu, 'btn': btn_bleu, 'freq': 500, 'nom': 'BLEU'},
4: {'led': led_jaune, 'btn': btn_jaune, 'freq': 200, 'nom': 'JAUNE'}
}
# --- BOUCLE PRINCIPALE DU JEU ---
while True:
try:
# Génère la séquence
sequence = []
for _ in range(numero_tour):
sequence.append(random.randint(1, 4))
# Affiche la séquence
print(f"\n=== TOUR {numero_tour} ===")
print("Mémorisez la séquence:")
buzzer.freq(900)
buzzer.duty(512)
time.sleep(0.2)
buzzer.duty(0)
time.sleep(0.5)
for i, couleur_num in enumerate(sequence):
couleur = couleurs[couleur_num]
print(f"{i+1}. {couleur['nom']}")
# Allume la LED correspondante
for c in couleurs.values():
c['led'].off()
couleur['led'].on()
# Joue le son
buzzer.freq(couleur['freq'])
buzzer.duty(512)
time.sleep(1.0)
buzzer.duty(0)
# Éteint tout
for c in couleurs.values():
c['led'].off()
time.sleep(0.5)
print("À vous de jouer!")
reponse_joueur = []
faute = False
# --- SAISIE JOUEUR ---
print("Répétez la séquence...")
for position in range(numero_tour):
if faute:
break
# Attend qu’un bouton soit pressé
bouton_presse = 0
while bouton_presse == 0:
for num, couleur in couleurs.items():
if not couleur['btn'].value(): # pull-up inversé
bouton_presse = num
time.sleep(0.01)
# Affiche le choix du joueur
couleur = couleurs[bouton_presse]
print(f"{position+1}. {couleur['nom']}")
for c in couleurs.values():
c['led'].off()
couleur['led'].on()
buzzer.freq(couleur['freq'])
buzzer.duty(512)
time.sleep(0.2)
buzzer.duty(0)
# Vérifie la réponse
if sequence[position] != bouton_presse:
faute = True
print("ERREUR!")
# Attend le relâchement
relache = False
while not relache:
relache = True
for c in couleurs.values():
if not c['btn'].value():
relache = False
time.sleep(0.01)
for c in couleurs.values():
c['led'].off()
time.sleep(0.2)
# --- TRAITEMENT DU RÉSULTAT ---
if faute:
print(f"\n=== DÉFAITE ===")
print(f"Votre score final: {numero_tour}")
print("Séquence correcte était:")
for i, couleur_num in enumerate(sequence):
print(f"{i+1}. {couleurs[couleur_num]['nom']}")
# Son et LED de défaite
for i in range(4):
freq = (i * 200) + 100
buzzer.freq(freq)
buzzer.duty(512)
time.sleep(0.2)
buzzer.duty(0)
time.sleep(0.2)
for _ in range(5):
for c in couleurs.values():
c['led'].on()
time.sleep(0.2)
for c in couleurs.values():
c['led'].off()
time.sleep(0.2)
# Réinitialisation
numero_tour = 1
sequence = []
reponse_joueur = []
faute = False
print("\n" + "="*30)
print("Nouveau jeu!")
time.sleep(2)
else:
# Victoire
print("Niveau suivant!")
buzzer.freq(1200)
buzzer.duty(512)
time.sleep(0.3)
buzzer.freq(1500)
time.sleep(0.3)
buzzer.duty(0)
for _ in range(3):
for c in couleurs.values():
c['led'].on()
time.sleep(0.1)
for c in couleurs.values():
c['led'].off()
time.sleep(0.1)
numero_tour += 1
time.sleep(1)
except KeyboardInterrupt:
print("\nJeu interrompu!")
for c in couleurs.values():
c['led'].off()
buzzer.duty(0)
break
except Exception as e:
print(f"Erreur: {e}")
for c in couleurs.values():
c['led'].off()
buzzer.duty(0)
time.sleep(1)