Components and supplies
RGB LCD Shield Kit, 16x2 Character Display
Arduino UNO
Accessory, Screw
Tools and machines
Multitool, Screwdriver
Project description
Code
Pacman code
arduino
Use it to code pacman.
1#include <LiquidCrystal.h> 2 3 4#define VITESSE_PAC 150 5#define VITESSE_FANT 2000 6#define MAXX 15 7#define MAXY 1 8 9#define btnRight 0 10#define btnUp 1 11#define btnDown 2 12#define btnLeft 3 13#define btnSelect 4 14#define btnNone 5 15 16void(* resetFunc) (void) = 0; 17LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 18 19 20//Deuligne lcd; // Déclaration de l'objet lcd 21 22 23// Charactère spécifique pacman 24byte pacman[8] = { 25 B00000, 26 B00000, 27 B01110, 28 B11011, 29 B11100, 30 B01110, 31 B00000, 32 B00000 33}; 34 35// Charactère spécifique fantome 36byte fantome[8] = { 37 B00000, 38 B00000, 39 B01110, 40 B10101, 41 B11111, 42 B11111, 43 B10101, 44 B00000 45}; 46 47byte point[8] = { 48 B00000, 49 B00000, 50 B00000, 51 B01110, 52 B01110, 53 B00000, 54 B00000, 55 B00000 56}; 57 58// Tableau des points à manger 59byte points[MAXX+1][MAXY+1]; 60 61int xpac=2; // Position de pacman en X (colone) 62int ypac=1; //position de pacmanen y (ligne) 63int xfant=15;// Position du fantome en X (colone) 64int yfant=0;// Position du fantome en Y (ligne) 65byte light=true; //Eclairage 66long keystruck=0; //dernier appui sur un bouton 67long poursuite=0; //dernier movement du fantome 68byte partieEnCours=true; // pour eviter de boucler sur la fin 69byte vide=false; // pour tester si tout est manger 70 71byte level=0; // niveau 72int score=0; // niveau 73 74void bouge(int x,int y) // fonction pour bouger pacman 75{ 76 int oldx=xpac; 77 int oldy=ypac; 78 if (((xpac+x)>=0)&((xpac+x)<=MAXX)) xpac=xpac+x; //Si pas sorti d'ecran, on change x 79 if (((ypac+y)>=0)&((ypac+y)<=MAXY)) ypac=ypac+y;//Si pas sorti d'ecran, on change y 80 lcd.setCursor(xpac,ypac); // On se place en nouvelle position 81 lcd.write(byte(0)); // et on pose le caractere 0 (Pacman) 82 lcd.setCursor(oldx,oldy); // On se place en ancienne position 83 if ((xpac!=oldx)||(ypac!=oldy)) lcd.print(" "); // et on efface Pacman (s'il a bougé) 84 if(points[xpac][ypac]){ 85 points[xpac][ypac]=false; // mange le truc 86 score++; 87 } 88 vide=true; 89 for (int i=0; i<=MAXX; i=i+1) 90 for (int j=0; j<=MAXY; j=j+1) 91 if (points[i][j]) vide=false; 92 if ((vide)&&(partieEnCours)) gagne(); 93} 94 95void perdu(){ 96 lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere) 97 lcd.print("***Game Over****"); // on écrit le début du texte de début 98 lcd.setCursor(0, 1); // on se place au point 0,1 (2eme ligne, 1er caractere) 99 lcd.print("***"); 100 lcd.print(score); 101 lcd.print("***"); 102 delay(2000); 103 resetFunc(); 104} 105 106void gagne() 107{ 108 level++; 109 lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere) 110 lcd.print("*** Next level ***"); // on écrit le début du texte de début 111 lcd.setCursor(0, 1); // on se place au point 0,0 (1ere ligne, 1er caractere) 112 lcd.print("*** "); 113 lcd.print(level,DEC); 114 lcd.print(" ***"); // on écrit le début du texte de début 115 delay(2000); // 2 secondes de pause 116 initLevel(); //reinitialisation du tableau 117} 118 119void poursuis() // fonction pour bouger fantome 120{ 121 int oldx=xfant; 122 int oldy=yfant; 123 if (yfant<ypac) yfant=yfant+1; 124 else if (yfant>ypac) yfant=yfant-1; 125 else if (xfant<xpac) xfant=xfant+1; 126 else if (xfant>xpac) xfant=xfant-1; 127 lcd.setCursor(xfant,yfant); // On se place en nouvelle position 128 lcd.write(1); // et on pose le caractere 0 (Fantome) 129 lcd.setCursor(oldx,oldy); // On se place en ancienne position 130 if ((oldx!=xfant)||(oldy!=yfant)) // et on efface Fantome (s'il a bougé) 131 { 132 if (points[oldx][oldy]) lcd.write(2); // remplacé par un point si pas mangé 133 else lcd.print(" "); // remplacé par un espace si déja magé 134 } 135} 136 137//initialisation du tableau 138void initLevel(){ 139 for (int i=0; i<=MAXX; i=i+1) 140 for (int j=0; j<=MAXY; j=j+1){ 141 points[i][j]=true; //initialisation du tableau des trucs à manger 142 lcd.setCursor(i-1, j-1); // on se place au point j,i 143 lcd.write(2); // on écrit les points 144 } 145 lcd.setCursor(xpac,ypac); // On se place en position de départ de pacman 146 lcd.write(byte(0)); // et on pose le caractere 0 (Pacman) 147 lcd.setCursor(xfant,yfant); // On se place en position de départ du fantome 148 lcd.write(1); // et on pose le caractere 1 (fantome) 149 poursuite=millis(); // On initialise le timer de poursuite (pour eviter un mouvement immédiat) 150 vide=false; 151} 152 153void setup() { 154 Serial.begin(9600); 155 //Wire.begin(); // initialisation I2C (obligatoire) 156 //lcd.init(); // initialisation LCD (obligatoire) 157 lcd.begin(16, 2); 158 lcd.createChar(0, pacman); // creation du caractere pacman et affectation au numéro 0 159 lcd.createChar(1, fantome); // creation du caractere de fantome et affectation au numéro 1 160 lcd.createChar(2, point); // creation du caractere de point et affectation au numéro 2 161 //lcd.backLight(true); // on allume le retro eclairage 162 lcd.setCursor(0, 0); // on se place au point 0,0 (1ere ligne, 1er caractere) 163 lcd.print("Pacman!"); // on écrit le début du texte de début 164 delay (5000); // Splash screen 165 initLevel(); // initialisation du tableau 166} 167 168void loop() { 169 int thisChar = Serial.read(); 170 switch (thisChar) 171 { 172 case 'r': 173 lcd.scrollDisplayRight(); 174 break; 175 case 'l': 176 lcd.scrollDisplayLeft(); 177 break; 178 } 179 if ((thisChar>'a')&(thisChar<'z')) 180 { 181 lcd.setCursor(1,1); 182 lcd.write(thisChar); 183 } 184 if (millis()-keystruck>VITESSE_PAC) // Si plus de 200ms depuis le dernier mouvement de joystick 185 { 186 int joy=getKey(); 187 switch (joy) 188 { 189 case btnNone: 190 break; 191 case btnLeft: 192 Serial.print("Pacman bouge à gauche.\ 193"); // envoi de controle sur liaison série 194 Serial.print(keystruck); 195 bouge(-1,0);// déplacement 196 keystruck=millis(); // remise à zero du timer de mouvement 197 break; 198 case btnRight: 199 Serial.print("Pacman bouge à droite\ 200");// envoi de controle sur liaison série 201 bouge(1,0);// déplacement 202 keystruck=millis(); // remise à zero du timer de mouvement 203 break; 204 case btnUp: 205 Serial.print("Pacman bouge en haut\ 206");// envoi de controle sur liaison série 207 bouge(0,-1);// déplacement 208 keystruck=millis(); // remise à zero du timer de mouvement 209 break; 210 case btnDown: 211 Serial.print("Pacman bouge en bas\ 212"); 213 bouge(0,1);// déplacement 214 keystruck=millis(); // remise à zero du timer de mouvement 215 break; 216 /*case 4: 217 Serial.print("centre\ 218"); 219 light=!light; //On inverse le statut d'allumage 220 lcd.backLight(light); // on applique 221 keystruck=millis(); // remise à zero du timer de mouvement 222 break;*/ 223 default: 224 Serial.print(joy); //au cas ou... 225 keystruck=millis(); // remise à zero du timer de mouvement 226 }; 227 }; 228 if (millis()-poursuite>VITESSE_FANT/(level+1)+10) 229 { 230 poursuis(); 231 poursuite=millis(); 232 } 233 if ((xpac==xfant)&&(ypac==yfant)&&(partieEnCours)) 234 { 235 perdu(); 236 } 237} 238 239 240int getKey() { 241 int b = analogRead(A0); 242 if (b > 1000) return btnNone; 243 delay(8); 244 if (b < 50) return btnRight; 245 if (b < 180) return btnUp; 246 if (b < 330) return btnDown; 247 if (b < 520) return btnLeft; 248 if (b < 700) return btnSelect; 249} 250COMMENTS
Comments
Only logged in users can leave comments
mzitella
0 Followers
•2 Projects
0
1
moses_shriver
a year ago
you complete project thief. this stupid arduino user stole a project