int wayDelay = 1000; //Delay between the toggle of two LEDs on the way to and from each player int endDelay = wayDelay + wayDelay / 2; //Delay for the last LED as to make the game a little bit more fair const byte btn1 = 3; //Pin for Button 1 const byte btn2 = 2; //Pin for Button 2 int counter = 0; //Counter Variable for "Statemachine" bool randomValue; //Variable to hold seeded random value bool currentTarget; //Current player that the LED is "targeting" bool interrupt; //Variable to help with input interrupts int test; //Debug int pointsP1 = 0; //Points of P1 int pointsP2 = 0; //Points of P2 int a = 500; //Delay for Sound int b = 200; //Delay for Sound void setup() { //Start Serial Serial.begin(9600); //Register all needed Pins pinMode(LED_BUILTIN, OUTPUT); pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(10, OUTPUT); pinMode(9, OUTPUT); pinMode(8, OUTPUT); pinMode(7, OUTPUT); pinMode(4, OUTPUT); pinMode(btn1, INPUT_PULLUP); pinMode(btn2, INPUT_PULLUP); //Register Interrupts for both Buttons attachInterrupt(digitalPinToInterrupt(btn1), buttonOne, FALLING); attachInterrupt(digitalPinToInterrupt(btn2), buttonTwo, FALLING); //Entry Text Serial.println("-----Welcome to the Fab-LED-Game-----"); Serial.println("Press any Button to start the game!"); } void loop() { // Main loop switch (counter) { case 0: //StartGame digitalWrite(10, HIGH); if (!digitalRead(btn1) || !digitalRead(btn2)) { randomSeed(millis()); startGame(); } break; case 1: //Move from mid to randomly chosen player moveFromMid(currentTarget); break; case 2: //Wait For Interrupt, If no interrupt grant Points delay(endDelay); if (interrupt) { interrupt = false; counter = 3; } else { gamePoint(!currentTarget); } break; case 3: //Change LED direction when button press was successfull moveBetweenPlayers(currentTarget); break; case 4: makeSound(); //Play sound break; } } void startGame() { //Manage beginning Delay wayDelay = 1000; //set delay between leds on the way to the player endDelay = wayDelay + wayDelay / 2; //set delay of the LED at each of the ends //Start in Middle, Choose Random Player, Go into that Direction currentTarget = random(2); //Set receiving player (pseudo)randomly counter = 1; } //Function to shorten the delay to make the game faster and faster void shortenDelay() { wayDelay -= 100; endDelay = wayDelay + wayDelay / 2; } void moveFromMid(bool target) { if (target) { //Move to player 1 for (int i = 10; i < 13; i++) { delay(wayDelay); digitalWrite(i, LOW); //delay(wayDelay); digitalWrite(i + 1, HIGH); } } else { //Move to player 2 for (int j = 10; j > 7; j--) { delay(wayDelay); digitalWrite(j, LOW); // delay(wayDelay); digitalWrite(j - 1, HIGH); } } counter = 2; } void moveBetweenPlayers(bool sender) { currentTarget = !sender; shortenDelay(); if (sender) { for (int i = 13; i > 10; i--) { delay(wayDelay); digitalWrite(i, LOW); //delay(wayDelay); digitalWrite(i - 1, HIGH); } } else { for (int j = 7; j < 10; j++) { delay(wayDelay); digitalWrite(j, LOW); //delay(wayDelay); digitalWrite(j + 1, HIGH); } } moveFromMid(currentTarget); } void gamePoint(bool player) { //Manage game point and reset of game if (player) { pointsP1++; } else { pointsP2++; } Serial.println("---Current Points---"); Serial.print("Player 1: "); Serial.print(pointsP1); Serial.print(" - Player2: "); Serial.println(pointsP2); resetLEDs(); counter = 4; } void makeSound() { tone(4, 262, a); delay(b); tone(4, 294, a); delay(b); tone(4, 330, a); delay(b); tone(4, 349, a); delay(b); tone(4, 392, a); delay(b); tone(4, 392, a); delay(b * 3); tone(4, 440, a); delay(b); tone(4, 440, a); delay(b); tone(4, 440, a); delay(b); tone(4, 440, a); delay(b); tone(4, 392, a); delay(b * 3); tone(4, 440, a); delay(b); tone(4, 440, a); delay(b); tone(4, 440, a); delay(b); tone(4, 440, a); delay(b); tone(4, 392, a); delay(b * 3); tone(4, 349, a); delay(b); tone(4, 349, a); delay(b); tone(4, 349, a); delay(b); tone(4, 349, a); delay(b); tone(4, 330, a); delay(b); tone(4, 330, a); delay(b * 3); tone(4, 294, a); delay(b); tone(4, 294, a); delay(b); tone(4, 294, a); delay(b); tone(4, 294, a); delay(b); tone(4, 262, a); delay(1000); counter = 0; } void buttonOne() { //Manage Button Press Player 1 if (counter != 0) { if (digitalRead(13)) { interrupt = 1; } else { gamePoint(false); } } return; } void buttonTwo() { //Manage Button Press Player 2 if (counter != 0) { if (digitalRead(7)) { interrupt = 1; } else { gamePoint(true); } } return; } //Reset all LEDs void resetLEDs() { for (int j = 7; j < 14; j++) { digitalWrite(j, LOW); } }