// // ############################## // # JEU DE LA COURSE A 20 # // # Exemplaire avec des billes # // ############################## // # Guy Magli 17.02.2020 # // ############################## // # Conception, cablages # // # mises a jour, # // # contact... # // # www.magli.fr # // ############################## // // ! ======================== ! // ! LIBRAIRIES ET PARAMETRES ! // ! ======================== ! // // Afin d'eviter les problemes d'affichage et d'impression les signes diacritiques // ont ete retires des commentaires et des chaines de caracteres. // #include // Pour la communication avec un peripherique. #include // Pour la gestion des chaines de caracteres. #include // Pour l'écran // // ! ================================================= ! // ! VARIABLES GLOBALES, CONSTANTES ET INITIALISATIONS ! // ! ================================================= ! // // Pour l'écran // LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // // Pour les boutons // bool bJoueurCommence = false; bool bBoitierCommence = false; bool bJoueurChoisi = false; int iElectroAimant = 22; // // // : ------ : // : Divers : // : ------ : // int t; // Pour les boucles diverses. // // : -------------------------- : // : Pour le jeu proprement dit : // : -------------------------- : // int iNombreTotalDeMinutes = 20; // Nombre total de billes (course a 20). int iNombreDeBillesDejaRetirees = 0; // Billes deja retirees par les deux joueurs. int iNombreDeBillesARetirer = 0; // Billes a retirer pour ce coup de jeu. int iNombreDeBillesQuOnPeutRetirer = 2; // Billes qu'on peut retirer a chaque tour. int iNombreDePositionsGagnantes = 0; // Combien y a-t-il de positions gagnantes. int iPositionsGagnantes[20]; // Quelles sont toutes les positions gagnantes ? int iEnCours = 0; // Position qu'on est en train d'examiner ou de jouer. String cCommence = ""; // Doit contenir 'B' pour le boitier ou 'J' pour le joueur. int iCommence = 0; // Doit contenir 1 pour le JOUeur et 2 pour le BOItier. bool bJeuFini = false; // A-t-on retire la derniere ille ? int iDelai = 3000; // Temps d'attente. // // ! ===== ! // ! Setup ! // ! ===== ! // void setup() { // // : --------------- : // : Initialisations : // : --------------- : // // Initialisation des nombres aleatoires. // randomSeed(analogRead(0)); // initialise le generateur de nombres aleatoires // // L'ecran // lcd.begin(16, 2); // // L'électro-aimant // pinMode(iElectroAimant, OUTPUT); digitalWrite(iElectroAimant, LOW); } // // ! ==== ! // ! Loop ! // ! ==== ! // void loop() { // // Tant que l'Arduino est branchee, on joue, il n'y a pas de sortie possible, c'est une machine dediee apres tout ! // // : --------- : // : Generique : // : --------- : // lcd.setCursor(0, 0); lcd.print(" EVIAN 2020 "); lcd.setCursor(0, 1); lcd.print(" COURSE A 20 "); delay(iDelai); // // : ------------------------------ : // : On demande qui commence le jeu : // : ------------------------------ : // lcd.setCursor(0, 0); lcd.print(" QUI COMMENCE ? "); lcd.setCursor(0, 1); lcd.print(""); // On teste si le bouton de gauche est presse bJoueurChoisi = false; bJoueurCommence = false; bBoitierCommence = false; while (bJoueurChoisi == false) { lireBoutons(); } if (bJoueurCommence == true) { cCommence = "J"; // C'est le joueur qui commence. iCommence = 1; lcd.setCursor(0, 0); lcd.print(" LE JOUEUR "); lcd.setCursor(0, 1); lcd.print(" COMMENCE. "); } if (bBoitierCommence == true) { cCommence = "B"; // C'est le boitier qui commence. iCommence = 2; lcd.setCursor(0, 0); lcd.print(" LE BOITIER "); lcd.setCursor(0, 1); lcd.print(" COMMENCE. "); } delay(iDelai); DebuterLeJeu(); // if (cCommence == "B") { FaireJouerLeBoitier(); } // C'est le boitier qui commence. bJeuFini = false; while (bJeuFini == false) { if (bJeuFini == false) { FaireJouerLeJoueur(); } if (bJeuFini == false) { FaireJouerLeBoitier(); } } } // // ! ========== ! // ! Procedures ! // ! ========== ! // // : -------------- : // : Debuter le jeu : // : -------------- : // void DebuterLeJeu() { // // On cherche les positions gagnantes. // // On efface les positions gagnantes memorisees precedemment. // iNombreDePositionsGagnantes = 0; for (t = 0; t < iNombreDePositionsGagnantes; t++) // On efface les anciennes positions gagnantes. { iPositionsGagnantes[t] = 0; } // // La derniere bille est egalement une position gagnante, il convient de ne pas l'oublier ! // iNombreDePositionsGagnantes++; iPositionsGagnantes[iNombreDePositionsGagnantes] = iNombreTotalDeMinutes; // // On memorise les positions gagnantes. // iEnCours = iNombreTotalDeMinutes; // On examinera toutes les positions gagnantes en commencant par la fin. while (iEnCours >= (iNombreDeBillesQuOnPeutRetirer + 1)) { iNombreDePositionsGagnantes++; iPositionsGagnantes[iNombreDePositionsGagnantes] = (iEnCours - 1 - iNombreDeBillesQuOnPeutRetirer); iEnCours = iPositionsGagnantes[iNombreDePositionsGagnantes]; } // // On demarre et on initialise. // iNombreDeBillesDejaRetirees = 0; } // // : ---------------------- : // : Faire jouer le boitier : // : -----------------------: // void FaireJouerLeBoitier() { // // On cherche la prochaine position gagnante. // for (t = 1; t <= iNombreDePositionsGagnantes; t++) { // // Il faut que la position gagnante soit superieure au nombre de billes deja retirees. // if (iPositionsGagnantes[t] > iNombreDeBillesDejaRetirees) { // // Il ne faut pas retirer plus de billes que ce qui est autorise. // if ((iPositionsGagnantes[t] - iNombreDeBillesDejaRetirees) <= iNombreDeBillesQuOnPeutRetirer) { iNombreDeBillesARetirer = iPositionsGagnantes[t] - iNombreDeBillesDejaRetirees; } } } // // Si les positions gagnantes sont trop loin, on joue un nombre au hasard, dans les limites autorisees. // if ((iNombreDeBillesARetirer == 0) || (iNombreDeBillesARetirer > iNombreDeBillesQuOnPeutRetirer)) { iNombreDeBillesARetirer = random(1, iNombreDeBillesQuOnPeutRetirer + 1); } // // On redige le message sur l'ecran. // if (iNombreDeBillesARetirer == 1) { lcd.setCursor(0, 0); lcd.print(" BOITIER RETIRE "); lcd.setCursor(0, 1); lcd.print(" 1 BILLE. "); retireUneBille(); } else { lcd.setCursor(0, 0); lcd.print(" BOITIER RETIRE "); lcd.setCursor(0, 1); lcd.print(" 2 BILLES. "); retireUneBille(); retireUneBille(); } iNombreDeBillesDejaRetirees = iNombreDeBillesDejaRetirees + iNombreDeBillesARetirer; delay(iDelai); // // C'est peut-etre la fin du jeu. // if (iNombreDeBillesDejaRetirees >= iNombreTotalDeMinutes) { bJeuFini = true; iNombreDeBillesDejaRetirees = 0; lcd.setCursor(0, 0); lcd.print(" VOUS PERDEZ ! "); lcd.setCursor(0, 1); lcd.print(" HELAS ! "); delay(iDelai * 2); } } // // : ---------------------- : // : Faire jouer le joueur : // : ---------------------- : // void FaireJouerLeJoueur() { // // On demande combien de billes le joueur retire. // // Sur l'ecran. // lcd.setCursor(0, 0); lcd.print(" COMBIEN ? "); lcd.setCursor(0, 1); lcd.print("<1 2>"); bJoueurChoisi = false; bJoueurCommence = false; bBoitierCommence = false; while (bJoueurChoisi == false) { lireBoutons(); } // On teste si le bouton de gauche est presse if (bJoueurCommence == true) // Le bouton de gauche { bJoueurChoisi = true; iNombreDeBillesARetirer = 1; } else { bJoueurChoisi = true; iNombreDeBillesARetirer = 2; } // // On redige le message. // if (iNombreDeBillesARetirer == 1) { lcd.setCursor(0, 0); lcd.print(" VOUS RETIREZ "); lcd.setCursor(0, 1); lcd.print(" 1 BILLE. "); retireUneBille(); } else { lcd.setCursor(0, 0); lcd.print(" VOUS RETIREZ "); lcd.setCursor(0, 1); lcd.print(" 2 BILLES. "); retireUneBille(); retireUneBille(); } iNombreDeBillesDejaRetirees = iNombreDeBillesDejaRetirees + iNombreDeBillesARetirer; if (iNombreDeBillesDejaRetirees < 10) { } delay(iDelai); // // Est-ce la fin ? // if (iNombreDeBillesDejaRetirees >= iNombreTotalDeMinutes) { // // Message de victoire du joueur sur l'ecran LCD. // bJeuFini = true; iNombreDeBillesDejaRetirees = 0; lcd.setCursor(0, 0); lcd.print(" VOUS GAGNEZ ! "); lcd.setCursor(0, 1); lcd.print(" BRAVO ! "); delay(iDelai * 2); } } // // : ------------------ : // : Recommencer le jeu : // : ------------------ : // void RecommencerLeJeu() { iNombreDeBillesARetirer = 0; iNombreDeBillesDejaRetirees = 0; iNombreDePositionsGagnantes = 0; } // // : ---------------------------- : // : Lire les boutons du bouclier : // : ---------------------------- : // void lireBoutons() { adc_key_in = analogRead(0); if (adc_key_in < 1000) { if (adc_key_in < 100) { bBoitierCommence = true; bJoueurChoisi = true; } else { if (adc_key_in < 450) { bJoueurCommence = true; bJoueurChoisi = true; } } } } // // : ---------------- : // : Retire une bille : // : ---------------- : // void retireUneBille() { digitalWrite(iElectroAimant, HIGH); delay(250); digitalWrite(iElectroAimant, LOW); delay(250); }