//player1 win = blue //player2 win = green //port numbers for player 1 int player1ButtonPort = A1; int player1pt1Port = 4; int player1pt2Port = 3; int player1pt3Port = 2; int player1WinPtPort = A2; //port numbers for player 2 int player2ButtonPort = A0; int player2pt1Port = 11; int player2pt2Port = 12; int player2pt3Port = 13; int player2WinPtPort = A3; // arrays of the port numbers for each player's points int player1points[] = { player1pt1Port, player1pt2Port, player1pt3Port, player1WinPtPort }; int player2points[] = { player2pt1Port, player2pt2Port, player2pt3Port, player2WinPtPort }; int p1ptCounter = 0; int p2ptCounter = 0; char player1[] = "Player1"; char player2[] = "Player2"; //Delay values are in units of ms int FlashDelay = 150; int possibleIntervalForFlash = 3500; int oneSecondDelay = 1000; int resetDelay = 3000; int redLed1 = 5; int redLed2 = 8; int greenLed1 = 6; int greenLed2 = 9; int blueLed1 = 7; int blueLed2 = 10; int listSide1[] = { blueLed1, redLed1, greenLed1 }; int listSide2[] = { blueLed2, redLed2, greenLed2 }; int led1 = 0; int led2 = 0; void setup() { Serial.begin(9600); pinMode(player1pt1Port, OUTPUT); pinMode(player1pt2Port, OUTPUT); pinMode(player1pt3Port, OUTPUT); pinMode(player1WinPtPort, OUTPUT); pinMode(player2pt1Port, OUTPUT); pinMode(player2pt2Port, OUTPUT); pinMode(player2pt3Port, OUTPUT); pinMode(player2WinPtPort, OUTPUT); pinMode(blueLed1, OUTPUT); pinMode(blueLed2, OUTPUT); pinMode(redLed1, OUTPUT); pinMode(redLed2, OUTPUT); pinMode(greenLed1, OUTPUT); pinMode(greenLed2, OUTPUT); pinMode(player1ButtonPort,INPUT); pinMode(player2ButtonPort,INPUT); } //Checks to see if either of the players are cheating and holding down a button bool validGame() { if( digitalRead( player1ButtonPort ) == HIGH || digitalRead( player2ButtonPort ) == HIGH ) { return false; } return true; } void playGame() { digitalWrite( listSide2[led2], LOW); delay( random( oneSecondDelay ) ); if( !validGame() ) return true; sideLed(); } void sideLed(){ led1 = random(0, 3); digitalWrite( listSide1[led1], HIGH ); delay( FlashDelay ); digitalWrite( listSide1[led1], LOW); delay( random( 2000, possibleIntervalForFlash ) ); led2 = random(0, 3); digitalWrite( listSide2[led2], HIGH ); if (led1 == led2){ playPhaseWin(); } else{ delay( resetDelay ); digitalWrite( listSide2[led2], LOW ); playGame(); } } void playPhaseWin() { //Wait for one of the players to react to the flash while( digitalRead( player1ButtonPort ) == LOW && digitalRead( player2ButtonPort ) == LOW) { delay(1); } digitalRead( player1ButtonPort ) == HIGH ? givePoint( player1, p1ptCounter ) : givePoint( player2, p2ptCounter ); } void playPhaseLose() { //Wait for one of the players to react to the flash while( digitalRead( player1ButtonPort ) == LOW && digitalRead( player2ButtonPort ) == LOW) { delay(1); } digitalRead( player1ButtonPort ) == HIGH ? losePoint( player1, p1ptCounter ) : losePoint( player2, p2ptCounter ); playGame(); } // Takes in a char array and int. The 'player' param denotes which player to give a point to, // while the 'point' param represents how many points the player has void givePoint(char player[], int& point) { if( player == player1 ) { digitalWrite( player1points[ point ],HIGH ); ++point; } else { digitalWrite( player2points[ point ],HIGH ); ++point; } } void losePoint(char player[], int& point){ if( player == player1 ) { if(point > 0){ digitalWrite( player1points[ point ],LOW ); point = 0; } } if( player == player2 ) { if(point > 0){ digitalWrite( player2points[ point ],LOW ); point = 0; } } } void resetGame() { p1ptCounter = 0; p2ptCounter = 0; digitalWrite( player1pt1Port,LOW ); digitalWrite( player1pt2Port,LOW ); digitalWrite( player1pt3Port,LOW ); digitalWrite( player1WinPtPort,LOW ); digitalWrite( player2pt1Port,LOW ); digitalWrite( player2pt2Port,LOW ); digitalWrite( player2pt3Port,LOW ); digitalWrite( player2WinPtPort,LOW ); digitalWrite(blueLed1, LOW); digitalWrite(blueLed2, LOW); digitalWrite(redLed1, LOW); digitalWrite(redLed2, LOW); digitalWrite(greenLed1, LOW); digitalWrite(greenLed2, LOW); } void alertGameBegin() { digitalWrite( player1pt1Port,HIGH ); digitalWrite( player1pt2Port,HIGH ); digitalWrite( player1pt3Port,HIGH ); digitalWrite( player1WinPtPort,HIGH ); digitalWrite( player2pt1Port,HIGH ); digitalWrite( player2pt2Port,HIGH ); digitalWrite( player2pt3Port,HIGH ); digitalWrite(blueLed1, HIGH); digitalWrite(blueLed2, HIGH); digitalWrite(redLed1, HIGH); digitalWrite(redLed2, HIGH); digitalWrite(greenLed1, HIGH); digitalWrite(greenLed2, HIGH); delay( oneSecondDelay ); digitalWrite( player1pt1Port,LOW ); digitalWrite( player1pt2Port,LOW ); digitalWrite( player1pt3Port,LOW ); digitalWrite( player1WinPtPort,LOW ); digitalWrite( player2pt1Port,LOW ); digitalWrite( player2pt2Port,LOW ); digitalWrite( player2pt3Port,LOW ); digitalWrite(blueLed1, LOW); digitalWrite(blueLed2, LOW); digitalWrite(redLed1, LOW); digitalWrite(redLed2, LOW); digitalWrite(greenLed1, LOW); digitalWrite(greenLed2, LOW); } void alertPlayerWon( int playerPoints[] ) { // Flash the lights of the player that won 3 times for( int i = 0; i < 3; ++i ) { digitalWrite(playerPoints[0],LOW); digitalWrite(playerPoints[1],LOW); digitalWrite(playerPoints[2],LOW); digitalWrite(playerPoints[3],LOW); delay( oneSecondDelay ); digitalWrite(playerPoints[0],HIGH); digitalWrite(playerPoints[1],HIGH); digitalWrite(playerPoints[2],HIGH); digitalWrite(playerPoints[3],HIGH); delay( oneSecondDelay ); } } void gameLoop(){ if( digitalRead( player1ButtonPort ) == HIGH && digitalRead( player2ButtonPort ) == HIGH ){ resetGame(); alertGameBegin(); while( p1ptCounter < 4 && p2ptCounter < 4) \ { playGame(); } p1ptCounter == 4 ? alertPlayerWon( player1points ) : alertPlayerWon( player2points ); } delay( oneSecondDelay ); } void loop() { gameLoop(); }