/*
probleme avec l'EEPROM
des que je relance la compilation
le meilleur score de la compilation précédente
n'est pas enregistrer
*/
#include <U8x8lib.h> // u8x8 library for drawing on the OLED display
#include <EEPROM.h>
U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ 4, /* data=*/ 3, /* reset=*/ U8X8_PIN_NONE); // software IIC communication with the OLED display
unsigned char mat_perso_1 [] = {
0x0a, 0x0a, 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x04,
};
unsigned char coeur [] = {
0x18, 0x3C, 0x7C, 0xFC, 0xFC, 0x7C, 0x3C, 0x18
};
int flechePosition = 1;
int playerX = 3; // Position horizontale initiale du joueur
int playerY = 5; // Position verticale initiale du joueur
int obstacleX = 15; // Position horizontale initiale de l'obstacle
int obstacleY = 5; // Position verticale initiale de l'obstacle
int vie = 3;
bool vieBonusActive = false; // Indicateur pour savoir si la vie bonus est active
int vieBonusX = 15;
int vieBonusY;
bool boostObstacleActive = false; // Indicateur pour savoir si la vie bonus est active
int boostObstacleX = 15;
int boostObstacleY;
bool nerfObstacleActive = false; // Indicateur pour savoir si la vie bonus est active
int nerfObstacleX = 15;
int nerfObstacleY;
int vitesseObstacle = 1;
int score = 0;
int meilleurScore;
int adresseScore = 0;
void setup(void)
{
u8x8.begin(); // display initialization
u8x8.setPowerSave(0); // this is required
u8x8.setFont(u8x8_font_chroma48medium8_r);
EEPROM.get(0, meilleurScore);
pinMode(0, INPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
randomSeed(analogRead(0));
}
void loop(void)
{
menu();
}
void menu(){
u8x8.setCursor(1, 1);
u8x8.print("Jouer");
u8x8.setCursor(1, 3);
u8x8.print("Score");
u8x8.setCursor(1, 5);
u8x8.print("Commande");
// Afficher la flèche de sélection
u8x8.setCursor(12, flechePosition);
u8x8.print("<--");
// Utiliser le bouton pour naviguer dans le menu
if (digitalRead(0) == HIGH) {
flechePosition -= 2;
u8x8.clear();
if (flechePosition < 1) flechePosition = 5;
delay(200); // Délai pour éviter un défilement trop rapide
} else if (digitalRead(1) == HIGH) {
flechePosition += 2;
u8x8.clear();
if (flechePosition > 5) flechePosition = 1;
delay(200); // Délai pour éviter un défilement trop rapide
}
if (digitalRead(2) == HIGH && flechePosition == 1) {
delay(200); // Délai pour éviter la détection multiple du bouton
u8x8.clear();
jeu();
}
if (digitalRead(2) == HIGH && flechePosition == 3) {
delay(200); // Délai pour éviter la détection multiple du bouton
u8x8.clear();
u8x8.setCursor(0, 2);
u8x8.print("GOAT score :");
EEPROM.get(0, meilleurScore);
if(meilleurScore == -1){
u8x8.print(0);
} else {
u8x8.print(meilleurScore);
}
delay(3000);
u8x8.clear();
}
}
void jeu(){
while(vie != 0){
// Effacer l'écran
u8x8.clearDisplay();
// Dessiner le joueur
u8x8.drawTile(playerX, playerY, 1, mat_perso_1);
// Dessiner l'obstacle
u8x8.drawString(obstacleX, obstacleY, "-");
u8x8.drawString(0, 1, "________________");
u8x8.setCursor(1, 0);
u8x8.print("Vies:");
u8x8.print(vie);
// Déplacer l'obstacle
obstacleX -= 3*vitesseObstacle;
if (obstacleX < 0) {
obstacleX = 15; // Positionner l'obstacle à droite de l'écran
obstacleY = random(2, 8); // Position Y aléatoire
score++;
}
// Déplacer le joueur
if (digitalRead(0) == HIGH && playerY > 2) {
playerY--;
} else if (digitalRead(1) == HIGH && playerY < 7) {
playerY++;
}
collision();
vie_Bonus();
boostObstacle();
nerfObstacle();
}
if(digitalRead(2)==LOW){
u8x8.clear();
u8x8.drawString(3, 3, "GAME OVER");
u8x8.drawString(4, 5, "score :");
u8x8.setCursor(12, 8);
u8x8.print(score);
delay(4000);
if(meilleurScore < score){
meilleurScore = score;
EEPROM.put(0, meilleurScore);
}
vie = 3;
score = 0;
u8x8.clear();
}
}
void collision(){
if(playerX == obstacleX && playerY == obstacleY){
vie--;
}
}
void vie_Bonus(){
// Gérer la vie bonus
if (!vieBonusActive) {
// Générer aléatoirement la vie bonus avec une certaine probabilité
if (random(0, 100) < 10) { // Par exemple, apparait rarement (5% de chance)
vieBonusActive = true;
vieBonusX = 15; // Position horizontale initiale
vieBonusY = random(2, 8); // Position Y aléatoire
}
} else {
// Dessiner la vie bonus
u8x8.drawTile(vieBonusX, vieBonusY, 1, coeur);
// Déplacer la vie bonus à la même vitesse que la barre
vieBonusX -= 4;
// Vérifier la collision avec le joueur
if (playerX == vieBonusX && playerY == vieBonusY) {
vieBonusActive = false; // Désactiver la vie bonus
vie++; // Augmenter le nombre de vies du joueur
}
// Réinitialiser la position de la vie bonus si elle sort de l'écran
if (vieBonusX < 0) {
vieBonusActive = false; // Désactiver la vie bonus
}
}
}
void boostObstacle(){
// Gérer la vie bonus
if (!boostObstacleActive) {
// Générer aléatoirement la vie bonus avec une certaine probabilité
if (random(0, 100) < 20) { // Par exemple, apparait rarement (5% de chance)
boostObstacleActive = true;
boostObstacleX = 15; // Position horizontale initiale
boostObstacleY = random(2, 8); // Position Y aléatoire
}
} else {
// Dessiner la vie bonus
u8x8.drawString(boostObstacleX, boostObstacleY, "*");
// Déplacer la vie bonus à la même vitesse que la barre
boostObstacleX -= 4;
// Vérifier la collision avec le joueur
if (playerX == boostObstacleX && playerY == boostObstacleY) {
boostObstacleActive = false; // Désactiver la vie bonus
vitesseObstacle++; // Augmenter le nombre de vies du joueur
}
// Réinitialiser la position de la vie bonus si elle sort de l'écran
if (boostObstacleX < 0) {
boostObstacleActive = false; // Désactiver la vie bonus
}
}
}
void nerfObstacle(){
// Gérer la vie bonus
if (!nerfObstacleActive) {
// Générer aléatoirement la vie bonus avec une certaine probabilité
if (random(0, 100) < 15) { // Par exemple, apparait rarement (5% de chance)
nerfObstacleActive = true;
nerfObstacleX = 15; // Position horizontale initiale
nerfObstacleY = random(2, 8); // Position Y aléatoire
}
} else {
// Dessiner la vie bonus
u8x8.drawString(nerfObstacleX, nerfObstacleY, "o");
// Déplacer la vie bonus à la même vitesse que la barre
nerfObstacleX -= 4;
// Vérifier la collision avec le joueur
if (playerX == nerfObstacleX && playerY == nerfObstacleY) {
nerfObstacleActive = false; // Désactiver la vie bonus
if(vitesseObstacle > 1){
vitesseObstacle--; // Augmenter le nombre de vies du joueur
}
}
// Réinitialiser la position de la vie bonus si elle sort de l'écran
if (nerfObstacleX < 0) {
nerfObstacleActive = false; // Désactiver la vie bonus
}
}
}