// Hardware Defines #define PinLost 2 // Lost LED #define PinWon 4 // Won LED #define PinS1 7 // Switch 1 #define PinS2 8 // Switch 2 #define PinMeter 9 // Meter #define PinSpeaker 11 #define PinStart 12 // Start Button #define PinThrust 13 // Thrust Button // Software Defines #define DecsentRate .16 // 1.6 meters per 100ms #define ThrustFull .64 // 6.4 meters per 1000ms #define MaxThrust -5 #define GameInterval 200 // 1000ms == 1 second #define StartingFuel 255 #define StartingAltitude 2550 // Variables byte s1_status, s2_status, thrust_status; byte fuel = StartingFuel; int altitude = StartingAltitude; float descent = 0; //long random_number = 0; boolean thrust_button_flag; boolean need_to_display_score = true; unsigned long last_blink_ms, last_game_ms; // Setup void setup() { pinMode(PinThrust, INPUT); // configure button as input pinMode(PinStart, INPUT); pinMode(PinLost, OUTPUT); pinMode(PinWon, OUTPUT); pinMode(PinSpeaker, OUTPUT); } // Loop void loop() { analogWrite(PinSpeaker, 0); delay (120); // Wait for Start Button to start game... if (digitalRead(PinStart) == LOW) { altitude = StartingAltitude; //fuel = StartingFuel; fuel = analogRead(0) / 4; descent = 0; digitalWrite(PinLost, LOW); digitalWrite(PinWon, LOW); need_to_display_score = true; delay(10); } // Game in progress... while (altitude > 0) { if (millis() - last_game_ms > GameInterval) { last_game_ms = millis(); if (thrust_button_flag) { if (fuel > 3) { fuel--; fuel--; fuel--; if (descent > 0) { if (descent < ThrustFull) { descent = 0; } else { descent -= ThrustFull; } } } } descent += DecsentRate; if (descent > 254) { descent = 254; } // Handle altitude if (altitude < descent) { altitude = 0; } else { altitude -= descent; } thrust_button_flag = false; } thrust_status = digitalRead(PinThrust); if (thrust_status == LOW) { thrust_button_flag = true; } // Handle Display handleDisplay(); delay(10); } // Game Over if (need_to_display_score == true) { if (descent > 5.1) { digitalWrite(PinLost, HIGH); randomSeed(millis()); for (byte i = 0; i < 255; i++) { analogWrite(PinSpeaker, random(255)); delay(5); } need_to_display_score = false; } else { digitalWrite(PinWon, HIGH); for (byte i = 0; i < 10; i++) { analogWrite(PinSpeaker, random(100)); delay(200); analogWrite(PinSpeaker, random(255)); delay(70); } need_to_display_score = false; } } handleDisplay(); } void handleDisplay() { s1_status = digitalRead(PinS1); s2_status = digitalRead(PinS2); if (s1_status == LOW) { setMeter(descent * 10); } else if (s2_status == LOW) { setMeter(fuel); } else { setMeter(altitude / 10); } return; } void setMeter(int value) { analogWrite(PinMeter, value); return; } // OLD LOOP /* void loop() { // Wait for button press to start game // do { // delay(100); // } while (digitalRead(pinThrust) != LOW); // fade in (from min to max) for(value = 0 ; value <= 255; value+=5) { analogWrite(pinMeter, value); // sets the value (range from 0 to 255) if (digitalRead(pinThrust) == HIGH) { delay(300); } else { delay(30); } } // fade out (from max to min) for(value = 255; value >=0; value-=5) { analogWrite(pinMeter, value); if (digitalRead(pinThrust) == HIGH) { delay(30); } else { delay(300); } } } */