-
-
Save Cric75/909409377a112265449f6d4944a71bc2 to your computer and use it in GitHub Desktop.
Pong_1_Player_V2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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