Jeu Arduino : Hacker le coffre de la banque

Bonjour à tous,

Je suis nouveau et fait de l'arduino depuis quelques mois et je vous partage un de mes premiers jeux que j'ai créé de A à Z en combinant Arduino et Impression 3D.

Il se présente sous la forme d'un coffre fort.

La règle du jeu est simple :

Un nombre aléatoire est généré et affiché sur un premier display TM1637
Le but du jeu est de recréer cette combinaison à l'identique dans le second TM1637 en sachant que :
Chaque digit du second display est une boucle infinie de 0 à 9
Le but est donc de stopper la boucle en appuyant sur le buzzer au bon moment et d'obtenir le même digit permettant de reconstituer le nombre aléatoire.
Si vous réussissez, le digit suivant s'active et la boucle associée démarre
Si vous échouez, la partie est perdue
En sachant qu'au fur et à mesure la vitesse augmente.
Si vous gagnez, le coffre vous donne une récompense et des bonbons tombent du coffre.

Ce qu'il fait :

  • Allumer/Eteindre le son (avec un bouton poussoir)
  • Choisir un niveau 1 ou 2 qui augmente la vitesse des boucles (et le nombre de bonbons distribués lors de la victoire) avec un switch
  • Enregistrer/afficher le nombre de parties jouées, gagnées et le taux de réussite avec un bouton poussoir
  • Animation des leds
  • Distribuer des bonbons avec un servo moteur
  • Alimenter par une pile en 9V car il est transportable

J'ai fait une vidéo complète en mode tutoriel si vous souhaitez voir le résultat et si vous souhaitez le refaire chez vous, voir même l'améliorer (j'ai compacté au max pour éviter d'avoir une vidéo d'une heure + tout sous-titré si besoin) La vidéo ici

Merci à tous et surtout à @jpbbricole pour les conseils glanés sur ce forum qui permettent de progresser :+1:

A très vite pour un nouveau jeu.

Bonjour warnix

C'est magnifique, bravo, superbe réalisation :clap: :clap: :clap:

Je me réjouis de voir la suite!

Cordialement
jpbbricole

1 Like

Jolie finition !

(Le code gagnerait à utiliser des tableaux et switch/case d’après ce que j’ai rapidement vu sur la vidéo)

1 Like

Belle réalisation, bravo !

Wouah, j'adore ce projet :sweat_smile:
Vivement un appartement plus grand afin de pouvoir acheter ma première imprimante 3D il fait que j'essaye ce truc

wow impressionant ca a l'air top

Bonjour, j'essaye de reproduire votre projet, mais n'étant pas très au point j'ai pas mal de soucis avec le code. Surtout concernant la partie pour faire tourner les 4 digits pour essayer de trouver le bon résultat. Existe-t-il un endroit où vous mettez votre code à disposition?

Cordialement,

Guillaume

Bonjour eatyone

Voici le code , à optimiser et personnaliser selon ses besoins.

#include <Button.h>  
#include <LiquidCrystal_I2C.h> 
#include "TM1637Display.h" 
#include <Servo.h> 

Button bouton(6);
LiquidCrystal_I2C lcd(0x27,16,2); 
TM1637Display display(8, 9);
TM1637Display display2(11, 10); 
Servo Bras1; 


const unsigned long blinkDuration = 10000;
const unsigned long blinkPeriod = 500;
const int ledbuzzer=5;
const int led1rouge=23;
const int led2rouge=25;
const int led3rouge=27;
const int led4rouge=29;
const int ledverte=33;
const int interu=42;
const int inter_rouge=48;
const int inter_vert=50;
const int pin_INTERRUPTEUR = 44; //47
boolean boutonEvent = false; 
boolean AppuiBouton = false; 
boolean AppuiBouton2 = false; 
int joueson=1;
int i; 
int j;
int k;
int m;
int pos=1;
int premier;
int deuxieme;
int troisieme;
int quatrieme;
int positionjeu=0; // position dans le jeu
int leson;
int reward;
unsigned long lightNumberTempo;    
unsigned long lightNumberMillis = millis() + lightNumberTempo;    
unsigned long lightNumberTempo2;    
unsigned long lightNumberMillis2 = millis() + lightNumberTempo2;    
unsigned long lightNumberTempo3;
unsigned long lightNumberMillis3 = millis() + lightNumberTempo3;  
unsigned long lightNumberTempo4;
unsigned long lightNumberMillis4 = millis() + lightNumberTempo4;


void setup() {

    pinMode(pin_INTERRUPTEUR, INPUT_PULLUP);
lcd.init();      
lcd.backlight();
lcd.clear();
lcd.setCursor(2,0); 
lcd.print("BUZZER POUR");
lcd.setCursor(1,1);   
lcd.print("LANCER LE JEU");
pinMode(6, INPUT_PULLUP);
display.setBrightness(5);
display.clear(); 
display2.setBrightness(5);
display2.clear(); 
Bras1.attach(2);
Bras1.write(180);

}

void loop() {


  clignote();
if (digitalRead(interu) == LOW)
{digitalWrite(inter_rouge, HIGH);   digitalWrite(inter_vert,LOW); reward=1200;}
else 
{digitalWrite(inter_vert, HIGH);   digitalWrite(inter_rouge,LOW); reward=800;}


if (bouton.pressed())
{
boutonEvent = true; 
}



if (AppuiBouton == true && positionjeu ==2)     
{
if (millis() - lightNumberMillis >= lightNumberTempo)    
{   
i ++;
if (i > 9){i = 0;}
depart();
lightNumberMillis = millis();   
tone (51, 1000*joueson,50); 
}
}

if (AppuiBouton == true && positionjeu == 3)    
{
if (millis() - lightNumberMillis2 >= lightNumberTempo2)    
{
j ++;
if (j > 9){j = 0;}
depart();
lightNumberMillis2 = millis(); 
tone (51, 1000*joueson,50); 
}
}

if (AppuiBouton == true && positionjeu == 4)    
{
if (millis() - lightNumberMillis3 >= lightNumberTempo3)    
{
k++;
if (k > 9){k = 0;}
depart();
lightNumberMillis3 = millis();  
tone (51, 1000*joueson,50); 
}
}

if (AppuiBouton == true && positionjeu == 5)   
{
if (millis() - lightNumberMillis4 >= lightNumberTempo4)   
{
m++;
if (m > 9){m = 0;}
depart();
lightNumberMillis4 = millis();   
tone (51, 1000*joueson,50); 
}
}


if(boutonEvent == true && positionjeu==0)
{
  // Ecrit la structure en mémoire




lcd.clear();  
lcd.setCursor(0,0);   
lcd.print("GENERATION DE LA");
lcd.setCursor(0,1);
lcd.print("COMBINAISON ...");
premier=random(10);
deuxieme=random(10);
troisieme=random(10);
quatrieme=random(10);
aleatoire();
i = 0;  
j = 0;
k = 0;
m = 0;
lcd.clear();  
lcd.setCursor(2,0);   
lcd.print("BUZZER POUR");
lcd.setCursor(0,1); 
lcd.print("HACKER LE COFFRE");
positionjeu = 1;
boutonEvent = false; 
depart();

if (digitalRead(interu) == LOW) 
{lightNumberTempo = 150; lightNumberTempo2 = 110; lightNumberTempo3 = 80; lightNumberTempo4 = 40;}
else 
{lightNumberTempo = 250;lightNumberTempo2 = 210;lightNumberTempo3 = 180;lightNumberTempo4 = 140;}
}

if(boutonEvent == true && positionjeu==1)
{
lcd.clear();  
lcd.setCursor(1,0); 
lcd.print("HACK EN COURS");
lcd.setCursor(2,1);
lcd.print("NIVEAU 1 ..."); 
positionjeu = 2;
boutonEvent = false; 
AppuiBouton = true;
}

if(boutonEvent == true && positionjeu==2) 
{
if (premier==i) {
digitalWrite(led1rouge,HIGH);
lcd.clear();  
lcd.setCursor(1,0);  
lcd.print("HACK EN COURS");
lcd.setCursor(2,1);  
lcd.print("NIVEAU 2 ...");
positionjeu = 3;
boutonEvent = false; 
AppuiBouton = true; 
depart();
}
else {AppuiBouton = false;
positionjeu = 9;
perdu();
}
}

if(boutonEvent == true && positionjeu == 3) 
{
if (deuxieme==j) {
digitalWrite(led2rouge,HIGH);
lcd.clear();  
lcd.setCursor(1,0);   
lcd.print("HACK EN COURS");
lcd.setCursor(2,1);   
lcd.print("NIVEAU 3 ...");
AppuiBouton = true;
positionjeu = 4;
boutonEvent = false;  
depart(); 
}
else {
AppuiBouton = false;
positionjeu = 9;
perdu();
}
}

if(boutonEvent == true && positionjeu == 4) 
{
if (troisieme==k) {
digitalWrite(led3rouge,HIGH);
lcd.clear();  
lcd.setCursor(1,0); 
lcd.print("HACK EN COURS");
lcd.setCursor(2,1);  
lcd.print("NIVEAU 4 ...");
AppuiBouton = true;
positionjeu = 5;
boutonEvent = false;  
depart();
}
else {AppuiBouton = false;
positionjeu = 9;
perdu();
}
}

if(boutonEvent == true && positionjeu == 5)    
{
if (quatrieme==m) {
gagne();
AppuiBouton = true;
positionjeu = 6;
boutonEvent = false;  
delay(2000);
lcd.clear();  
lcd.setCursor(3,0);   
lcd.print("RECOMPENSE");
lcd.setCursor(4,1);  
lcd.print("EN COURS");
delay(1000);
Bras1.write(0); 
delay(1*reward);
Bras1.write(120);
delay(3000);
lcd.clear();  
lcd.setCursor(0,0);   
lcd.print("PROCHAINE PARTIE");
lcd.setCursor(3,1);  
lcd.print("DANS 3 ...");
delay(1000);
lcd.setCursor(3,1);   
lcd.print("DANS 2 ...");
delay(1000);
lcd.setCursor(3,1);  
lcd.print("DANS 1 ...");
delay(1000);
positionjeu = 0;
boutonEvent = false; 
lcd.clear();  
lcd.setCursor(2,0); 
lcd.print("BUZZER POUR");
lcd.setCursor(2,1); 
lcd.print("RECOMMENCER");
}
else {AppuiBouton = false;
positionjeu = 9;
perdu();
}
}

if (boutonEvent == true && positionjeu == 9)
{
positionjeu = 0;
boutonEvent = false;    
digitalWrite(51,LOW);
lcd.clear();  
lcd.setCursor(6,0);  
lcd.print("FIN");
lcd.setCursor(3,1);   
lcd.print("DE PARTIE");
lcd.clear();  
lcd.setCursor(2,0);   
lcd.print("BUZZER POUR");
lcd.setCursor(2,1);   
lcd.print("RECOMMENCER");
eteindre();
}
}

void aleatoire ()
{
 display.setSegments(tire, 1, 0); 
   tone (51, 200*joueson,50);
   delay(250);
  display.showNumberDec(premier, true, 1, 0); // (Nombre à afficher, pas touche , pas touche , position sur ecran à gauche = 0 à droite = 3)
  delay(250);
   tone (51, 200*joueson,50);
 display.setSegments(tire, 1, 1); 
   delay(250);
  display.showNumberDec(deuxieme, true, 1, 1); 
  delay(250);
   tone (51, 200*joueson,50);
   display.setSegments(tire, 1, 2);
   delay(250);
  display.showNumberDec(troisieme, true, 1, 2);
  delay(250);
   tone (51, 200*joueson,50);
   display.setSegments(tire, 1, 3);
   delay(250);
  display.showNumberDec(quatrieme, true, 1, 3);
  delay(250);
   tone (51, 1000*joueson,400);
}

void depart ()
{
  display2.showNumberDec(i, true, 1, 0); 
  display2.showNumberDec(j, true, 1, 1); 
  display2.showNumberDec(k, true, 1, 2); 
  display2.showNumberDec(m, true, 1, 3);
}


void allume ()
{
 digitalWrite(led1rouge,HIGH);
  digitalWrite(led2rouge,HIGH);
   digitalWrite(led3rouge,HIGH);
    digitalWrite(led4rouge,HIGH);

  
      
}


void eteindre ()
{
 digitalWrite(led1rouge,LOW);
  digitalWrite(led2rouge,LOW);
   digitalWrite(led3rouge,LOW);
    digitalWrite(led4rouge,LOW);
      digitalWrite(ledverte,LOW);

}


void perdu () 
{

lcd.clear();  
lcd.setCursor(5,0);
lcd.print("PERDU !");
lcd.setCursor(0,1);  
lcd.print("MAUVAIS TIMING !");
allume();
tone (51,200*joueson,350); 
delay(300);
eteindre();
tone (51,200*joueson,30); 
delay(300);
allume();
tone (51,200*joueson,30); 
delay(300);
eteindre();
tone (51,200*joueson,30); 
delay(300);
allume();
tone (51,200*joueson,30); 
delay(300);
eteindre();
}

void gagne ()
{
lcd.clear();  
lcd.setCursor(5,0);
lcd.print("BRAVO !");
lcd.setCursor(1,1);  
lcd.print("COFFRE OUVERT !");
allume();
delay(300);
tone (51,1300*joueson,30); 
eteindre();
delay(300);
allume();
delay(300);
tone (51,1300*joueson,30); 
eteindre();
     digitalWrite(ledverte,HIGH);
     delay(300);
     tone (51,1500*joueson,30); 
          digitalWrite(ledverte,LOW);
          delay(300);
               tone (51,1500*joueson,40); 
          digitalWrite(ledverte,HIGH);
 delay(300);
     tone (51,1500*joueson,50); 
          digitalWrite(ledverte,LOW);
          delay(300);
               tone (51,1500*joueson,400); 
          digitalWrite(ledverte,HIGH);
}

void clignote ()
{

static unsigned long startms = 0;
static unsigned long blinkms = 0;
startms = millis(); // init time
if (boutonEvent == false && positionjeu==0 && startms && millis() - startms <= blinkDuration)
{
if (millis() - blinkms >= blinkPeriod)
{
if (pos>6) {pos=1;}
if (pos==1) { eteindre (); digitalWrite(led1rouge, HIGH); }
if (pos==2) { eteindre (); digitalWrite(led2rouge, HIGH); }
if (pos==3) { eteindre (); digitalWrite(led3rouge, HIGH); }
if (pos==4) { eteindre (); digitalWrite(led4rouge, HIGH); }
if (pos==5) { eteindre (); digitalWrite(led3rouge, HIGH); }
if (pos==6) { eteindre (); digitalWrite(led2rouge, HIGH); }
pos++;
blinkms = millis();
}

if (digitalRead(buttonPin) == 0) {

// JE MAINTIEN APPUYER
eteindre ();
lcd.clear();  
lcd.setCursor(2,0);
lcd.print("STATISTIQUES");
lcd.setCursor(4,1);  
lcd.print("PARTIES");
delay(1000);
lcd.clear();  
lcd.setCursor(2,0);
lcd.print("JOUEES : ");lcd.print(valeur_1);
lcd.setCursor(1,1);  
lcd.print("GAGNEES : "); lcd.print(valeur_2);
delay(3500);
lcd.clear();  
lcd.setCursor(1,0);
lcd.print("TAUX REUSSITE");
lcd.setCursor(5,1);  
lcd.print(valeur_3);lcd.print(" %");
delay(3500);
lcd.clear();  
lcd.setCursor(2,0);   
lcd.print("BUZZER POUR");
lcd.setCursor(5,1);   
lcd.print("JOUER");
}
else {} //RELACHE

if (digitalRead(buttonPin2) == 0 && AppuiBouton2 == false)   {
  joueson = 0;
  lcd.clear();  
lcd.setCursor(6,0);
lcd.print("SON");
lcd.setCursor(4,1);  
lcd.print("INACTIF");
delay(1000);
lcd.clear();  
lcd.setCursor(2,0);   
lcd.print("BUZZER POUR");
lcd.setCursor(5,1);   
lcd.print("JOUER");
	AppuiBouton2= true; 

}
if (digitalRead(buttonPin2) == 0 && AppuiBouton2 == true)   {
   joueson = 1;
          tone (51,1500,200); 
  lcd.clear();  
lcd.setCursor(6,0);
lcd.print("SON");
lcd.setCursor(5,1);  
lcd.print("ACTIF");
delay(1000);
lcd.clear();  
lcd.setCursor(2,0);   
lcd.print("BUZZER POUR");
lcd.setCursor(5,1);   
lcd.print("JOUER");
	AppuiBouton2= false; 


}


}
else
{
startms = 0;
  }
}

Bon week-end

Merci du partage - si vous pressez cmd-T (Mac) ou ctrl-T (PC) dans l’IDE, ça indenterait le code et ce serait beaucoup plus lisible.

Merci beaucoup, je vais pouvoir comparer avec ce que j'ai réussi à faire hier et corriger mes petits bugs restants. ( Genre ma boucle qui fait tourner les chiffres qui démarre toute seule quoi que je fasse).

Le code ne semble pas complet par exemple buttonPin n'est pas définie et je vois des références directes comme par exemple il serait bon de mettre la pin 51 en OUTPUT (et de lui donner un petit nom, genre buzzerPin) parce que vous faites des

ou encore dans ce code

pourquoi initialisez vous startms à chaque fois ?

ce faisant le test millis() - startms <= blinkDuration est toujours vrai car la différence sera sans doute 0.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.