À vous de jouer !

Étape 4

Cet atelier a permis de présenter trois notions qui reviendront dans quasiment tous les jeux que vous ferez plus tard, même hors des ateliers. On fait le point !

La structure "Entrées, Mise à jour, Affichage" est très puissante, elle permet de s'organiser et de dissocier les actions du joueur, la logique de jeu, et ce que voit le joueur. Les constantes nous permettent d'écrire du code plus facilement et améliorent sa lisibilité. Les tableaux sont une nouvelle structure de données qui nous permet de grouper des variables sous un même nom.

Avec tout ça, nous avons construit un jeu simple et amusant: TapTap. Maintenant c'est à vous de l'améliorer. Voici ce que je propose: Commencez par implémenter un système de record, puis pour améliorer le gameplay, ajoutez une ou deux briques. Vous pouvez aussi rendre le jeu plus dur, en augmentant la vitesse à laquelle le score diminue en fonction du score actuel. Donc plus le joueur a de points, plus il les perd vite.

  • Astuce #1 : Pour ajouter des briques, il faudra changer NBR_DE_BRIQUES et modifier l'affichage pour qu'on les voit toutes.

  • Astuce #2 : Pour rendre le jeu plus dur quand le score augmente, vous pouvez soustraire une partie du score à chaque image avec l'aide de l'opérateur de division /.

Montre nous ton jeu sur les réseaux avec #gamebuino #atelier #TapTap, on les regarde tous !

Exemple de Solution

Si vous êtes en panne d'inspiration, voilà ce qu'on a fait de notre côté :

#include <Gamebuino-Meta.h>
const int GAUCHE = 1;
const int DROITE = 2;
const int SANS_DIRECTION = 3;
const int NBR_DE_BRIQUES = 5; 


int briques[NBR_DE_BRIQUES];  // Position des briques: soit GAUCHE, soit DROITE
int fleche;  // Correspond à la flèche appuyée par l'utilisateur: soit GAUCHE, soit DROITE, soit SANS_DIRECTION
int score = 0;
int highscore = 0;


void setup() {
  gb.begin();


  // Mélanger les briques
  briques[0] = random(GAUCHE, DROITE + 1);
  briques[1] = random(GAUCHE, DROITE + 1);
  briques[2] = random(GAUCHE, DROITE + 1);
  briques[3] = random(GAUCHE, DROITE + 1);
  briques[4] = random(GAUCHE, DROITE + 1);


  fleche = SANS_DIRECTION;
}


void loop() {
  while (!gb.update());


  // ENTREES //
  if (gb.buttons.released(BUTTON_LEFT) || gb.buttons.released(BUTTON_A)) {
    fleche = GAUCHE;
  } else if (gb.buttons.released(BUTTON_RIGHT) || gb.buttons.released(BUTTON_B)) {
    fleche = DROITE;
  }


  // MISE A JOUR //
  // Diminuer le score en fonction du score
  if (score > 0) {
    score -= score / 60;
  }


  if (fleche != SANS_DIRECTION) {
    if (briques[0] == fleche) {
      score += 20;
      if (score > highscore) {  // Record ??
        highscore = score;
      }


      // Décaler tout vers le bas
      briques[0] = briques[1];
      briques[1] = briques[2];
      briques[2] = briques[3];
      briques[3] = briques[4];
      briques[4] = random(GAUCHE, DROITE + 1);  // Nouvelle brique
    }
    else {  // Mauvaise réponse :(
      score = 0;
    }


    fleche = SANS_DIRECTION;  // L'entrée utilisateur a été prise en compte
  }


  // DRAW //
  gb.display.clear();


  if (briques[0] == GAUCHE) {
    gb.display.fillRect(25, 40, 20, 10);  // fillRect pour la brique du bas. drawRect pour les autres
  } else {
    gb.display.fillRect(35, 40, 20, 10);
  }
  if (briques[1] == GAUCHE) {
    gb.display.drawRect(25, 30, 20, 10);
  } else {
    gb.display.drawRect(35, 30, 20, 10);
  }
  if (briques[2] == GAUCHE) {
    gb.display.drawRect(25, 20, 20, 10);
  } else {
    gb.display.drawRect(35, 20, 20, 10);
  }
  if (briques[3] == GAUCHE) {
    gb.display.drawRect(25, 10, 20, 10);
  } else {
    gb.display.drawRect(35, 10, 20, 10);
  }
  if (briques[4] == GAUCHE) {
    gb.display.drawRect(25, 0, 20, 10);
  } else {
    gb.display.drawRect(35, 0, 20, 10);
  }


  // Score
  gb.display.fillRect(0, gb.display.height() - (score / 5), 4, (score / 5));  // On divise le score par 5 pour qu'il rentre dans l'écran


  // Highscore
  gb.display.drawFastHLine(0, gb.display.height() - (highscore / 5), 6);
}

Workshop suivant