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++; | ||
| - | } | ||
| - | } | ||