This shows you the differences between two versions of the page.
pm:prj2023:ncaroi:supermariogame [2023/05/30 02:20] elena_ioana.stefan |
pm:prj2023:ncaroi:supermariogame [2023/05/30 02:21] (current) elena_ioana.stefan |
||
---|---|---|---|
Line 41: | Line 41: | ||
* Tinkercad | * Tinkercad | ||
</note> | </note> | ||
- | |||
- | 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++; | ||
- | } | ||
- | } | ||