A vous de jouer!

Étape 5

Notre jeu Attrap'oeuf n'est pas encore fini. Ensemble, nous avons ajouté le panier et les œufs. Il vous reste à implémenter les carottes. Mais avec l'aide des boucles for et l'organisation des fonctions, je suis sûr que vous pouvez le faire !

Petites indications de design: commencer par ajouter un nombre fixe de carottes, ensuite essayez de créer un mini système de progression, c'est-à-dire que plus le score sera grand, plus il y aura de carottes qui tombent, avec une quantité maximale de carottes a ne pas dépasser. Autre mission: centrez le panier pour qu'il change de taille sûr la gauche et la droite (actuellement, seul le côté droit grandit/rapetisse).

Astuce #1: Par rapport au système de progression, vous pouvez utiliser la fonction min() pour ne pas dépasser le nombre maximal de carottes (en savoir plus ici.

Astuce #2: Toujours pour le système de progression, il vous faudra une variable qui traque le nombre de carottes actuellement en jeu, et une constante pour le nombre maximal de carottes.

Astuce #3: Pour centrer le panier, il faut que panierX corresponde au centre du panier. A vous de trouver comment l'afficher et gérer les collisions.

Partage ton talent sur les réseaux avec #gamebuino #atelier #attrapoeuf, on les regarde tous ;)

Exemple de Solution

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

Attrapoeuf.ino

#include <Gamebuino-Meta.h>

// Eggs
const int NBR_D_OEUFS = 10;
int oeufsX[NBR_D_OEUFS] = {};
int oeufsY[NBR_D_OEUFS] = {};

const int OEUF_LARGEUR = 2;
const int OEUF_HAUTEUR = 3;

// Carots
const int NBR_MAX_DE_CAROTTES = 8;
int nbrDeCarottes = 0;
int carottesX[NBR_MAX_DE_CAROTTES] = {};
int carottesY[NBR_MAX_DE_CAROTTES] = {};

const int CAROTTE_LARGEUR = 3;
const int CAROTTE_HAUTEUR = 5;

// Panier
int panierX = 20;  // Le panier peut bouger horizontalement, donc ce n'est pas une constante
const int PANIER_Y = gb.display.height() - 4;  // Constante car le panier est fixe selon l'axe Y
int panierLargeur = 0;  // Pas constant car la taille dépend de la nourriture restante
const int PANIER_HAUTEUR = 3;  // Constante

int score = 0;
int highscore = 0;
int nourriture;  // Plus de nourriture est mieux. 0 nourriture = game over

void setup() {
  gb.begin();
  // Placer les oeufs aléatoirement au dessus de l'écran
  for (int i = 0; i < NBR_D_OEUFS; i += 1) {
    oeufsX[i] = random(0, gb.display.width());
    oeufsY[i] = random(-40, -OEUF_HAUTEUR);  // Au dessus de l'écran
  }
  nourriture = 300;
}

void loop() {
  while (!gb.update());
  entrees();
  miseAJour();
  affichage();
}


entrees.ino

void entrees() {
  if (gb.buttons.repeat(BUTTON_LEFT, 0) && panierX > 0) {
    panierX -= 2;
  }
  else if (gb.buttons.repeat(BUTTON_RIGHT, 0) && panierX < gb.display.width()) {
    panierX += 2;
  }
}


miseAJour.ino

void miseAJour() {
  // La faim fait doucement baisser notre nourriture dans la panier
  nourriture--;
  panierLargeur = nourriture / 20;
  if (nourriture <= 0) {  // Somme nous mort de faim??
    nbrDeCarottes = 0;  // Reset les carottes
    score = 0;  // Recommencer le jeu
    nourriture = 300;  // Reset nourriture
    for (int i = 0; i < NBR_D_OEUFS; i += 1) {
      oeufsX[i] = random(0, gb.display.width());
      oeufsY[i] = random(-40, -OEUF_HAUTEUR);  // Au dessus de l'écran
    }
  }

  // Eggs
  for (int i = 0; i < NBR_D_OEUFS; i += 1) {
    oeufsY[i] += 1;

    // Collisions
    if (gb.collide.rectRect(panierX - panierLargeur / 2, PANIER_Y, panierLargeur, PANIER_HAUTEUR, oeufsX[i], oeufsY[i], OEUF_LARGEUR, OEUF_HAUTEUR)) {
      score += 1;
      if (score > highscore) {
        highscore = score;
      }
      nourriture = nourriture + 20;  // MMmmmmm des oeufs
      // Ajouter des carrotes. Sans dépasser le plafond
      nbrDeCarottes = min(score / 5, NBR_MAX_DE_CAROTTES);

      // Reset l'oeuf
      oeufsX[i] = random(0, gb.display.width());
      oeufsY[i] = random(-40, -OEUF_HAUTEUR);  // Au dessus de l'écran
    }

    // Verifier que la carotte ne soit pas sortie de l'écran
    if (oeufsY[i] >= gb.display.height()) {
      // Reset l'oeuf
      oeufsX[i] = random(0, gb.display.width());
      oeufsY[i] = random(-40, -OEUF_HAUTEUR);  // Au dessus de l'écran
    }
  }

  // Carottes
  for (int i = 0; i < nbrDeCarottes; i += 1) {
    carottesY[i] += 2;

    // Collisions avec le joueur
    if (gb.collide.rectRect(panierX - panierLargeur / 2, PANIER_Y, panierLargeur, PANIER_HAUTEUR, carottesX[i], carottesY[i], CAROTTE_LARGEUR, CAROTTE_HAUTEUR)) {

      nourriture -= 40;  // Allergie => moins de nourriture :(

      // Reset la carotte
      carottesX[i] = random(0, gb.display.width());
      carottesY[i] = random(-20, -CAROTTE_HAUTEUR);  // Au dessus de l'écran
    }

    // Verifier que la carotte ne soit pas sortie de l'écran
    if (carottesY[i] >= gb.display.height()) {
      // Reset la carotte
      carottesX[i] = random(0, gb.display.width());
      carottesY[i] = random(-20, CAROTTE_HAUTEUR);  // Au dessus de l'écran
    }
  }

}


affichage.ino

void affichage() {
  gb.display.clear();

  // Eggs
  gb.display.setColor(BROWN);
  for (int i = 0; i < NBR_D_OEUFS; i += 1) {
    gb.display.fillRect(oeufsX[i], oeufsY[i], OEUF_LARGEUR, OEUF_HAUTEUR);
  }

  // Carrots
  gb.display.setColor(ORANGE);
  for (int i = 0; i < nbrDeCarottes; i += 1) {
    gb.display.fillRect(carottesX[i], carottesY[i], CAROTTE_LARGEUR, CAROTTE_HAUTEUR);
  }

  // Player
  gb.display.setColor(WHITE);
  gb.display.fillRect(panierX - panierLargeur / 2, PANIER_Y, panierLargeur, PANIER_HAUTEUR);

  // Score
  gb.display.setColor(WHITE);
  gb.display.setCursor(gb.display.width() - 8, 0);
  gb.display.print(score);
  gb.display.setColor(RED);
  gb.display.setCursor(gb.display.width() - 8, 8);
  gb.display.print(highscore);
}

Par Julien Giovinazzo

Workshop suivant