struct PlayerData {
String name;
int score[4];
float averageScore;
} Player[5];
// basic info needed
int count = 0;
unsigned long currentMillis = millis();
unsigned long lastMillis = millis();
int ReactionButton = A0;
int StartButton = A1;
const int LED_Start_1 = 5, LED_Start_2 = 6, LED_Start_3 = 7, LED_SerialRead = 8, LED_Reaction = 2;
void setup() {
Serial.begin(9600);
delay(50);
pinMode(LED_Reaction, OUTPUT);
pinMode(ReactionButton, INPUT_PULLUP);
pinMode(StartButton, INPUT_PULLUP);
pinMode(LED_Start_1, OUTPUT);
pinMode(LED_Start_2, OUTPUT);
pinMode(LED_Start_3, OUTPUT);
pinMode(LED_SerialRead, OUTPUT);
Serial.println("Game ON!");
}
void loop() {
int player = 0;
int static thisManyPlayers;
if (count == 0) {
thisManyPlayers = howManyPlayers();
}
player = whoIsPlaying(thisManyPlayers);
ActivateReactionTest();
ReactionTest(player);
whoIsTheBest(thisManyPlayers, player);
average(player);
PrintAllScores(thisManyPlayers);
}
int howManyPlayers() {
int thisManyPlayers;
count = 1;
Serial.println("How many Players? (max 4)");
while (Serial.available() == 0) { //Wait for information
digitalWrite(LED_SerialRead, HIGH);
}
if (Serial.available() > 0) {
// read the incoming byte:
digitalWrite(LED_SerialRead, LOW);
int thisManyPlayers = Serial.read();
thisManyPlayers = thisManyPlayers - '0';
Serial.print(thisManyPlayers);
Serial.println(" player(s)");
for (int i = 0; i < thisManyPlayers; i++) {
Serial.print("Enter Player ");
Serial.println(i + 1);
while (Serial.available() == 0) { //Wait for information
digitalWrite(LED_SerialRead, HIGH);
}
if (Serial.available() > 0) {
// read the incoming byte:
digitalWrite(LED_SerialRead, LOW);
String playerName = Serial.readString();
Player[i].name = playerName;
Serial.print("Welcome ");
Serial.println(Player[i].name);
}
}
for (int i = 0; i < thisManyPlayers; i++) {
Serial.print("Player ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(Player[i].name);
}
return thisManyPlayers;
}
}
int whoIsPlaying(int thisManyPlayers) {
int player;
Serial.print(thisManyPlayers);
Serial.println(" player(s) are playing");
Serial.println("Who wants to play? (type in your name)");
while (Serial.available() == 0) { //Wait for information
digitalWrite(LED_SerialRead, HIGH);
}
if (Serial.available() > 0) {
// read the incoming byte:
digitalWrite(LED_SerialRead, LOW);
String readPlayerName = Serial.readString();
//readPlayerName.toLowerCase(); // sets all letter casing to lower case
for (int i = 0; i < thisManyPlayers; i++) {
if (Player[i].name == readPlayerName) {
Serial.print(Player[i].name);
Serial.println(" get ready to play!");
player = i;
return player;
}
}
Serial.print(readPlayerName);
Serial.println("Player does not exist... Try again");
player = whoIsPlaying(thisManyPlayers);
}
}
void ActivateReactionTest() {
Serial.println("Press the button to begin!");
while (digitalRead(StartButton) == HIGH) {
// wait for activation
}
if (digitalRead(StartButton) == LOW) {
digitalWrite(LED_Start_1, HIGH);
delay(500);
digitalWrite(LED_Start_2, HIGH);
delay(500);
digitalWrite(LED_Start_3, HIGH);
delay(500);
digitalWrite(LED_Start_1, LOW);
digitalWrite(LED_Start_2, LOW);
digitalWrite(LED_Start_3, LOW);
}
}
void ReactionTest(int player) {
delay(random(5000));
digitalWrite(LED_Reaction, HIGH);
currentMillis = millis();
while (digitalRead(ReactionButton) == HIGH) {
//wait
}
if (digitalRead(ReactionButton == LOW)) {
delay(10); // helps remove the multiple LOWS read when hitting the button
digitalWrite(LED_Reaction, LOW);
int lastMillis = millis();
int PlayerTime = lastMillis - currentMillis;
whichScore(player, PlayerTime);
Serial.print(PlayerTime);
Serial.println(" milliseconds ");
}
}
int whichScore(int player, int PlayerTime) {
int placement;
for (int i = 0; i < 4; i++) { //check to see if there is a free slot for the new score (0)
if (Player[player].score[i] == 0) {
Player[player].score[i] = PlayerTime;
placement = i;
break; //stop the loop
}
}
for (int i = 0; i < 4; i++) { // switch the scores, if a score is better
if (PlayerTime < Player[player].score[i]) {
int *pScore;
int *pPlayerTime;
int switchHelper;
pScore = &Player[player].score[i];
pPlayerTime = &PlayerTime;
switchHelper = *pScore;
*pScore = *pPlayerTime;
*pPlayerTime = switchHelper;
Player[player].score[i] = *pScore;
Player[player].score[placement] = *pPlayerTime;
Serial.println("YOU IMPROVED!");
}
}
}
int whoIsTheBest(int thisManyPlayers, int player) {
for (int i = 0; i < thisManyPlayers; i++)
if (Player[player].score[0] < Player[i].score[0] && Player[player].score[0] > 0 || Player[i].score[0] == 0) {
Serial.println("we are here");
switchStats(player, i);
Serial.print("Old player:");
Serial.print(player);
Serial.print(" Old i:");
Serial.println(i);
//player = i; //switching players so it matches
Serial.print("New player:");
Serial.print(player);
Serial.print(" New i:");
Serial.println(i);
// i = 0; // reset loop so it will check for others to switch
} //return player; //need to report back which player is being calculated for the average
}
int switchStats(int player_1, int player_2) {
int switchHelper;
int *pScore_1;
int *pScore_2;
for (int i = 0; i < 4; i++) {
pScore_1 = &Player[player_1].score[i];
pScore_2 = &Player[player_2].score[i];
switchHelper = *pScore_1;
*pScore_1 = *pScore_2;
*pScore_2 = switchHelper;
}
switchName(&Player[player_1].name, &Player[player_2].name);
}
String switchName(String *player_1, String *player_2) {
String switchHelper;
switchHelper = *player_1;
*player_1 = *player_2;
*player_2 = switchHelper;
Serial.println("so far so good");
}
float average(int player) {
float averageScore;
int total = 0;
int amountScore = 0;
for (int i = 0; i < 4; i++) { //check to see if the PlayerTime is bigger than
if (Player[player].score[i] == 0) {
amountScore = i;
break; //stop the loop
}
}
for (int i = 0; i <= amountScore; i++) {
total += Player[player].score[i];
}
averageScore = total / amountScore;
Player[player].averageScore = averageScore;
}
int PrintAllScores(int thisManyPlayers) {
for (int i = 0; i < thisManyPlayers; i++) {
Serial.print(Player[i].name);
Serial.print(": ");
Serial.print(Player[i].score[0]);
Serial.print(" ");
Serial.print(Player[i].score[1]);
Serial.print(" ");
Serial.print(Player[i].score[2]);
Serial.print(" ");
Serial.print(Player[i].score[3]);
Serial.print(" Avg: ");
Serial.println(Player[i].averageScore);
// whoIsPlaying(thisManyPlayers);
}
return thisManyPlayers;
}