Skip to content

Instantly share code, notes, and snippets.

@Cric75
Created Aug 16, 2021
Embed
What would you like to do?
Pong_1_Player_V3.1
/* Version du jeu incorporant une classe Paddle pour remplacer la fonction raquette
* Ce code s'appuie sur celui de Steph (Dynamic stretching and shrinking of a pong paddle)
*/
#include <Gamebuino-Meta.h>
int bSpeed = 2;
// Gestion des états
enum class State : uint8_t {
start,
menu,
play,
game_over
};
// Gestion du niveau de difficulté
enum class Difficulty : uint8_t {
easy,
medium,
hard
};
// Caractéristiques de la balle et de la difficulté
struct s_balle{int posX; int posY; int speedX; int speedY; int taille; int modDiff;};
s_balle balle={20, 20, bSpeed, -bSpeed, 4, 0};
// Caractéristiques du jeu : état et score des 2 joueurs (droite puis gauche)
struct Game {
State state;
Difficulty difficulty;
uint8_t score1;
uint8_t score2;
void resetScores() {
score1 = score2 = 0;
s_balle balle={20, 20, bSpeed, -bSpeed, 4, 0};
}
};
Game game;
/*
Caractéristiques d'une raquette
Basée sur le code de Steph
*/
struct Paddle {
static const uint8_t V = 2;
static const uint8_t H = 12;
static const uint8_t L = 3;
uint8_t posX;
uint8_t posY;
uint8_t vitesse;
uint8_t hauteur;
uint8_t largeur;
Paddle(uint8_t posX, uint8_t posY) : posX(posX), posY(posY), vitesse(V), hauteur(H), largeur(L) {}
void up() { posY -= 2; }
void down() { posY += 2; }
void update() {
if (posY < 0) posY = 0;
else if (posY+hauteur > gb.display.height()) posY = gb.display.height();
}
void draw() {
gb.display.setColor(BLUE);
gb.display.fillRect(posX, posY, largeur, hauteur);
}
};
/*
Construction de 2 instances de Paddle
Caractéristiques des raquettes de gauche du joueur (player) et de droite de l'IA (computer)
*/
Paddle player(10, 30);
/*
Etat du jeu start (écran de démarrage au lancement du jeu)
On fait rebondir une balle sur tout l'écran en arrière plan
*/
void start() {
if (gb.buttons.pressed(BUTTON_A)) game.state = State::menu;
gb.display.print(14, 10, "PONG 1 PLAYER");
if (gb.frameCount % 25 < 13) {
gb.display.print(14, 30, "APPUYER SUR A");
gb.display.print(14, 40, "POUR DEMARRER");
}
balle.posX += balle.speedX;
balle.posY += balle.speedY;
// La balle rebondit en haut ou en bas de l'écran
if (balle.posY < 0) {
balle.speedY = bSpeed;
}
if (balle.posY > gb.display.height()-balle.taille) {
balle.speedY = -bSpeed;
}
// La balle rebondit à droite ou à gauche de l'écran
if (balle.posX < 0) {
balle.speedX = bSpeed;
}
if (balle.posX > gb.display.width()-balle.taille) {
balle.speedX = -bSpeed;
}
gb.display.setColor(YELLOW);
gb.display.fillRect(balle.posX, balle.posY, balle.taille, balle.taille);
game.resetScores();
}
/*
Etat du jeu menu (choix à partie de 3 niveaux de difficultés)
*/
void menu() {
uint8_t hauteur;
if (gb.buttons.pressed(BUTTON_UP)) {
switch (game.difficulty) {
case Difficulty::medium: game.difficulty = Difficulty::easy; break;
case Difficulty::hard: game.difficulty = Difficulty::medium;
}
} else if (gb.buttons.pressed(BUTTON_DOWN)) {
switch (game.difficulty) {
case Difficulty::easy: game.difficulty = Difficulty::medium; break;
case Difficulty::medium: game.difficulty = Difficulty::hard;
}
} else if (gb.buttons.pressed(BUTTON_A))
game.state = State::play;
gb.display.print(4, 10, "CHOISIR DIFFICULTE");
gb.display.print(32, 30, "FACILE");
gb.display.print(32, 40, "MOYENNE");
gb.display.print(32, 50, "DIFFICILE");
gb.display.setColor(YELLOW);
gb.display.fillRect(20, 31 + 10*(uint8_t)game.difficulty, 4, 4);
if (game.difficulty == Difficulty::easy) {
bSpeed=2;
balle.modDiff=26; // la balle apparait systématiquement car hors scope du décompte des 25 images dans le gv.Count
}
else if (game.difficulty == Difficulty::medium) {
bSpeed=3;
balle.modDiff=18;
}
else {
bSpeed=3;
balle.modDiff=12;
}
if (game.difficulty == Difficulty::hard) {
hauteur = 8;
}
else {
hauteur = 12;
}
}
// Etat du jeu play (corps du jeu)
void play() {
readButtons();
update();
draw();
}
/*
Etat du jeu gameOver (fin de la partie)
Un appui sur A (BUTTON_A) relance le jeu (état start)
*/
void gameOver() {
gb.display.setCursor(33, 5);
gb.display.setColor(BLUE);
gb.display.print(game.score1);
gb.display.setColor(WHITE);
gb.display.print(" - ");
gb.display.setColor(PINK);
gb.display.print(game.score2);
if (gb.buttons.pressed(BUTTON_A)) game.state = State::start;
if (game.score1 >= 10) {
gb.display.setColor(BLUE);
gb.display.print(12, 20, "LE JOUEUR GAGNE");
if (gb.frameCount % 25 < 13) {
gb.display.setColor(WHITE);
gb.display.print(17, 30, "APPUYER SUR A");
gb.display.print(17, 40, "POUR DEMARRER");
}
} else if (game.score2 >= 10) {
gb.display.setColor(PINK);
gb.display.print(20, 20, "LA GB GAGNE");
if (gb.frameCount % 25 < 13) {
gb.display.setColor(WHITE);
gb.display.print(17, 30, "APPUYER SUR A");
gb.display.print(17, 40, "POUR DEMARRER");
}
}
}
void readButtons() {
if (gb.buttons.repeat(BUTTON_UP, 0)) player.up();
else if (gb.buttons.repeat(BUTTON_DOWN, 0)) player.down();
}
void update() {
player.update();
}
void draw() {
player.draw();
}
void setup() {
gb.begin();
game.state = State::start;
}
void loop() {
gb.waitForUpdate();
gb.display.clear();
switch (game.state) {
case State::start:
start();
break;
case State::menu:
menu();
break;
case State::play:
play();
break;
case State::game_over:
gameOver();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment