// [] display accuracy %
// [to be added] store times from each sequence
// [to be added] add up all time for a total
// [to be checked and added] divide total time by # of opp sequences
// [to be checked and added] display average reaction time
// [] create a game score (errors,fls psh, ave times)
// [] add motion sensor for player leaving area (CHEATING)
// [] map out all variable categories for game(spd, dely,
// [] add in fakes/feints/sound distractors
// [] make 10 levels of gameplay(spd, pause,penalizations,# chncs,
// [] lvl 0 = free style: arms move, ramping up spd as time progresses-goal most # button pushes
// [] Bounus feature- allows 1 sec of buttons to be pushed for bonus points.VOID if arms hits player
// []
// [] add history record of scores assigned to Alphabet order words(Apple, Book, Cat, Dog, Elephant
// [] add peizos as sensors to each arm (**can be parallel with all arms to reduce pins used)
#include <LiquidCrystal.h>
//#include <LiquidCrystal_I2C.h> //required for another simulator
//#include <Adafruit_LiquidCrystal.h> //required for another simulator
//Adafruit_LiquidCrystal lcd(0);
Adafruit_LiquidCrystal lcd(0);
byte buzzer=A5;
byte redLed = 4;
byte yellowLed = 5;
byte greenLed = 6;
byte blueLed = 7;
byte brownLed = 8;
byte whiteLed = 9;
int redButton = 10;
int yellowButton = 11;
int greenButton = 12;
int blueButton = 13;
int brownButton = 3;
int whiteButton = 2;
int buttonState1;
int buttonState2;
int buttonState3;
int buttonState4;
int buttonState5;
int buttonState6;
int buttonStateA = (buttonState1 || buttonState2 || buttonState3 || buttonState4 || buttonState5 || buttonState6);
const int potin=A0;
byte i;
byte number = 0;
byte penalty = 0;
unsigned int minRndTime = 0;
unsigned int maxRndTime = 0;
byte clickCounter = 0;
byte accClickCounter =0;
byte allClicksCounter = 0;
byte lvl = 0;
byte maxLed = 0;
byte maxPenalties = 0;
byte mode = 0;
unsigned int averageTime;
// lvl = 1;
byte totalPlayNumber = 0; // how many buttons pushed during play
byte multbuttonplay =0; // # of active buttons during gameplay
byte arms; //how many arms will be used:lt, rt,top,k=kicks (l/r),
byte armDelay =0; // time between arm attacks
byte accuracy=0; // =clickCounter/allClickCounter
byte earlyPenaltyClicks=0;
byte penaltyCounter=0;
unsigned int actTimesTotal = 0; // added up times to be averaged
unsigned int actTime = 0;
unsigned int endTime = 0;
unsigned int playerTime = 0;
unsigned int playerTimeSum = 0;
unsigned int reactionTime = 0;
unsigned int fiveSecDelay = 0;
bool again = false;
bool btnPressedBefore = false;
void setup() {
pinMode(redLed,OUTPUT);
pinMode(yellowLed,OUTPUT);
pinMode(greenLed,OUTPUT);
pinMode(blueLed,OUTPUT);
pinMode(brownLed,OUTPUT);
pinMode(whiteLed,OUTPUT);
pinMode(redButton,INPUT);
pinMode(yellowButton,INPUT);
pinMode(greenButton,INPUT);
pinMode(blueButton,INPUT);
pinMode(brownButton,INPUT);
pinMode(whiteButton,INPUT);
pinMode(buzzer,OUTPUT);
pinMode(potin, INPUT);
//potentiometer values: 0-102-204-306-408-510-612-714-816-918-1023
Serial.begin(9600);
randomSeed(analogRead(A0));
lcd.begin(16, 2);
lcd.clear();
}
void loop() {
int val = analogRead(potin);
Serial.println(val);
delay(200);
//waitForAllLowDelay();
while (mode == 0)
{
/*
digitalWrite(redLed,HIGH);
digitalWrite(yellowLed,HIGH);
digitalWrite(greenLed,HIGH);
digitalWrite(blueLed,HIGH);
digitalWrite(brownLed,HIGH);
digitalWrite(whiteLed,HIGH);
tone(buzzer,600);
delay(200);
digitalWrite(redLed,LOW);
digitalWrite(yellowLed,LOW);
digitalWrite(greenLed,LOW);
digitalWrite(blueLed,LOW);
digitalWrite(brownLed, LOW);
digitalWrite(whiteLed, LOW);
*/
lcd.setCursor(0,0);
//lcd.print("Select Game Mode");
//delay(600);
//lcd.clear();
//lcd.setCursor(0,0);
//lcd.print("1.Easy,2.Medium");
//lcd.setCursor(0,1);
//lcd.print("3.Hard");
//digitalWrite(redLed, HIGH); //Turning LED option buttons on
//digitalWrite(yellowLed, HIGH);
//digitalWrite(greenLed, HIGH);
//waitForAnyHigh();
lcd.print("Select Game Mode");
delay(200);
if (buttonStateA == false) //****TESTING TO ADD IN THIS SECTION
//*****TESTING TO ADD IN THIS SECTION
{ // Open1 while brackets
int val = analogRead(potin); // testing relocation of potin read
// Serial.println(val);
lcd.setCursor(1,0);
Serial.println(val);
lcd.setCursor(2,8);
if (val < 102)
{
lcd.print("Level 1 ");
if (buttonStateA==HIGH) // NOT RELIABLE IF TIMING ISNT PERFECT
{
mode =1;
}
}
if ((val > 103) && (val < 203))
{
lcd.print("Level 2 ");
if (buttonStateA==HIGH)
{
mode =2;
}
}
if ((val > 204) && (val < 306))
{
lcd.print("Level 3 ");
if (buttonStateA==HIGH)
{
mode =3;
}
}
if ((val > 307) && (val < 408))
{
lcd.print("Level 4 ");
if (buttonStateA==HIGH)
{
mode =4;
}
}
if ((val > 409) && (val < 510))
{
lcd.print("Level 5 ");
if (buttonStateA==HIGH)
{
mode =5;
}
}
if ((val > 511) && (val < 612))
{
lcd.print("Level 6 ");
if (buttonStateA==HIGH)
{
mode =6;
}
}
if ((val > 613) && (val < 714))
{
lcd.print("Level 7 ");
if (buttonStateA==HIGH)
{
mode =7;
}
}
if ((val > 715) && (val < 816))
{
lcd.print("Level 8 ");
if (buttonStateA==HIGH)
{
mode =8;
}
}
if ((val > 817) && (val < 918))
{
lcd.print("Level 9 ");
if (buttonStateA==HIGH)
{
mode =9;
}
}
if ((val > 919) && (val < 1023))
{
lcd.print("Level 10 ");
if (buttonStateA==HIGH)
{
mode =10;
}
} //close brackets "if" for lvl 10
} //close brackets for "while"
// attempt to replace this with commands WHILE mode is selected, below
// buttonState();
// if (buttonState1 == HIGH) {
// mode = 1;
// } else if (buttonState2 == HIGH) {
// mode = 2;
// } else if (buttonState3 == HIGH) {
// mode = 3;
// } else if(buttonState4 == HIGH) {
// mode = 3;
// }
// end of section to be replaced
// trial experiment begin
buttonState();
if ((val < 102) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 1;
}
else if ((val < 203) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 2;
}
else if ((val < 306) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 3;
}
else if ((val < 408) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 4;
}
else if ((val < 510) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 5;
}
else if ((val < 612) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 6;
}
else if ((val < 714) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 7;
}
else if ((val < 816) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 8;
}
else if ((val < 918) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 9;
}
else if ((val < 1023) && (buttonState1==HIGH || buttonState2==HIGH || buttonState3==HIGH || buttonState4==HIGH || buttonState5==HIGH))
{
mode = 10;
}
// trial end of experiment code
}
waitForAllLow();
while (again == false)
{
digitalWrite(redLed,HIGH);
digitalWrite(yellowLed,HIGH);
digitalWrite(greenLed,HIGH);
digitalWrite(blueLed,HIGH);
digitalWrite(brownLed,HIGH);
digitalWrite(whiteLed,HIGH);
tone(buzzer,1000);
delay(200);
digitalWrite(redLed,LOW);
digitalWrite(yellowLed,LOW);
digitalWrite(greenLed,LOW);
digitalWrite(blueLed,LOW);
digitalWrite(brownLed, LOW);
digitalWrite(whiteLed, LOW);
delay(500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Choose speed");
delay(600);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("1.Slow, 2.Medium");
lcd.setCursor(0,1);
lcd.print("3.Fast 4.Inhuman");
/* ***NOT WORKING*** wont break loop when buttom pushed ***NOT WORKING****
while(buttonState1 ==LOW && buttonState2==LOW && buttonState3==LOW && buttonState3==LOW && buttonState4 == LOW)
{
digitalWrite(blueLed, HIGH);
delay(200);
digitalWrite(blueLed, LOW);
delay(300);
digitalWrite(blueLed, HIGH);
digitalWrite(greenLed, HIGH);
delay(200);
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, LOW);
delay(300);
digitalWrite(blueLed, HIGH);
digitalWrite(greenLed, HIGH);
digitalWrite(yellowLed, HIGH);
delay(200);
digitalWrite(blueLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, LOW);
delay(300);
digitalWrite(blueLed, HIGH);
digitalWrite(redLed, HIGH);
digitalWrite(yellowLed, HIGH);
digitalWrite(greenLed, HIGH);
delay(200);
digitalWrite(redLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, LOW);
delay(300);
}
*/
digitalWrite(redLed, HIGH); // Turning button LED options on
digitalWrite(yellowLed, HIGH);
digitalWrite(greenLed, HIGH);
digitalWrite(blueLed, HIGH);
waitForAnyHigh();
buttonState();
if (buttonState1 == HIGH)
{
lvl = 1;
minRndTime = 500;
maxRndTime = 2000;
maxPenalties = 7;
} else if (buttonState2 == HIGH) {
lvl = 2;
minRndTime = 500;
maxRndTime = 2000;
maxPenalties = 5;
} else if (buttonState3 == HIGH) {
lvl = 3;
minRndTime = 50;
maxRndTime = 250;
maxPenalties = 3;
} else {
lvl = 4;
minRndTime = 50;
maxRndTime = 250;
maxPenalties = 3;
}
waitForAllLowDelay();
again = true;
}
if (mode != 4)
{
digitalWrite(redLed, LOW); // Turning button options off
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(brownLed, LOW);
digitalWrite(whiteLed, LOW);
waitForAllLowDelay();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Press any button");
lcd.setCursor(0,1);
lcd.print("to start");
waitForAnyHigh();
}
fiveSecDelay = millis() + 5050;
while (true) {
if (mode == 2){
delay(50);
} else {
delay(random(minRndTime, maxRndTime));
}
actTime = millis();
buttonState();
if (buttonState1 == LOW && buttonState2 == LOW && buttonState3 == LOW && buttonState4 == LOW && buttonState5 ==LOW && buttonState6 ==LOW) {
lightLED();
waitForAnyHighInGame();
switch (number) {
buttonState();
case 1:
if (buttonState1 == HIGH) {
Result();
} else {
Penalty();
Serial.println("Wrong button pushed");
}
digitalWrite(redLed, LOW);
break;
case 2:
if (buttonState2 == HIGH) {
Result();
} else {
Penalty();
Serial.println("Wrong button pushed");
}
digitalWrite(yellowLed, LOW);
break;
case 3:
if (buttonState3 == HIGH) {
Result();
} else {
Penalty();
Serial.println("Wrong button pushed");
}
digitalWrite(greenLed, LOW);
break;
case 4:
if (buttonState4 == HIGH) {
Result();
} else {
Penalty();
Serial.println("Wrong button pushed");
}
digitalWrite(blueLed, LOW);
break;
case 5:
if (buttonState5 == HIGH) {
Result();
} else {
Penalty();
Serial.println("Wrong button pushed"); //
}
digitalWrite(brownLed, LOW);
break;
case 6:
if (buttonState6 == HIGH) {
Result ();
} else {
Penalty();
Serial.println("Wrong button pushed"); //
}
digitalWrite(whiteLed, LOW);
break;
}
waitForAllLow();
} else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pressed early");
Serial.print("Pressed button early"); //
btnPressedBefore = true;
Penalty();
Serial.print("early penalty clicks "); //
Serial.println(earlyPenaltyClicks); //
delay(1000);
waitForAllLow();
}
if ((mode == 1 && allClicksCounter == 20) || //defines what ends the game
(mode == 2 && millis() >= fiveSecDelay) ||
(mode == 3 && penalty == maxPenalties))
{
GameOver();
if (mode == 3){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Game Over");
Serial.print("Game Over mode3"); //
Serial.print("/n"); //
} else {
lcd.clear();
lcd.setCursor(0,0);
lcd.println("Game Over");
Serial.println("Game Over via 'else' command"); //
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("You did ");
lcd.setCursor(8,0);
lcd.print(clickCounter);
lcd.setCursor(10,0);
lcd.print("/");
lcd.setCursor(11,0);
lcd.print(allClicksCounter);
lcd.setCursor(0,1);
Serial.print("1. Click counter is: "); //
Serial.println(clickCounter); //
Serial.print("/n"); //
Serial.print("2. All clicks counted "); //
Serial.println(allClicksCounter); //
Serial.print("/n"); //
accClickCounter= clickCounter * 100; //
Serial.print("3. Click Counter x 100 = "); //
Serial.println(accClickCounter); //
Serial.print("/n");
accuracy=accClickCounter/allClicksCounter;
Serial.print("4. Click Counter / all clicks counted = "); //
Serial.println(accuracy); //
Serial.print("/n"); //
Serial.print("5. Accuracy is "); //
Serial.println(accuracy); //
Serial.println("%");
Serial.print("/n");
lcd.print("Accuracy=");
lcd.setCursor(10, 1);
lcd.print(accuracy);
lcd.setCursor(13,1);
lcd.print("%");
waitForAllLowDelay();
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
playerTimeSum = ((playerTimeSum)+(playerTime)); //
Serial.println("Player Time added together is: ");
Serial.print(playerTimeSum);
Serial.print("\n");
int averageTime=((playerTimeSum/clickCounter)); // SUCCESS
Serial.print("6. average time is ");
Serial.println(averageTime);
Serial.print("\n");
lcd.print("Average time ");
lcd.setCursor(0,1);
lcd.print(averageTime); //**** NEED TO ADD IN AVERAGE SPEED CALCULATIONS****
waitForAllLowDelay();
waitForAnyHigh(); //pause until button pressed
lcd.clear();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Press any button");
lcd.setCursor(0,1);
lcd.print("to play again");
while (true) {
waitForAnyHigh();
if (buttonState1 == HIGH){
again = true;
break;
} else if (buttonState2 == HIGH){
again = false;
break;
} else if (buttonState3 == HIGH){
again = false;
mode = 0;
break;
} else {
waitForAllLow();
}
}
waitForAllLowDelay();
penalty = 0;
clickCounter = 0;
allClicksCounter = 0;
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(brownLed, LOW);
digitalWrite(whiteLed, LOW);
break;
}
}
}
void Result() {
clickCounter += 1;
allClicksCounter += 1;
playerTime = Time(actTime);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Reaction time");
lcd.setCursor(0,1);
lcd.print(playerTime);
lcd.setCursor(5,1);
lcd.print("ms");
playerTimeSum= playerTime+playerTimeSum;
Serial.print("\n");
Serial.print("player Time Sum "); // correct display
Serial.println(playerTimeSum); // removed
Serial.print("\n");
}
void Penalty() {
penalty += 1;
allClicksCounter += 1;
penaltyCounter += 1;
Serial.print("\n");
Serial.print("Penalty counter: ");
Serial.println(penaltyCounter);
Serial.print("\n");
Serial.print("all clicks Counter");
Serial.println(allClicksCounter); //test for record review
Serial.print("\n");
Serial.print("Penalties: ");
Serial.println(penalty);
Serial.print("\n");
btnPressedBefore = false;
}
void lightLED() {
switch (number = random(1, 7)) {
case 1:
digitalWrite(redLed, HIGH);
Serial.println("red Led lit");// testing to serial print for record review
break;
case 2:
digitalWrite(yellowLed, HIGH);
Serial.println("yellow Led lit");
break;
case 3:
digitalWrite(greenLed, HIGH);
Serial.println("green Led lit");
break;
case 4:
digitalWrite(blueLed, HIGH);
Serial.println("blue Led lit");
break;
case 5:
digitalWrite(brownLed, HIGH);
Serial.println("brown Led lit");
break;
case 6:
digitalWrite(whiteLed, HIGH);
Serial.println("white Led lit");
break;
}
}
unsigned long Time(unsigned long startTime) {
endTime = millis();
reactionTime = endTime - startTime;
Serial.println(reactionTime); //serial track
return reactionTime;
}
void waitForAnyHigh() {
while (buttonState1 == LOW && buttonState2 == LOW && buttonState3 == LOW && buttonState4 == LOW && buttonState5 == LOW && buttonState6 == LOW) {
buttonState();
}
}
void waitForAnyHighInGame() {
while (buttonState1 == LOW && buttonState2 == LOW && buttonState3 == LOW && buttonState4 == LOW && buttonState5 == LOW && buttonState6 == LOW) {
buttonState();
if ((mode == 2 && millis() >= fiveSecDelay) || (millis() >= (actTime + 5000))) {
break;
}
}
}
void waitForAllLow() {
while (buttonState1 == HIGH || buttonState2 == HIGH || buttonState3 == HIGH || buttonState4 == HIGH || buttonState5 == HIGH || buttonState6 == HIGH) {
buttonState();
}
}
void waitForAllLowDelay() {
waitForAllLow();
delay(250);
waitForAllLow();
}
void buttonState() {
buttonState1 = digitalRead(redButton);
buttonState2 = digitalRead(yellowButton);
buttonState3 = digitalRead(greenButton);
buttonState4 = digitalRead(blueButton);
buttonState5 = digitalRead(brownButton);
buttonState6 = digitalRead(whiteButton);
}
void GameOver(){
for(i=0;i<5;i++){
digitalWrite(redLed,HIGH);
digitalWrite(yellowLed,HIGH);
digitalWrite(greenLed,HIGH);
digitalWrite(blueLed,HIGH);
digitalWrite(brownLed,HIGH);
digitalWrite(whiteLed,HIGH);
tone(buzzer,1000);
delay(200);
digitalWrite(redLed,LOW);
digitalWrite(yellowLed,LOW);
digitalWrite(greenLed,LOW);
digitalWrite(blueLed,LOW);
digitalWrite(brownLed, LOW);
digitalWrite(whiteLed, LOW);
noTone(buzzer);
delay(200);
}
}