Pacman + Joystick + Ecran LCD 2004

Bonjour
Je suis en train d'essayer de concevoir un Jeux Pacman sur un écran LCD 2004 avec pour controlle un Joystick.

J'essaye de faire le déplacement de fantôme sans (affichage multiple de fantôme, recréation de carré au passage du fantôme).
Je pense que je suis sur la bonne voie mais un petit coup de main me serais utile.
Voici mon code :


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27(Cooperate with 3 short circuit caps) for a 16 chars and 2 line display

// Vitesse personnage
#define Speed_Pacman 200
#define Speed_Fantome 4000

long Millis = 0;
long Millis2 = 0;

// Pin bouton
int gauche = 12; // Gauche
int droite = 8; // Droite
int haut = 6; // Haut
int bas = 5; // Bas

// Joystick axe
int axeX = A0;
int axeY = A1;

int valX;
int valY;
  
// Création des personnages et décors
byte pac1Def[8] = {
  B00000,
  B01110,
  B10111,
  B11111,
  B11111,
  B01110,
  B00000,
  B00000
};

byte pac2Def[8] = {
  B00000,
  B01110,
  B10100,
  B11000,
  B11100,
  B01110,
  B00000,
  B00000
};

byte pillDef[8] = {
  B00000,
  B00000,
  B00000,
  B01100,
  B01100,
  B00000,
  B00000,
  B00000
};

byte Fantome[8] = {
  B00000,
  B01110,
  B10101,
  B11111,
  B11111,
  B10101,
  B00000,
  B00000
};

byte FantomeFear[8] = {
  B00000,
  B01110,
  B10101,
  B11111,
  B10001,
  B11111,
  B10101,
  B00000
};

byte eatSmall[8] = {
  B00000,
  B00000,
  B00000,
  B00110,
  B00110,
  B00000,
  B00000,
  B00000
};

byte eatBig[8] = {
  B00000,
  B00000,
  B01111,
  B01111,
  B01111,
  B01111,
  B00000,
  B00000
};

byte MurHorizontal[8] = {
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111
};

byte MurVerticalRight[8] = {
  B11111,
  B00001,
  B00001,
  B00001,
  B00001,
  B00001,
  B00001,
  B11111
};

byte MurVerticalLeft[8] = {
  B11111,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B11111
};

int x = 0;
int y = 0;
int px = 0;
int py = 0;

byte points[19][3];
byte vide=false;
/* Au début */

// Position des Fantomes
int xfant1 = 8;
int yfant1 = 0;
int pxfant1 = 0;
int pyfant1 = 0;


byte light=true; 
long keystruck=0; 
long poursuite=0; 
byte partieEnCours=true; 

byte level=0; 
int score=0; 
 
void setup() {
  lcd.begin(20, 4);
  
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
    
  lcd.home();

  // create a new character
  lcd.createChar(0, pac1Def);
  // create a new character
  lcd.createChar(1, pac2Def);
  // create a new character
  lcd.createChar(2, pillDef);
  // create a new character
  lcd.createChar(3, Fantome);
  // create a new character  
  lcd.createChar(4, FantomeFear);
  // create a new character
  lcd.createChar(5, eatSmall);
  // create a new character
  lcd.createChar(6, eatBig);

  // Bouton Pin Mode
  pinMode(gauche, INPUT_PULLUP); //
  pinMode(droite, INPUT_PULLUP); //
  pinMode(haut, INPUT_PULLUP); //
  pinMode(bas, INPUT_PULLUP); //

  // set up the lcd's number of columns and rows:
  lcd.begin(20, 4);
  // fill the display
  fill();
}
 
void loop() {
 
  int axeG = digitalRead(gauche);
  int axeD = digitalRead(droite);
  int axeH = digitalRead(haut);
  int axeB = digitalRead(bas);

  int valX = analogRead(axeX);
  int valY = analogRead(axeY);
  // Bouton déplacement
  if (axeG == LOW) {
    x--;
    delay(100);
  }
  if (axeD == LOW) {
    x++;
    delay(100);
  }
  if (axeH == LOW) {
    y--;
    delay(100);
  }
  if (axeB == LOW) {
    y++;
    delay(100);
  }
  
  // Joystick Déplacement
  if (valX > 700){ // droite
    x = x - 1;
    delay(100);
  }else if (valX < 400){  // gauche
    x = x + 1;
    delay(100);
  }else if (valY > 700){  // en haut
    y = y + 1;
    delay(100);
  }else if (valY < 400){  // en bas
    y = y - 1;
    delay(100);
  }
  if(millis() - Millis > Speed_Pacman){
    Millis = millis();
    // Déplacement
    if(x > 19 || y > 3){
      x = 0;
      y = 0;
    }else if(x > 19 && y <= 3){
      x = 0;
      y = 0;
      fill();
    }
  }
  if(millis() - Millis2 > Speed_Fantome){
    Millis2 = millis();
    // Déplacement Fantome
    if (yfant1 < y) {
      yfant1 = yfant1 + 1;
    }else if (yfant1 > y){
      yfant1 = yfant1 - 1;
    }else if (xfant1 < x){ 
      xfant1 = xfant1 + 1;
    }else if (xfant1 > x){ 
      xfant1 = xfant1 - 1;
    }
  }
  // Déplacement Pacman
  anim_Pacman();
  
  // Déplacement Fantome
  anim_Fantome();
  
}

// Affichage nourriture
void fill() {
  for (int i=0; i<20; i++){
    for (int j=0; j<4; j++){
      lcd.setCursor(i, j); 
      lcd.write(byte(2)); 
    }
  }
}
 
// Animation Pacman
void anim_Pacman(){
  lcd.setCursor(px,py);
  lcd.print(" ");
  score++;
  lcd.setCursor(x,y);
  lcd.write(byte(1));  //pac2
  delay(50);
  lcd.setCursor(x,y);
  lcd.write(byte(0));  //pac1
  delay(50);
  px = x;
  py = y;
}

// Animation Fantome
void anim_Fantome() {
  int oldx1 = pxfant1 - 1;
  int oldy1 = pyfant1 - 1;
  
  lcd.setCursor(pxfant1,pyfant1); 
  if ((pxfant1!=oldx1)||(pxfant1!=oldy1)){
    lcd.write(2); 
  }else{ 
    lcd.print(" "); 
  }
  lcd.setCursor(xfant1,yfant1); 
  lcd.write(byte(3));
  pxfant1 = xfant1;
  pyfant1 = yfant1;
}

Je pense aller plus loin, avec la partie gagne si tout les blocs sont récupérer/perdu si un fantome nous mange, affichage des murs en aléatoires en fonction du niveau, plusieurs niveaux, augmenter la rapidité des fantômes.
Mais je souhaite d'abord régler ce problème.
Je ne trouve toujours pas ou est le bug.
Je vous remercie d'avance pour votre aide.

C’est quoi le problème exactement???

Bonjour J-M-L

Le problème est que, quand Pacman mange les carrés et qu'un fantôme passe sur cette case, le fantôme me remet un carré dessus.


void anim_Fantome() {
  int oldx1 = pxfant1 - 1;
  int oldy1 = pyfant1 - 1;
  
  lcd.setCursor(pxfant1,pyfant1); 
  **if ((pxfant1!=oldx1)||(pxfant1!=oldy1)){**
**    lcd.write(2); **
**  }else{ **
**    lcd.print(" "); **
**  }**
  lcd.setCursor(xfant1,yfant1); 
  lcd.write(byte(3));
  pxfant1 = xfant1;
  pyfant1 = yfant1;
}

Je pense que le problème ce situe au niveau de la partie mis en etoile.
Mais je vois pas comment régler ce problème.

Je n’ai pas lu le code en détail mais si les variables sont bien nommées c’est bizarre de comparer une coordonnée X avec une coordonnée Y

Merci J-M-L j'ai corrigé cela, mais le problème persiste encore.

Je pense qu'il dois me manquer une condition après le else.

}else{ 
   if(condition si la case est vide){
    lcd.print(" "); 
   }else if(condition si la case est pleine){
    lcd.write(byte(2));
  }
}

Je pense etre sur la bonne voie.

Si la case n’est pas vide est-ce qu’elle peut être autre chose que pleine?

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.