Un jeu de vitesse et de réactivité : dès que la lumière s'allume, deux adversaires doivent appuyer sur leur bouton le plus rapidemment possible. Le premier l'emporte ! Mais attention aux faux départs…
▶ Fiche de présentation du projet
#include <LiquidCrystal.h>
#define LCD_COLONNES 16
#define LCD_LIGNES 2
#define BROCHE_LCD_RS 12
#define BROCHE_LCD_EN 11
#define BROCHE_LCD_D4 5
#define BROCHE_LCD_D5 4
#define BROCHE_LCD_D6 3
#define BROCHE_LCD_D7 2
#define BROCHE_LED 7
#define BROCHE_BOUTON_A 8
#define BROCHE_BOUTON_B 9
#define JOUEUR_A true
#define JOUEUR_B false
LiquidCrystal lcd(BROCHE_LCD_RS, BROCHE_LCD_EN, BROCHE_LCD_D4, BROCHE_LCD_D5, BROCHE_LCD_D6, BROCHE_LCD_D7);
bool touche = true;
unsigned long declenchement;
unsigned long appui;
int etat_bouton_a;
int etat_bouton_b;
void afficher_vainqueur(bool vainqueur, unsigned long temps_reaction)
{
lcd.clear();
lcd.setCursor(0, 0);
if (vainqueur)
{
lcd.print("Joueur 1 gagne !");
}
else
{
lcd.print("Joueur 2 gagne !");
}
lcd.setCursor(0, 1);
lcd.print(temps_reaction);
lcd.print(" ms");
digitalWrite(BROCHE_LED, LOW);
touche = true;
delay(3000);
}
void afficher_perdant(bool who_looses)
{
lcd.clear();
lcd.setCursor(0, 0);
if (who_looses)
{
lcd.print("Joueur 1 perd.");
}
else
{
lcd.print("Joueur 2 perd.");
}
lcd.setCursor(0, 1);
lcd.print("Faux depart");
touche = true;
delay(3000);
}
void demarrer_jeu()
{
appui = 0;
etat_bouton_a = HIGH;
etat_bouton_b = HIGH;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Preparez-vous...");
delay(1000);
lcd.clear();
touche = false;
digitalWrite(BROCHE_LED, LOW);
declenchement = millis() + random(1, 10) * 1000;
}
void setup()
{
lcd.begin(LCD_COLONNES, LCD_LIGNES);
pinMode(BROCHE_LED, OUTPUT);
pinMode(BROCHE_BOUTON_A, INPUT_PULLUP);
pinMode(BROCHE_BOUTON_B, INPUT_PULLUP);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Appuyez sur les ");
lcd.setCursor(0, 1);
lcd.print("deux boutons !");
}
void loop()
{
if (!touche)
{
if (appui == 0 && millis() >= declenchement)
{
appui = millis();
digitalWrite(BROCHE_LED, HIGH);
}
int etat_bouton_actuel_a = digitalRead(BROCHE_BOUTON_A);
int etat_bouton_actuel_b = digitalRead(BROCHE_BOUTON_B);
if (etat_bouton_actuel_a != etat_bouton_a)
{
etat_bouton_a = etat_bouton_actuel_a;
if (!etat_bouton_a)
{
if (appui > 0)
{
afficher_vainqueur(JOUEUR_A, millis() - appui);
}
else
{
afficher_perdant(JOUEUR_A);
}
}
}
if (etat_bouton_actuel_b != etat_bouton_b)
{
etat_bouton_b = etat_bouton_actuel_b;
if (!etat_bouton_b)
{
if (appui > 0)
{
afficher_vainqueur(JOUEUR_B, millis() - appui);
}
else
{
afficher_perdant(JOUEUR_B);
}
}
}
}
else if (digitalRead(BROCHE_BOUTON_A) == LOW && digitalRead(BROCHE_BOUTON_B) == LOW)
{
demarrer_jeu();
}
}