Un aperçu de ce que pourrait donner ce jeu de 421, avec un affichage lumineux dans des dalles d’Altuglas gravées.
L’affichage de la valeur d’un dé se fait avec seulement 4 « allumages » de led :
- une led centrale
- deux leds au milieu de chaque cotés
- une led en bas à gauche et une led en haut à droite, groupées. (+ le 1 bien sur)
- une led en haut à gauche et une led en bas à droite, groupées. (+ le 3 )
- = le 4 + le 3 et le 1
- = le 2 + le 3 et le 4
Un câblage qui utilise toutes les entrées-sorties de la carte ! :
- 4 X 3 sorties leds pour les 3 dés
- 4 entrées pour les boutons
- 2 entrées pour l’affichage 7 segments
Un aperçu du programme arduino (à améliorer certes !)
#include "SevenSegmentTM1637.h"
const int D1_1 = 2; // the number of the pushbutton pin
const int D1_2 = 3; // the number of the pushbutton pin
const int D1_3 = 4; // the number of the pushbutton pin
const int D1_4 = 5; // the number of the pushbutton pin
const int D2_1 = 6; // the number of the pushbutton pin
const int D2_2 = 7; // the number of the pushbutton pin
const int D2_3 = 8; // the number of the pushbutton pin
const int D2_4 = 9; // the number of the pushbutton pin
const int D3_1 = 10; // the number of the pushbutton pin
const int D3_2 = 11; // the number of the pushbutton pin
const int D3_3 = 12; // the number of the pushbutton pin
const int D3_4 = 13; // the number of the pushbutton pin
const int Bt_1 = 15; // the number of the pushbutton pin
const int Bt_2 = 16; // the number of the pushbutton pin
const int Bt_3 = 17; // the number of the pushbutton pin
const int Bt_G = 14; // the number of the pushbutton pin
const byte PIN_CLK = 18; // define CLK pin (any digital pin)
const byte PIN_DIO = 19; // define DIO pin (any digital pin)
int Temps = 2000;
bool Bt_GState = 0;
bool Bt_1State = 0;
bool Bt_2State = 0;
bool Bt_3State = 0;
bool D1 = 0;
bool D2 = 0;
bool D3 = 0;
bool Jeu = 0; // jeu = 0 : charge ; jeu = 1 : decharge
bool Joueur = 0 ; //joueur1 = 0 : joueur2 = 1
bool Debut = 0 ; // debut = 0 joueur1 debute sinon joueur2
int Val = 0;
int Val1 = 0;
int Val2 = 0;
int Score = 0;
int Score1 = 0 ;
int Score2 = 0 ;
int Jetons1 = 0 ;
int Jetons2 = 0 ;
int Lance = 0; // si jeu = 1 lance = 3
int Pot = 21;
int Temp ;
String Seg;
String ScoreT;
int Tirage[3];
SevenSegmentTM1637 display(PIN_CLK, PIN_DIO);
void setup() {
Serial.begin(9600); // initializes the Serial connection @ 9600 baud
display.begin(); // initializes the display
display.setBacklight(100); // set the brightness to 100 %
display.print("INIT"); // display INIT on the display
pinMode(14, INPUT_PULLUP);
pinMode(15, INPUT_PULLUP);
pinMode(16, INPUT_PULLUP);
pinMode(17, INPUT_PULLUP);
for (int thisPin = 2; thisPin < 14; thisPin++) {
pinMode(thisPin, OUTPUT);
}
randomSeed(analogRead(7));
delay(Temps); // wait 1000 ms
Efface();
Affiche(1, 4);
Affiche(2, 2);
Affiche(3, 1);
delay(Temps);
Efface();
}
void loop() {
while (Pot < 22 && Pot > 0) { // phase de charge
Jeu = false;
if(!Joueur){
Efface();
// Serial.print("Joueur : ");
// Serial.println(Joueur + 1);
while(!Bt_GState && !Joueur) {
AfficheJoueur();
if (digitalRead(Bt_G) == LOW){ Bt_GState = 1;
//Serial.println("Prêt au Lancement des dés");
}
LanceCharge();
}
}
if(Joueur){
Efface();
// Serial.print("Joueur : ");
// Serial.println(Joueur + 1);
while(!Bt_GState && Joueur) {
AfficheJoueur();
if (digitalRead(Bt_G) == LOW){ Bt_GState = 1;
Serial.println("Prêt au Lancement des dés J2");
}
LanceCharge();
}
}
}
if (Pot == 0 && Jeu == false) { // phase de decharge
if (Jetons1 > Jetons2) {
int tmp = Jetons1;
Jetons1 = Jetons2;
Jetons2 = tmp;
}
Jeu = true;
display.clear();
display.setColonOn(0);
display.print("DECHARGE");
Joueur = 0;
AfficheJoueur();
// Serial.print("Passage en phase decharge : ");
// Serial.println(Jeu);
Efface();
}
while (Jetons1 > 0 && Jetons2 > 0 && Jeu == true) {
if(!Joueur){
while(!Bt_GState && !Joueur) {
AfficheJoueur();
Efface();
if (digitalRead(Bt_G) == LOW){ Bt_GState = 1;Serial.println("Prêt au Lancement des dés");}
if (Lance != 0) {
if (digitalRead(Bt_1) == LOW){ Bt_1State = !Bt_1State;Serial.println("Verouillage D1");}
if (digitalRead(Bt_2) == LOW){ Bt_2State = !Bt_2State;Serial.println("Verouillage D2");}
if (digitalRead(Bt_3) == LOW){ Bt_3State = !Bt_3State;Serial.println("Verouillage D3");}
if (Bt_1State){ D1=1;
Affiche(1, Tirage[0]);}
if (Bt_2State){ D2=1;
Affiche(2, Tirage[1]);}
if (Bt_3State){ D3=1;
Affiche(3, Tirage[2]);}
}
LanceDecharge();
}
}
if(Joueur){
while(!Bt_GState && Joueur) {
AfficheJoueur();
Efface();
if (digitalRead(Bt_G) == LOW){ Bt_GState = 1;Serial.println("Prêt au Lancement des dés");}
if (Lance != 0) {
if (digitalRead(Bt_1) == LOW){ Bt_1State = !Bt_1State; }
if (digitalRead(Bt_2) == LOW){ Bt_2State = !Bt_2State; }
if (digitalRead(Bt_3) == LOW){ Bt_3State = !Bt_3State; }
if (Bt_1State){ D1=1;
Affiche(1, Tirage[0]);}
if (Bt_2State){ D2=1;
Affiche(2, Tirage[1]);}
if (Bt_3State){ D3=1;
Affiche(3, Tirage[2]);}
}
LanceDecharge();
}
}
}
if(Pot==0 && Jetons1==0){display.clear();
display.setColonOn(0);
display.print("JOUEUR 1 GAGNE");
if (digitalRead(Bt_G) == LOW){
Jeu = 0; Jetons1 = Jetons2 = 0 ; Pot = 21; display.clear(); display.print("Reset");}
}
if(Pot==0 && Jetons2==0){display.clear();
display.setColonOn(0);
display.print("JOUEUR 2 GAGNE");
if (digitalRead(Bt_G) == LOW){
Jeu = 0; Jetons1 = Jetons2 = 0 ; Pot = 21; display.clear(); display.print("Reset");}}
}
void Efface() {
//if(!D1) {
digitalWrite (D1_1, LOW);
digitalWrite (D1_2, LOW);
digitalWrite (D1_3, LOW);
digitalWrite (D1_4, LOW);
// }
// if(!D2) {
digitalWrite (D2_1, LOW);
digitalWrite (D2_2, LOW);
digitalWrite (D2_3, LOW);
digitalWrite (D2_4, LOW);
//}
//if(!D3) {
digitalWrite (D3_1, LOW);
digitalWrite (D3_2, LOW);
digitalWrite (D3_3, LOW);
digitalWrite (D3_4, LOW);
//}
}
void LanceCharge() {
if (Bt_GState == 1 && Jeu == false) {
Serial.println("Lancement des dés");
//Efface();
Tirage[0] = random(1, 7); Tirage[1] = random(1, 7); Tirage[2] = random(1, 7);
Tri();
// Serial.print("Tirage : ");
// Serial.print(Tirage[0]);
// Serial.print(Tirage[1]);
// Serial.println(Tirage[2]);
Affiche(1, Tirage[0]);
Affiche(2, Tirage[1]);
Affiche(3, Tirage[2]);
delay (Temps);
CalculScore();
// Serial.println("Calcul score");
if(Joueur){ CalculJetons();
AfficheJetons();
}
Joueur = !Joueur;
// Serial.print("Passage au joueur : ");
// Serial.println(Joueur + 1);
Bt_GState = 0; //Serial.println("Remise à zéro du lancement");
}
}
void LanceDecharge() {
if (Bt_GState == 1 && Jeu == true) {
Lance += 1;
// Serial.print("N° lancement: "); Serial.println(Lance);
// Serial.print("D1-D2-D3 avant tirage : ");
// Serial.print(D1); Serial.print(D2); Serial.println(D3);
if (Lance < 4){
if (!D1) {Tirage[0] = random(1, 7);}
if (!D2) {Tirage[1] = random(1, 7);}
if (!D3) {Tirage[2] = random(1, 7);}
Tri();
// Serial.print("Tirage Décharge: ");
// Serial.print(Tirage[0]);
// Serial.print(Tirage[1]);
// Serial.println(Tirage[2]);
Efface();
Affiche(1, Tirage[0]);
Affiche(2, Tirage[1]);
Affiche(3, Tirage[2]);
Bt_1State = Bt_2State = Bt_3State = D1 = D2 = D3 = 0;
delay (Temps);
if(Lance==3){
CalculScore(); Lance = 0;
// Serial.println("Calcul score Décharge");
if(Joueur){
CalculJetons();
// Serial.println("Calcul jetons Décharge");
AfficheJetons();
// Serial.println("Affiche Jetons Decharge");}
Joueur = !Joueur;
// Serial.print("Passage au joueur : ");
// Serial.println(Joueur + 1);
}
}
Bt_GState = 0; //Serial.println("Remise à zéro du lancement");
}
}
void Affiche(int nd, int d) {
if (d == 1) {
if (nd == 1) {
digitalWrite (D1_1, HIGH);
}
if (nd == 2) {
digitalWrite (D2_1, HIGH);
}
if (nd == 3) {
digitalWrite (D3_1, HIGH);
}
}
if (d == 2) {
if (nd == 1) {
digitalWrite (D1_2, HIGH);
}
if (nd == 2) {
digitalWrite (D2_2, HIGH);
}
if (nd == 3) {
digitalWrite (D3_2, HIGH);
}
}
if (d == 3) {
if (nd == 1) {
digitalWrite (D1_1, HIGH);
digitalWrite (D1_3, HIGH);
}
if (nd == 2) {
digitalWrite (D2_1, HIGH);
digitalWrite (D2_3, HIGH);
}
if (nd == 3) {
digitalWrite (D3_1, HIGH);
digitalWrite (D3_3, HIGH);
}
}
if (d == 4) {
if (nd == 1) {
digitalWrite (D1_4, HIGH);
digitalWrite (D1_3, HIGH);
}
if (nd == 2) {
digitalWrite (D2_4, HIGH);
digitalWrite (D2_3, HIGH);
}
if (nd == 3) {
digitalWrite (D3_4, HIGH);
digitalWrite (D3_3, HIGH);
}
}
if (d == 5) {
if (nd == 1) {
digitalWrite (D1_1, HIGH);
digitalWrite (D1_3, HIGH);
digitalWrite (D1_4, HIGH);
}
if (nd == 2) {
digitalWrite (D2_1, HIGH);
digitalWrite (D2_3, HIGH);
digitalWrite (D2_4, HIGH);
}
if (nd == 3) {
digitalWrite (D3_1, HIGH);
digitalWrite (D3_3, HIGH);
digitalWrite (D3_4, HIGH);
}
}
if (d == 6) {
if (nd == 1) {
digitalWrite (D1_2, HIGH);
digitalWrite (D1_3, HIGH);
digitalWrite (D1_4, HIGH);
}
if (nd == 2) {
digitalWrite (D2_2, HIGH);
digitalWrite (D2_3, HIGH);
digitalWrite (D2_4, HIGH);
}
if (nd == 3) {
digitalWrite (D3_2, HIGH);
digitalWrite (D3_3, HIGH);
digitalWrite (D3_4, HIGH);
}
}
}
void Tri() {
while (Tirage[0] < Tirage[1] || Tirage[0] < Tirage[2] || Tirage[1] < Tirage[2]) {
if (Tirage[0] < Tirage[1]) {
Temp = Tirage[0];
Tirage[0] = Tirage[1];
Tirage[1] = Temp;
}
if (Tirage[1] < Tirage[2]) {
Temp = Tirage[1];
Tirage[1] = Tirage[2];
Tirage[2] = Temp;
}
}
}
void CalculScore() {
// tri des des
Tri();
// combinaisons
// 421
if (Tirage[0] == 4 && Tirage[1] == 2 && Tirage[2] == 1 ) {
Val = 100;
(!Joueur) ? Val1 = Val : Val2 = Val;
}
// 111
if (Tirage[0] == 1 && Tirage[1] == 1 && Tirage[2] == 1 ) {Val = 70;
(!Joueur) ? Val1 = Val : Val2 = Val;}
// 666 - 611
if ( Tirage[0] == Tirage[1] && Tirage[1] == Tirage[2] && Tirage[0] == 6 ) {Val = 66;
(!Joueur) ? Val1 = Val : Val2 = Val;}
if ( Tirage[0] == 6 && Tirage[1] == 1 && Tirage[2] == 1 ) {Val = 65;
(!Joueur) ? Val1 = Val : Val2 = Val;}
// 555 - 511
if ( Tirage[0] == Tirage[1] && Tirage[1] == Tirage[2] && Tirage[0] == 5 ) { Val = 55;
(!Joueur) ? Val1 = Val : Val2 = Val;}
if ( Tirage[0] == 5 && Tirage[1] == 1 && Tirage[2] == 1 ) { Val = 54;
(!Joueur) ? Val1 = Val : Val2 = Val;}
// 444 - 411
if ( Tirage[0] == Tirage[1] && Tirage[1] == Tirage[2] && Tirage[0] == 4 ) { Val = 44;
(!Joueur) ? Val1 = Val : Val2 = Val;}
if ( Tirage[0] == 4 && Tirage[1] == 1 && Tirage[2] == 1 ) { Val = 43;
(!Joueur) ? Val1 = Val : Val2 = Val;}
// 333 - 311
if ( Tirage[0] == Tirage[1] && Tirage[1] == Tirage[2] && Tirage[0] == 3 ) { Val = 33;
(!Joueur) ? Val1 = Val : Val2 = Val;}
if ( Tirage[0] == 3 && Tirage[1] == 1 && Tirage[2] == 1 ) { Val = 32;
(!Joueur) ? Val1 = Val : Val2 = Val;
}
// 222 - 211
if ( Tirage[0] == Tirage[1] && Tirage[1] == Tirage[2] && Tirage[0] == 2 ) { Val = 22;
(!Joueur) ? Val1 = Val : Val2 = Val;}
if ( Tirage[0] == 2 && Tirage[1] == 1 && Tirage[2] == 1 ) { Val = 21;
(!Joueur) ? Val1 = Val : Val2 = Val;}
// Suites
if ( Tirage[0] == 6 && Tirage[1] == 5 && Tirage[2] == 4 ) { Val = 20;
(!Joueur) ? Val1 = Val : Val2 = Val;}
if ( Tirage[0] == 5 && Tirage[1] == 4 && Tirage[2] == 3 ) { Val = 19;
(!Joueur) ? Val1 = Val : Val2 = Val;}
if ( Tirage[0] == 4 && Tirage[1] == 3 && Tirage[2] == 2 ) { Val = 18;
(!Joueur) ? Val1 = Val : Val2 = Val;}
if ( Tirage[0] == 3 && Tirage[1] == 2 && Tirage[2] == 1 ) { Val = 17;
(!Joueur) ? Val1 = Val : Val2 = Val;}
//221 Nenette
if ( Tirage[0] == 2 && Tirage[1] == 2 && Tirage[2] == 1 ) { Val = 16;
(!Joueur) ? Val1 = Val : Val2 = Val;}
// Hors combinaisons
if ( Val1 == 0 && Val2 == 0){
Val =Tirage[0] * 100 + Tirage[1] * 10 + Tirage[2];
Val1 = Val;
//Serial.print("Hors combinaison J1 : ");
//Serial.println(Val1);
}
if (Val1>100 && Val2==0 && Joueur) { Val = 0;
Val =Tirage[0] * 100 + Tirage[1] * 10 + Tirage[2];
Val2 = Val;
//Serial.print("Hors combinaison J2 : ");
//Serial.println(Val2);
}
if (Joueur) {
if ( Val1 - Val2 == 0 ) { Score1 = 0; Score2 = 0;}
if ((Val1 <101 && Val1 > Val2 )||(Val1 <101 && Val2 > 100 )) {Score2 = 0;
switch(Val1){
case(100): Score1 = 10;break;
case(70): Score1 = 7;break;
case(66): Score1 = 6;break;
case(65): Score1 = 6;break;
case(55): Score1 = 5;break;
case(54): Score1 = 5;break;
case(44): Score1 = 4;break;
case(43): Score1 = 4;break;
case(33): Score1 = 3;break;
case(32): Score1 = 3;break;
case(22): Score1 = 2;break;
case(21): Score1 = 2;break;
case(20): Score1 = 2;break;
case(19): Score1 = 2;break;
case(18): Score1 = 2;break;
case(17): Score1 = 2;break;
case(16): Score1 = 4;break;
default: Score1 = 1;break;
}
}
if ((Val2<101 && Val1 < Val2 )||(Val2 <101 && Val1 > 100 )) {Score1 = 0;
switch(Val2){
case(100): Score2 = 10;break;
case(70): Score2 = 7;break;
case(66): Score2 = 6;break;
case(65): Score2 = 6;break;
case(55): Score2 = 5;break;
case(54): Score2 = 5;break;
case(44): Score2 = 4;break;
case(43): Score2 = 4;break;
case(33): Score2 = 3;break;
case(32): Score2 = 3;break;
case(22): Score2 = 2;break;
case(21): Score2 = 2;break;
case(20): Score2 = 2;break;
case(19): Score2 = 2;break;
case(18): Score2 = 2;break;
case(17): Score2 = 2;break;
case(16): Score2 = 4;break;
default: Score2 = 1;break;
}
}
if(Val1>100 && Val2>100) {
if (Val1==Val2) { Score1=Score2=0 ; //Serial.println("Egalité Hors combinaison ");
}
if(Val1>Val2){ Score1=1;}
if(Val2>Val1){ Score2=1;}
}
//Serial.print("Valeur Val1 : ");
// Serial.println(Val1);
// Serial.print("Valeur Val2 : ");
// Serial.println(Val2);
Val1 = Val2 = 0;
// Serial.print("Calcul du score : ");
// Serial.println(Score1 + Score2);
}
}
void CalculJetons() {
if (!Jeu) {
if (Score1 > Pot) {
Score1 = Pot;
}
if (Score2 > Pot) {
Score2 = Pot;
}
if (Score1 > Score2) {
Jetons2 = Jetons2 + Score1;
}
if (Score2 > Score1) {
Jetons1 = Jetons1 + Score2;
}
Pot = Pot - Score1 - Score2;
Score1 = Score2 = 0;
// Serial.print("Calcul du pot : ");
// Serial.println(Pot);
}
if(Jeu) {
if (Score1 > Score2) {
if (Score1 > Jetons1) {
Score1 = Jetons1;
}
Jetons2 = Jetons2 + Score1;
Jetons1 = Jetons1 - Score1;
}
if (Score2 > Score1) {
if (Score2 > Jetons2) {
Score2 = Jetons2;
}
Jetons1 = Jetons1 + Score2;
Jetons2 = Jetons2 - Score2;
}
Score1 = Score2 = 0;
}
}
void AfficheJetons(){
String str1;
str1="J2";
String str2 = String(Jetons2);
if(Jetons2>=0 && Jetons2<=9){str2 = '0'+ str2;}
String str0 = str1 + str2;
display.clear();
display.setColonOn(1);
display.print(str0); // display LOOP on the display
delay(Temps);
String str3;
str3="J1";
String str4 = String(Jetons1);
if(Jetons1>=0 && Jetons1<=9){str4 = '0'+ str4;}
String str = str3 + str4;
display.clear();
display.setColonOn(1);
display.print(str); // display LOOP on the display
delay(Temps);
// Serial.print("Jetons joueur 1 : ");
// Serial.println(Jetons1);
// Serial.print("Jetons joueur 2 : ");
// Serial.println(Jetons2);
}
void AfficheJoueur(){
String str1;
(Joueur) ? str1="J2" : str1= "J1";
display.clear();
display.setColonOn(1);
display.print(str1); // display LOOP on the display
display.blink();
}
Voilà