Plus vite que son ombre

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…

AVANCÉ

Étapes

  1. Brancher et tester le LCD
  2. Brancher et contrôler la LED
  3. Brancher les boutons et détecter leur appui
  4. Programmer le déclement aléatoire de la LED après que les deux boutons sont pressés
  5. Programmer la détection du premier bouton pressé
  6. (Bonus) Afficher les scores
  7. (Bonus) Gérer les faux départs

Fiche de présentation du projet

Matériel

Circuit

Sch%C3%A9ma_bb

Code

#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();
    }
}

Article précédent Article suivant