Pong with nucleo en shield

Dependencies:   C12832 LM75B MMA7660 Speaker mbed

Fork of app-shield-LCD by Chris Styles

Revision:
6:402e96a482a9
Parent:
4:39c7c31b8fb0
--- a/main.cpp	Fri Aug 01 14:30:24 2014 +0000
+++ b/main.cpp	Tue Jan 24 16:04:35 2017 +0000
@@ -1,20 +1,628 @@
 #include "mbed.h"
 #include "C12832.h"
+#include "MMA7660.h"
+#include "LM75B.h"
+#include "Speaker.h"
+#include <stdlib.h>
+#include <time.h>
+#include <string>
 
-// Using Arduino pin notation
-C12832 lcd(D11, D13, D12, D7, D10);
+  // Using Arduino pin notation
+  /************* LCD ****************/
+  C12832 lcd(D11, D13, D12, D7, D10);
+
+/********* Potentiometre *********/
+AnalogIn pot1(A0);
+AnalogIn pot2(A1);
+
+/************** LED ***************/
+DigitalOut r(D5);
+DigitalOut b(D8);
+DigitalOut g(D9);
+
+/*********** Analogue *************/
+DigitalIn up(A2); //AnalogIn
+DigitalIn down(A3);
+DigitalIn gau(A4);
+DigitalIn droi(A5);
+DigitalIn fire(D4);
+
+/*********** Speaker **************/
+Speaker spkr(D6);
+
+/********* Accelerometre **********/
+MMA7660 MMA(D14, D15);
+
+/***** Capteur de température *****/
+LM75B sensor(D14, D15);
+
+//Variable globale
+// Integer
+int horizontalBall = 35;
+int scorej1 = 0;
+int scorej2 = 0;
+int verticalJ1 = 0;
+int verticalJ2 = 0;
+int victoirej1 = 0;
+int victoirej2 = 0;
+int nbcontact = 0;
+int rapide = 3;
+int choix;
+int ajoutvit = 1;
+// Float
+float angle = 1.5;
+float verticalBall = 5.0;
+float vitesse = 0;
+float vitessebase = 0;
+// Boolean
+bool avance = true;
+bool recule = false;
+bool but = false;
+bool joue = true;
+bool diag1 = true;
+bool diag2 = false;
+bool partie = true;
+bool lance = true;
+bool stop = false;
+//String
+string tab[3] = {
+  "lent",
+  "normal",
+  "rapide"
+};;
+
+// Fonction du contact entre la balle et le joueur
+bool contact(int a, float b) {
+  nbcontact++;
+  // Fait accelerer la balle pour un certain nombre de contact
+  if (nbcontact % rapide == 0) {
+    if (vitesse > 0.03) {
+      vitesse = vitesse - 0.005;
+    }
+    if (ajoutvit < 4) {
+      ajoutvit++;
+    }
+  }
+  // Variation de l'angle en fonction d'ou est tapé la balle
+  if (a >= b + 2 && a <= b + 5) {
+    angle = 0.5;
+    return true;
+  } else if (a >= b - 1 && a <= b + 2) {
+    angle = 1.0;
+    return true;
+  } else if (a >= b - 4 && a <= b - 1) {
+    angle = 1.5;
+    return true;
+  } else {
+    return false;
+  }
+}
+
+// Fonction d'initialisationialisation
+void initialisation() {
+  horizontalBall = 50;
+  verticalBall = (rand() % 20) + 1;
+  avance = true;
+  recule = false;
+  but = false;
+  joue = true;
+  vitesse = vitessebase;
+  ajoutvit = 1;
+  lcd.cls();
+  // Décompte avant commencement de la partie
+  for (int i = 2; i > 0; i--) {
+    lcd.locate(35, 10);
+    lcd.printf("Commence dans %d", i);
+    wait(1);
+    lcd.cls();
+  }
+}
+
+// Fonction d'affichage
+void affichage() {
+  // Cadre du terrain
+  lcd.rect(32, 0, 127, 31, 1);
+  lcd.copy_to_lcd();
+
+  //Score
+  lcd.locate(0, 0);
+  lcd.printf("SCORE");
+  lcd.locate(2, 12);
+  lcd.printf("J1");
+  lcd.locate(3, 20);
+  lcd.printf("%d", scorej1);
+  lcd.locate(15, 12);
+  lcd.printf("J2");
+  lcd.locate(16, 20);
+  lcd.printf("%d", scorej2);
+
+  //bar 1
+  verticalJ1 = (float) pot1 * 22;
+  lcd.locate(35, verticalJ1);
+  lcd.printf("l");
+
+  // bar 2
+  verticalJ2 = (float) pot2 * 22;
+  lcd.locate(120, verticalJ2);
+  lcd.printf("l");
 
-int main()
-{
-    int j=0;
+  //balle
+  lcd.locate(horizontalBall, verticalBall);
+  lcd.printf("o");
+}
+
+// Fonction de son pour le démarrage
+void son(float f) {
+  spkr.PlayNote(969.0 * f, 0.1, 1.1);
+  spkr.PlayNote(800.0 * f, 0.1, 1.1);
+  spkr.PlayNote(768.0 * f, 0.1, 1.1);
+  spkr.PlayNote(879.0 * f, 0.1, 1.1);
+}
+
+// Fonction de son pour un but
+void son_marque() {
+  spkr.PlayNote(1200.0, 0.1, 1.1);
+  spkr.PlayNote(900.0, 0.1, 1.1);
+  spkr.PlayNote(1000.0, 0.1, 1.1);
+  spkr.PlayNote(700.0, 0.1, 1.1);
+}
+
+// Fonction de son pour une victoire
+void son_victoire() {
+  spkr.PlayNote(1800.0, 0.2, 0.8);
+  wait(0.03);
+  spkr.PlayNote(1800.0, 0.2, 0.8);
+  wait(0.03);
+  spkr.PlayNote(1800.0, 0.5, 0.8);
+  wait(0.03);
+  spkr.PlayNote(600.0, 0.7, 1.1);
+  wait(0.03);
+  spkr.PlayNote(1800.0, 0.2, 0.8);
+  wait(0.03);
+  spkr.PlayNote(1600.0, 0.2, 0.8);
+  wait(0.03);
+  spkr.PlayNote(1800.0, 0.2, 0.8);
+  wait(0.03);
+  spkr.PlayNote(1800.0, 0.5, 0.8);
+  wait(0.03);
+  spkr.PlayNote(600.0, 0.7, 1.1);
+}
+
+// Fonction de son lors d'un contact avec
+void son_contact() {
+  spkr.PlayNote(900.0, 0.1, 1.1);
+}
+
+// Fonction pour le mouvement de la balle
+void mouvement_balle(bool av, bool rec) {
+  // Fonction pour faire avancer ou reculer la balle
+  if (av) {
+    horizontalBall = horizontalBall + ajoutvit;
+  }
+  if (rec) {
+    horizontalBall = horizontalBall - ajoutvit;
+  }
+  // Fonction pour le rebond de la balle sur le haut et le bas de l'écran
+  if (diag1) {
+    verticalBall = verticalBall + angle;
+  }
+  if (diag2) {
+    verticalBall = verticalBall - angle;
+  }
+  if (verticalBall < 0) {
+    diag1 = true;
+    diag2 = false;
+  }
+  if (verticalBall > 22) {
+    diag1 = false;
+    diag2 = true;
+  }
+}
+
+// Fonction pour le but
+void marque() {
+  // Si c'est le joueur qui marque
+  if (horizontalBall >= 115) {
+    // Si il y a contact la balle repart
+    if (contact(verticalJ2, verticalBall)) {
+      son_contact();
+      avance = false;
+      recule = true;
+    }
+    // Sinon il y a but
+    else {
+      but = true;
+      scorej1++;
+      son_marque();
+      joue = false;
+      r = 0;
+      b = 1;
+      g = 1;
+      wait(0.2);
+      r = 1;
+      b = 1;
+      g = 1;
+    }
+  }
+  // Si c'est le joueur 2 qui marque
+  if (horizontalBall <= 35) {
+    // Si il y a contact la balle repart
+    if (contact(verticalJ1, verticalBall)) {
+      son_contact();
+      avance = true;
+      recule = false;
+    }
+    // Sinon il y a but
+    else {
+      but = true;
+      scorej2++;
+      son_marque();
+      joue = false;
+      r = 1;
+      b = 0;
+      g = 1;
+      wait(0.2);
+      r = 1;
+      b = 1;
+      g = 1;
+    }
+  }
+}
+
+// Fonction de lancement du jeux
+void commencement() {
+  lcd.rect(0, 0, 127, 31, 1);
+  lcd.copy_to_lcd();
+  scorej1 = 0;
+  scorej2 = 0;
+  // Menu pour le choixx de la vitesse
+  while (!fire) {
+    lcd.locate(25, 10);
+    lcd.printf("choixsissez la vitesse");
+    lcd.locate(50, 18);
+    lcd.printf("- %s", tab[choix]);
+    // Monte dans le menu
+    if (!up) {
+      choix++;
+      if (choix > 2) {
+        choix = 0;
+      }
+    }
+    // Descend dans le menu
+    if (!down) {
+      choix--;
+      if (choix < 0) {
+        choix = 2;
+      }
+    }
+    wait(0.2);
     lcd.cls();
-    lcd.locate(0,3);
-    lcd.printf("mbed application shield!");
+  }
+  // Liste des choixx de vitesse
+  switch (choix) {
+  case 0:
+    vitessebase = 0.09;
+    rapide = 5;
+    break;
+  case 1:
+    vitessebase = 0.07;
+    rapide = 3;
+    break;
+  case 2:
+    vitessebase = 0.05;
+    rapide = 2;
+    ajoutvit = 2;
+    break;
+  default:
+    vitessebase = 0.09;
+    rapide = 5;
+  }
+  partie = true;
+  lance = false;
+}
+
+// Fonction pour savoir qui gagne
+void victoire() {
+  /* Si le score arrive à 5
+   * On ajoute une victoire pour le joueur qui gagne
+   * Appel de la fonction de musique de victoire
+   */
+  if (scorej1 == 5) {
+    lcd.cls();
+    lcd.locate(25, 10);
+    lcd.printf("Victoire du joueur 1");
+    son_victoire();
+    victoirej1++;
+    wait(2);
+    partie = false;
+  }
+  if (scorej2 == 5) {
+    lcd.cls();
+    lcd.locate(25, 10);
+    lcd.printf("Victoire du joueur 2");
+    son_victoire();
+    victoirej2++;
+    wait(2);
+    partie = false;
+  }
+}
+
+// Fonction qui permet de faire rejouer lorsque l'on secoue le nucleo
+void rejouer() {
+  float AX = 0, AY = 0, AZ = 0;
+  float valeur = 1.3;
+  int compteur = 0;
+  int sortie = 0;
+  lcd.cls();
+  lcd.locate(20, 8);
+  lcd.printf("Secouer pour rejouer");
+  // Si le joueur secoue la nucleo on rejoue
+  while (compteur < 3) {
+    // Test si les capteurs dépasse la valeur donné si oui on ajoute 1 au compteur
+    if (MMA.x() > AX + valeur || MMA.y() > AY + valeur || MMA.z() > AZ + valeur) {
+      compteur++;
+    }
+    wait(0.2);
+    sortie++;
+    // Sinon on attend 5 seconde pour sortir
+    if (sortie == 25) {
+      compteur = 25;
+    }
+  }
+  if (compteur == 25) {
+    lance = false;
+  } else {
+    lance = true;
+  }
+}
+
+// Fonction pour afficher le récapitulatif des victoires
+void recapitulatif() {
+  // Affiche le nombre de victoire de chaque joueur
+  lcd.cls();
+  lcd.locate(25, 10);
+  lcd.printf("Joueur 1 : %d victoires", victoirej1);
+  lcd.locate(25, 20);
+  lcd.printf("Joueur 2 : %d victoires", victoirej2);
+  wait(4);
+  lcd.cls();
+  lcd.locate(30, 10);
+  lcd.printf("Merci d avoir joue");
+  wait(2);
+}
+
+// Fonction pour faire pause lors du jeux
+void pause() {
+  // Si il appuie sur le bouton du joystick on lance la pause
+  if (fire) {
+    stop = true;
+    lcd.cls();
+    lcd.locate(50, 10);
+    lcd.printf("Pause");
+    lcd.locate(25, 2);
+    // Affiche la température récupéré par le capteur
+    lcd.printf("Temperature = %.1f\n", sensor.read());
+    lcd.locate(3, 18);
+    // Affiche le score
+    lcd.printf("joueur 1 : %d - joueur 2 : %d", scorej1, scorej2);
+    int lightp = 6;
+    while (stop) {
+      // On fait clignoter la LED en vert
+      if (lightp % 6 == 0) {
+        r = 1;
+        b = 1;
+        g = 0;
+      }
+      wait(0.1);
+      // Si il réappuie sur le bouton du joystick on sort de la pause
+      if (fire) {
+        stop = false;
+      }
+      // On éteint la lED
+      r = 1;
+      g = 1;
+      b = 1;
+      lightp++;
+    }
+    lcd.cls();
+    affichage();
+    wait(0.8);
+  }
+}
+
+// Fonction de démarrage du jeu
+void lancement() {
+  r = 1;
+  g = 1;
+  b = 1;
+  lcd.cls();
+  lcd.locate(50, 10);
+  lcd.printf("Bienvenue");
+  wait(1);
 
-    while(true) {   // this is the third thread
-        lcd.locate(0,15);
-        lcd.printf("Counting : %d",j);
-        j++;
-        wait(1.0);
+  lcd.cls();
+  int po = 45, ng = 17;
+  bool ok = true;
+  int light = 3;
+  float zz = 1.0;
+  while (ok) {
+    son(zz);
+    lcd.cls();
+    lcd.locate(15, 17);
+    lcd.printf("l");
+    lcd.locate(110, 6);
+    lcd.printf("l");
+    // Affiche le nom PoNG en le déplacent
+    lcd.locate(po, ng);
+    lcd.printf("PoNG");
+    po = po + 4;
+    ng--;
+    if (po == 85 || ng == 0) {
+      ok = false;
+    }
+    // Fait clignoter la LED en Rouge, Bleu et Vert
+    if (light % 3 == 0) {
+      r = 1;
+      g = 1;
+      b = 0;
+    }
+    if (light % 3 == 1) {
+      r = 1;
+      g = 0;
+      b = 1;
+    }
+    if (light % 3 == 2) {
+      r = 0;
+      g = 1;
+      b = 1;
     }
+    wait(0.08);
+    r = 1;
+    g = 1;
+    b = 1;
+    light++;
+    // Diminue l'intensité de la musique
+    zz = zz - 0.05;
+  }
 }
+
+// Fonction de fin
+void fin() {
+  lcd.cls();
+  int des = 9;
+  r = 1;
+  b = 1;
+  g = 1;
+  while (des - 8 < 19) {
+    // Affiche le générique
+    lcd.locate(25, des - 4);
+    lcd.printf("Realise par Mael");
+    // Musique de fin
+    switch (des % 9) {
+    case 0:
+      spkr.PlayNote(220.00, 0.5, 0.8);
+      r = 0;
+      b = 1;
+      g = 1;
+      wait(0.250);
+      break;
+    case 1:
+      spkr.PlayNote(220.00, 0.5, 0.8);
+      r = 1;
+      b = 1;
+      g = 1;
+      wait(0.250);
+      break;
+    case 2:
+      spkr.PlayNote(220.00, 0.5, 0.8);
+      r = 0;
+      b = 1;
+      g = 1;
+      wait(0.250);
+      break;
+    case 3:
+      spkr.PlayNote(174.61, 0.375, 0.8);
+      r = 1;
+      b = 1;
+      g = 1;
+      wait(0.187);
+      break;
+    case 4:
+      spkr.PlayNote(261.63, 0.125, 0.8);
+      r = 0;
+      b = 1;
+      g = 1;
+      wait(0.062);
+      break;
+    case 5:
+      spkr.PlayNote(220.00, 0.5, 0.8);
+      r = 1;
+      b = 1;
+      g = 1;
+      wait(0.250);
+      break;
+    case 6:
+      spkr.PlayNote(174.61, 0.375, 0.8);
+      r = 0;
+      b = 1;
+      g = 1;
+      wait(0.187);
+      break;
+    case 7:
+      spkr.PlayNote(261.63, 0.125, 0.8);
+      r = 1;
+      b = 1;
+      g = 1;
+      wait(0.062);
+      break;
+    case 8:
+      spkr.PlayNote(220.00, 0.7, 0.8);
+      r = 0;
+      b = 1;
+      g = 1;
+      wait(0.7);
+      break;
+    default:
+      r = 1;
+      b = 1;
+      g = 1;
+    }
+    des++;
+  }
+  lcd.cls();
+  r = 1;
+  b = 1;
+  g = 1;
+}
+
+// Fonction pour effacer une zone sur l'écran
+void efface() {
+  //bar 1
+  lcd.locate(35, verticalJ1);
+  lcd.printf(" ");
+
+  // bar 2
+  lcd.locate(120, verticalJ2);
+  lcd.printf(" ");
+
+  //balle
+  lcd.locate(horizontalBall - 3, verticalBall);
+  lcd.printf("    ");
+  lcd.locate(horizontalBall - 3, verticalBall - 1);
+  lcd.printf("    ");
+  lcd.locate(horizontalBall - 3, verticalBall + 1);
+  lcd.printf("    ");
+}
+
+// Fonction de main
+int main() {
+  lancement();
+  // Boucle pour jouer un match
+  while (lance) {
+    commencement();
+    // Boucle pour jouer une partie
+    while (partie) {
+      initialisation();
+      // Boucle pour jouer une manche
+      while (joue) {
+        affichage();
+
+        marque();
+
+        pause();
+
+        mouvement_balle(avance, recule);
+
+        victoire();
+
+        wait(vitesse);
+
+        efface();
+      }
+      wait(1);
+    }
+    rejouer();
+  }
+  recapitulatif();
+  fin();
+}
\ No newline at end of file