Skip to content

Instantly share code, notes, and snippets.

@Cric75
Last active Aug 1, 2021
Embed
What would you like to do?
Pong_1_Player_V2
#include <Gamebuino-Meta.h>
int bSpeed = 2;
// Gestion des états
enum class State : uint8_t {
start,
menu_diff,
play,
game_over
};
// 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;
uint8_t score1;
uint8_t score2;
void resetScores() {
score1 = score2 = 0;
s_balle balle={20, 20, bSpeed, -bSpeed, 4, 0};
}
};
Game game;
// Caractéristiques des raquettes de gauche (1) et de droite (2)
struct s_raquette{int posX; int posY; int vitesse; int hauteur; int largeur;};
s_raquette raquette1={10, 30, 2, 12, 3};
s_raquette raquette2={gb.display.width()-12, 30, 2, 12, 3};
// Etat du jeu Start (démarrage)
void start() {
if (gb.buttons.pressed(BUTTON_A)) game.state = State::menu_diff;
gb.display.print(17, 10, "PONG 1 PLAYER");
if (gb.frameCount % 25 < 13) {
gb.display.print(17, 30, "APPUYER SUR A");
gb.display.print(17, 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();
}
void menu_diff() {
if (gb.buttons.pressed(BUTTON_B)) game.state = State::play;
const char* entries[] = {
"FACILE",
"DIFFICILE",
};
uint8_t entry = gb.gui.menu("DIFFICULTE", entries);
if (entry == 0) {
bSpeed=2;
balle.modDiff=25;
} else {
bSpeed=3;
balle.modDiff=13;
}
if (gb.frameCount % 25 < 13) {
gb.display.print(17, 30, "APPUYER SUR A");
gb.display.print(17, 40, "POUR DEMARRER");
}
}
// Etat du jeu play (corps du jeu)
void play() {
// Contrôles de la raquette de gauche (1)
if (gb.buttons.repeat(BUTTON_UP, 0) && (raquette1.posY > 0)) {
raquette1.posY -= 2;
}
if (gb.buttons.repeat(BUTTON_DOWN, 0) && (raquette1.posY+raquette1.hauteur < gb.display.height())) {
raquette1.posY += 2;
}
// Contrôles de l'IA de la raquette de droite (2)
if (balle.posY > (raquette2.posY+raquette2.hauteur/2)
&& raquette2.posY+raquette2.hauteur < gb.display.height()) {
raquette2.posY += 2;
} else if (balle.posY < (raquette2.posY + raquette2.hauteur/2)
&& raquette2.posY > 0) {
raquette2.posY -= 2;
}
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 sort de l'écran à droite : c'est perdu, on remet au centre
if (balle.posX < 0) {
balle.posX = 40;
balle.posY = random(20, gb.display.height() - 20); // Position aléatoire au centre de l'écran;
if (random(0, 2) == 1) { // 50% du temps
balle.speedY = bSpeed;
}
else { // 50% du temps
balle.speedY = -bSpeed;
}
game.score2 +=1;
}
// La balle sort de l'écran à gauche : c'est perdu, on remet au centre
if (balle.posX+balle.taille > gb.display.width()) {
balle.posX = 40;
balle.posY = random(20, gb.display.height() - 20); // Position aléatoire au centre de l'écran;
if (random(0, 2) == 1) { // 50% du temps
balle.speedY = bSpeed;
}
else { // 50% du temps
balle.speedY = -bSpeed;
}
game.score1 +=1;
}
// Contrôles de collisions raquette de gauche (1)
if ((balle.posX == raquette1.posX+raquette1.largeur)
&& (balle.posY+balle.taille >= raquette1.posY)
&& (balle.posY <= raquette1.posY+raquette1.hauteur)) {
balle.speedX = 1;
}
// Contrôles de collisions raquette de droite (2)
if ((balle.posX+balle.taille == raquette2.posX)
&& (balle.posY+balle.taille >= raquette2.posY)
&& (balle.posY <= raquette2.posY+raquette2.hauteur)) {
balle.speedX = -1;
}
if (game.score1 >= 10 || game.score2 >= 10) {
game.state = State::game_over ;
}
gb.display.setColor(YELLOW);
if (gb.frameCount % 25 < balle.modDiff) {
gb.display.fillRect(balle.posX, balle.posY, balle.taille, balle.taille);
}
gb.display.setColor(BLUE);
gb.display.fillRect(raquette1.posX, raquette1.posY, raquette1.largeur, raquette1.hauteur);
gb.display.setColor(PINK);
gb.display.fillRect(raquette2.posX, raquette2.posY, raquette2.largeur, raquette2.hauteur);
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);
}
// Etat du jeu gameOver (fin du jeu)
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 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_diff:
menu_diff();
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