Un Pacman pour le Deuligne

Forum spécifique au shield Deuligne

Un Pacman pour le Deuligne

Message non lude Jean Malha » Lun 14 Nov 2011 21:30

Bonjour,

Juste un petit post pour dire que ce shield est très facile à prendre en main. Je débute dans la robotique et, après un peu de lecture de la librairie très complète, j'ai fait mes premiers pas avec ce Pacman.

Merci,

Jean Malha

Le code :



Code: Tout sélectionner
#include "Wire.h" // insertion de la librairie I2C (obligatoire)
#include <Deuligne.h> // insertion de la librairie Deuligne (obligatoire)

#define VITESSE_PAC 150
#define VITESSE_FANT  2000
#define MAXX  15
#define MAXY  1

Deuligne lcd; // Déclaration de l'objet lcd


// Charactère spécifique pacman
byte pacman[8] = {
   B00000,
   B00000,
   B01110,
   B11011,
   B11100,
   B01110,
   B00000,
   B00000
};

// Charactère spécifique fantome
byte fantome[8] = {
   B00000,
   B00000,
   B01110,
   B10101,
   B11111,
   B11111,
   B10101,
   B00000
};

// Tableau des points à manger
byte points[MAXX+1][MAXY+1];

int xpac=2; // Position de pacman en X (colone)
int ypac=1; //position de pacmanen y (ligne)
int xfant=15;// Position du fantome en X (colone)
int yfant=0;// Position du fantome en Y (ligne)
byte light=true; //Eclairage
long keystruck=0; //dernier appui sur un bouton
long poursuite=0; //dernier movement du fantome
byte partieEnCours=true; // pour eviter de boucler sur la fin
byte vide=false; // pour tester si tout est manger

void bouge(int x,int y)  // fonction pour bouger pacman
{
  int oldx=xpac;
  int oldy=ypac;
  if (((xpac+x)>=0)&((xpac+x)<=MAXX)) xpac=xpac+x; //Si pas sorti d'ecran, on change x
  if (((ypac+y)>=0)&((ypac+y)<=MAXY)) ypac=ypac+y;//Si pas sorti d'ecran, on change y
  lcd.setCursor(xpac,ypac); // On se place en nouvelle position
  lcd.write(0); // et on pose le caractere 0 (Pacman)
  lcd.setCursor(oldx,oldy); // On se place en ancienne position
  if ((xpac!=oldx)||(ypac!=oldy)) lcd.print(" "); // et on efface Pacman (s'il a bougé)
  points[xpac][ypac]=false; // mange le truc
  vide=true;
  for (int i=0; i<=MAXX; i=i+1)
    for (int j=0; j<=MAXY; j=j+1)
      if (points[i][j]) vide=false;
  if ((vide)&&(partieEnCours)) gagne();
}

void perdu()
{
  lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
  lcd.print("***Game Over****"); // on écrit le début du texte de début
  lcd.setCursor(0, 1); // on se place au point 0,0 (1ere ligne, 1er caractere)
  lcd.print("**You Lost!!***"); // on écrit le début du texte de début
  partieEnCours=false;
}

void gagne()
{
  lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
  lcd.print("***Game Over****"); // on écrit le début du texte de début
  lcd.setCursor(0, 1); // on se place au point 0,0 (1ere ligne, 1er caractere)
  lcd.print("***You Won!!***"); // on écrit le début du texte de début
  partieEnCours=false;
}

void poursuis()  // fonction pour bouger fantome
{
  int oldx=xfant;
  int oldy=yfant;
  if (yfant<ypac) yfant=yfant+1;
    else if (yfant>ypac) yfant=yfant-1;
      else if (xfant<xpac) xfant=xfant+1;
        else if (xfant>xpac) xfant=xfant-1;
  lcd.setCursor(xfant,yfant); // On se place en nouvelle position
  lcd.write(1); // et on pose le caractere 0 (Fantome)
  lcd.setCursor(oldx,oldy); // On se place en ancienne position
  if ((oldx!=xfant)||(oldy!=yfant)) // et on efface Fantome (s'il a bougé)
    {
       if (points[oldx][oldy]) lcd.print("."); // remplacé par un point si pas mangé
       else lcd.print(" "); // remplacé par un espace si déja magé
    }
}

void setup() {
  Serial.begin(9600);
  Wire.begin(); // initialisation I2C (obligatoire)
  lcd.init(); // initialisation LCD (obligatoire)
  lcd.createChar(0, pacman); // creation du caractere pacman et affectation au numéro 0
  lcd.createChar(1, fantome); // creation du caractere de fantome et affectation au numéro 1
  lcd.backLight(true); // on allume le retro eclairage
  lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
  lcd.print("Pacman!"); // on écrit le début du texte de début
  delay (5000); // Splash screen
  for (int i=0; i<=MAXX; i=i+1)
    for (int j=0; j<=MAXY; j=j+1)
      points[i][j]=true; //initialisation du tableau des trucs à manger
  lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
  lcd.print("................"); // on descine les points
  lcd.setCursor(0, 1); // on se place au point 0,0 (2ieme ligne, 1er caractere)
  lcd.print("................"); // on écrit les points
  lcd.setCursor(xpac,ypac); // On se place en position de départ de pacman
  lcd.write(0); // et on pose le caractere 0 (Pacman)
  lcd.setCursor(xfant,yfant); // On se place en position de départ du fantome
  lcd.write(1); // et on pose le caractere 1 (fantome)
  poursuite=millis(); // On initialise le timer de poursuite (pour eviter un mouvement immédiat)
}

void loop() {
  int thisChar = Serial.read();
  switch (thisChar)
  {
    case 'r':
      lcd.scrollDisplayRight();
      break;
    case 'l':
      lcd.scrollDisplayLeft();
      break;
  }
  if ((thisChar>'a')&(thisChar<'z'))
  {
      lcd.setCursor(1,1);
      lcd.write(thisChar);
  }
  if (millis()-keystruck>VITESSE_PAC) // Si plus de 200ms depuis le dernier mouvement de joystick
  {
    int joy=lcd.get_key();
    switch (joy)
    {
      case -1:
        break;
      case 3:
        Serial.print("Pacman bouge à gauche.\n"); // envoi de controle sur liaison série
        Serial.print(keystruck);
        bouge(-1,0);// déplacement
        keystruck=millis(); // remise à zero du timer de mouvement
      break;
      case 0:
        Serial.print("Pacman bouge à droite\n");// envoi de controle sur liaison série
        bouge(1,0);// déplacement
        keystruck=millis(); // remise à zero du timer de mouvement
      break;
      case 1:
        Serial.print("Pacman bouge en haut\n");// envoi de controle sur liaison série
        bouge(0,-1);// déplacement
        keystruck=millis(); // remise à zero du timer de mouvement
      break;
      case 2:
        Serial.print("Pacman bouge en bas\n");
        bouge(0,1);// déplacement
        keystruck=millis(); // remise à zero du timer de mouvement
      break;
      case 4:
        Serial.print("centre\n");
        light=!light;  //On inverse le statut d'allumage
        lcd.backLight(light); // on applique
        keystruck=millis(); // remise à zero du timer de mouvement
      break;
      default:
        Serial.print(joy); //au cas ou...
        keystruck=millis(); // remise à zero du timer de mouvement
    };   
  };
  if (millis()-poursuite>VITESSE_FANT)
  {
    poursuis();
    poursuite=millis();
  }
  if ((xpac==xfant)&&(ypac==yfant)&&(partieEnCours))
    {
      perdu();
    }
}
Jean Malha
 
Messages: 10
Inscription: Lun 14 Nov 2011 21:16

Re: Un Pacman pour le Deuligne

Message non lude Lionel » Mar 15 Nov 2011 00:07

Wouuuuuuuuuuuahhh !!!

Je suis impatient de tester ça demain !! arrgh, j'ai toujours un Deuligne avec moi mais pas ca soir !! gasp !
A demain pour un test !!
Merci !
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Un Pacman pour le Deuligne

Message non lude ikujam » Mar 15 Nov 2011 12:14

Tout d'abord bravo, c'est tout simplement magnifique :D


je me suis permis de reprendre ton code et de prolonger le jeu, avec un caractère de plus pour les points.
et aussi, le phantome devient de plus en plus vite...

Code: Tout sélectionner
#include "Wire.h" // insertion de la librairie I2C (obligatoire)
#include <Deuligne.h> // insertion de la librairie Deuligne (obligatoire)

#define VITESSE_PAC 150
#define VITESSE_FANT 2000
#define MAXX 15
#define MAXY 1

Deuligne lcd; // Déclaration de l'objet lcd


// Charactère spécifique pacman
byte pacman[8] = {
B00000,
B00000,
B01110,
B11011,
B11100,
B01110,
B00000,
B00000
};

// Charactère spécifique fantome
byte fantome[8] = {
B00000,
B00000,
B01110,
B10101,
B11111,
B11111,
B10101,
B00000
};

byte point[8] = {
B00000,
B00000,
B00000,
B01110,
B01110,
B00000,
B00000,
B00000
};

// Tableau des points à manger
byte points[MAXX+1][MAXY+1];

int xpac=2; // Position de pacman en X (colone)
int ypac=1; //position de pacmanen y (ligne)
int xfant=15;// Position du fantome en X (colone)
int yfant=0;// Position du fantome en Y (ligne)
byte light=true; //Eclairage
long keystruck=0; //dernier appui sur un bouton
long poursuite=0; //dernier movement du fantome
byte partieEnCours=true; // pour eviter de boucler sur la fin
byte vide=false; // pour tester si tout est manger

byte level=0; // niveau
int score=0; // niveau

void bouge(int x,int y) // fonction pour bouger pacman
{
int oldx=xpac;
int oldy=ypac;
if (((xpac+x)>=0)&((xpac+x)<=MAXX)) xpac=xpac+x; //Si pas sorti d'ecran, on change x
if (((ypac+y)>=0)&((ypac+y)<=MAXY)) ypac=ypac+y;//Si pas sorti d'ecran, on change y
lcd.setCursor(xpac,ypac); // On se place en nouvelle position
lcd.write(0); // et on pose le caractere 0 (Pacman)
lcd.setCursor(oldx,oldy); // On se place en ancienne position
if ((xpac!=oldx)||(ypac!=oldy)) lcd.print(" "); // et on efface Pacman (s'il a bougé)
if(points[xpac][ypac]){
points[xpac][ypac]=false; // mange le truc
  score++;
}
vide=true;
for (int i=0; i<=MAXX; i=i+1)
for (int j=0; j<=MAXY; j=j+1)
if (points[i][j])  vide=false;
if ((vide)&&(partieEnCours)) gagne();
}

void perdu(){
lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
lcd.print("***Game Over****"); // on écrit le début du texte de début
lcd.setCursor(0, 1); // on se place au point 0,1 (2eme ligne, 1er caractere)
lcd.print("***");
lcd.print(score);
lcd.print("***");
while(1){
  delay(1000);
}

}

void gagne()
{
level++;
lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
lcd.print("*** Next level ***"); // on écrit le début du texte de début
lcd.setCursor(0, 1); // on se place au point 0,0 (1ere ligne, 1er caractere)
lcd.print("*** ");
lcd.print(level,DEC);
lcd.print(" ***"); // on écrit le début du texte de début
delay(2000); // 2 secondes de pause
initLevel(); //reinitialisation du tableau
}

void poursuis() // fonction pour bouger fantome
{
int oldx=xfant;
int oldy=yfant;
if (yfant<ypac) yfant=yfant+1;
else if (yfant>ypac) yfant=yfant-1;
else if (xfant<xpac) xfant=xfant+1;
else if (xfant>xpac) xfant=xfant-1;
lcd.setCursor(xfant,yfant); // On se place en nouvelle position
lcd.write(1); // et on pose le caractere 0 (Fantome)
lcd.setCursor(oldx,oldy); // On se place en ancienne position
if ((oldx!=xfant)||(oldy!=yfant)) // et on efface Fantome (s'il a bougé)
{
if (points[oldx][oldy]) lcd.write(2); // remplacé par un point si pas mangé
else lcd.print(" "); // remplacé par un espace si déja magé
}
}

//initialisation du tableau
void initLevel(){
for (int i=0; i<=MAXX; i=i+1)
for (int j=0; j<=MAXY; j=j+1){
  points[i][j]=true; //initialisation du tableau des trucs à manger
  lcd.setCursor(i-1, j-1); // on se place au point j,i
  lcd.write(2); // on écrit les points
}
lcd.setCursor(xpac,ypac); // On se place en position de départ de pacman
lcd.write(0); // et on pose le caractere 0 (Pacman)
lcd.setCursor(xfant,yfant); // On se place en position de départ du fantome
lcd.write(1); // et on pose le caractere 1 (fantome)
poursuite=millis(); // On initialise le timer de poursuite (pour eviter un mouvement immédiat)
vide=false;
}

void setup() {
Serial.begin(9600);
Wire.begin(); // initialisation I2C (obligatoire)
lcd.init(); // initialisation LCD (obligatoire)
lcd.createChar(0, pacman); // creation du caractere pacman et affectation au numéro 0
lcd.createChar(1, fantome); // creation du caractere de fantome et affectation au numéro 1
lcd.createChar(2, point); // creation du caractere de point et affectation au numéro 2
lcd.backLight(true); // on allume le retro eclairage
lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere)
lcd.print("Pacman!"); // on écrit le début du texte de début
delay (5000); // Splash screen
initLevel(); // initialisation du tableau
}

void loop() {
int thisChar = Serial.read();
switch (thisChar)
{
case 'r':
lcd.scrollDisplayRight();
break;
case 'l':
lcd.scrollDisplayLeft();
break;
}
if ((thisChar>'a')&(thisChar<'z'))
{
lcd.setCursor(1,1);
lcd.write(thisChar);
}
if (millis()-keystruck>VITESSE_PAC) // Si plus de 200ms depuis le dernier mouvement de joystick
{
int joy=lcd.get_key();
switch (joy)
{
case -1:
break;
case 3:
Serial.print("Pacman bouge à gauche.\n"); // envoi de controle sur liaison série
Serial.print(keystruck);
bouge(-1,0);// déplacement
keystruck=millis(); // remise à zero du timer de mouvement
break;
case 0:
Serial.print("Pacman bouge à droite\n");// envoi de controle sur liaison série
bouge(1,0);// déplacement
keystruck=millis(); // remise à zero du timer de mouvement
break;
case 1:
Serial.print("Pacman bouge en haut\n");// envoi de controle sur liaison série
bouge(0,-1);// déplacement
keystruck=millis(); // remise à zero du timer de mouvement
break;
case 2:
Serial.print("Pacman bouge en bas\n");
bouge(0,1);// déplacement
keystruck=millis(); // remise à zero du timer de mouvement
break;
case 4:
Serial.print("centre\n");
light=!light; //On inverse le statut d'allumage
lcd.backLight(light); // on applique
keystruck=millis(); // remise à zero du timer de mouvement
break;
default:
Serial.print(joy); //au cas ou...
keystruck=millis(); // remise à zero du timer de mouvement
};
};
if (millis()-poursuite>VITESSE_FANT/(level+1)+10)
{
poursuis();
poursuite=millis();
}
if ((xpac==xfant)&&(ypac==yfant)&&(partieEnCours))
{
perdu();
}
}
Avatar de l’utilisateur
ikujam
 
Messages: 9
Inscription: Mer 9 Fév 2011 11:30
Localisation: toulouse

Re: Un Pacman pour le Deuligne

Message non lude Lionel » Mar 15 Nov 2011 16:47

Génial !! Merci !!

"Snootlab Fun category" : Piece of code of the year !!



J'ai mis l'upgrade d'Ikujam, trop dur le level 2 !!! 8-)
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Un Pacman pour le Deuligne

Message non lude Jean Malha » Mer 16 Nov 2011 20:23

Content que l'idée aie plu.
Merci à ikujam pour l'update.
Jean Malha
 
Messages: 10
Inscription: Lun 14 Nov 2011 21:16


Retourner vers Deuligne

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron