This is an old revision of the document!
Scopul acestui proiect este să ofere utilizatorilor un joc Super Mario, care poate fi jucat în timpul liber. Proiectul a fost creat pentru a fi ușor de jucat și de înțeles, fiind util și pentru învățarea conceptelor hardware și software.
int gameOver[] = { NOTE_C5,-4, NOTE_G4,-4, NOTE_E4,4, NOTE_A4,-8, NOTE_B4,-8, NOTE_A4,-8, NOTE_GS4,-8, NOTE_AS4,-8, NOTE_GS4,-8, NOTE_G4,8, NOTE_D4,8, NOTE_E4,-2, };
void graphics(){
byte man[64] = { // position 1 B01100, B01100, B00000, B01110, B11100, B01100, B11010, B10011, // position 2 B01100, B01100, B00000, B01100, B01100, B01100, B01100, B01110, // Jump B01100, B01100, B00000, B11110, B01101, B11111, B10000, B00000, // Jump lower B11110, B01101, B11111, B10000, B00000, B00000, B00000, B00000, // Ground B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, // Ground right B00011, B00011, B00011, B00011, B00011, B00011, B00011, B00011, // Ground left B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000 }; int g; for (g = 0; g < 8; g++) { lcd.createChar(g, &man[g*8]); }
}
void startGame(){
lcd.setCursor (1,1); lcd.print("Press Up to Start!"); lcd.setCursor (0,1); currentPos = run_1;
}
void drawmanWalk(){
man_low_pos=1; lcd.setCursor(0,1); currentPos = run_2; lcd.write(byte(currentPos)); delay(120); lcd.setCursor(0,1); currentPos = run_1; lcd.write(byte(currentPos)); delay(120); detect();
}
void drawmanJump(){
man_low_pos=1; man_up_pos=1; lcd.setCursor (0,0); currentPosUp = jump_half_head; lcd.write(byte(currentPosUp)); lcd.setCursor (0,1); currentPosDown = jump_half_body; lcd.write(byte(currentPosDown)); detect();
tone(buzzer, NOTE_A6, 100); delay(110); drawObject();
man_low_pos=0; man_up_pos=1; lcd.setCursor (0,0); currentPosUp = jump_high; lcd.write(byte(currentPosUp)); lcd.setCursor (0,1); lcd.print(" "); detect(); delay(110); drawObject(); detect(); delay(140); drawObject(); detect();
man_low_pos=1; man_up_pos=1; lcd.setCursor (0,0); currentPosUp = jump_half_head; lcd.write(byte(currentPosUp)); lcd.setCursor (0,1); currentPosDown = jump_half_body; lcd.write(byte(currentPosDown)); delay(140); lcd.setCursor(0,0); lcd.print(" "); man_up_pos=0; man_low_pos=1; detect();
}
void objectRandom (int upperBG[], int lowerBG[]){
int ObjectPos = random(5,10);
switch (ObjectPos){
case upperObject1: lowerBG[16] = empty; if (lowerBG[15] == lowerObject1) upperBG[16] = empty; else upperBG[16] = upperObject1; break; case lowerObject1: if ((lowerBG[15] == lowerObject1)|| (lowerBG[14] == lowerObject1)|| (lowerBG[13] == lowerObject1)|| (upperBG[15] == upperObject1)){ lowerBG[16] = empty; } else lowerBG[16] = lowerObject1; break; case empty: case 8: case 9: case 10: upperBG[16] = empty; lowerBG[16] = empty; break; }
}
void detect(){
if((man_up_pos==1 && upperBG[0]!=7)|| (man_low_pos==1&&lowerBG[0]!=7)){ lcd.clear(); lcd.setCursor(1,0); playing = false; scoring = false; }
}
void drawObject (){
if(millis() - ts > 300) { ts = millis(); objectRandom(upperBG,lowerBG); } for (int i = 0; i < 16; i++){ upperBG[i]=upperBG[i+1]; lowerBG[i]=lowerBG[i+1]; } if(upperBG[0]!=7){ lcd.setCursor(0,0); lcd.write(byte(upperBG[0])); } else if(man_up_pos==0){ lcd.setCursor(0,0); lcd.print(" "); }
if(lowerBG[0]!=7){ lcd.setCursor(0,1); lcd.write(byte(lowerBG[0])); } else if(man_low_pos==0){ lcd.setCursor(0,1); lcd.print(" "); }
for (int i = 1; i < 16; i++){ lcd.setCursor(i,0); lcd.write(byte(upperBG[i])); lcd.setCursor(i,1); lcd.write(byte(lowerBG[i])); }
}
void over(){
digitalWrite(RED_LED, HIGH); int wholenote = (60000 * 4) / 200; int noteDuration = 0; for(int i = 0; i < 24; i+=2){ int divider = gameOver[i + 1]; if (divider > 0) { noteDuration = (wholenote) / divider; } else if (divider < 0) { noteDuration = (wholenote) / abs(divider); noteDuration *= 1.5; } tone(buzzer, gameOver[i], noteDuration * 0.9); delay(noteDuration); noTone(buzzer); }
lcd.clear(); lcd.setCursor (5,1); lcd.print ("Game Over!"); lcd.setCursor (3,2); lcd.print ("Your Score:"); lcd.setCursor (14,2); lcd.print (score); delay(delay_time); game_over = true;
}
void setup() {
Serial.begin(9600); pinMode(jump_button, INPUT); digitalWrite(jump_button, HIGH); graphics(); lcd.begin(20, 4); lcd.backlight(); pinMode(buzzerPin, OUTPUT); pinMode(RED_LED, OUTPUT); digitalWrite(RED_LED, LOW);
}
void loop() {
while(game_over) { buttonPushed = (digitalRead(jump_button) == LOW); if(buttonPushed) { lcd.clear(); buttonPushed = false; playing = false; scoring = false; score = 0; for(int i = 0; i < 17; i++) { upperBG[i]= empty; lowerBG[i] = empty; } game_over = false; } } buttonPushed = (digitalRead(jump_button) == LOW); if (!playing && score == 0) { startGame(); digitalWrite(RED_LED, LOW); if (buttonPushed) { graphics(); playing = true; scoring = true; buttonPushed = false; lcd.clear(); } } if(!playing && score > 0) { over(); } if (playing){ drawObject(); drawmanWalk(); if((mode == 0 || mode == 1 ) && buttonPushed){ drawmanJump(); buttonPushed = false; } if(mode == 1) { if (lowerBG[3] == lowerObject1){ digitalWrite(RED_LED, HIGH); } else { digitalWrite(RED_LED, LOW); } } if(mode == 2) { if (man_low_pos==1 && lowerBG[2]!=7){ drawmanJump(); } } }
if (scoring == true){
score++; }
}
Proiectul m-a ajutat să aprofundez conceptele studiate la laboratoarele de PM, mai ales să înțeleg utilizarea protocolului I2C.
Melodia SuperMario : https://github.com/robsoncouto/arduino-songs/blob/master/supermariobros/supermariobros.ino
Configurare I2C: https://www.youtube.com/watch?v=EAeuxjtkumM&t=125s