// Input / output declaration
int light[4] = {4, 5, 6, 7}; //7 = green, 6 = blue, 5 = yellow, 4 = red
int button[4] = {8, 9, 10, 11}; //11 = green, 10 = blue, 9 = yellow, 8 = red
// States
int state = 0;
int maxLevels = 10;
int level = 1;
int counter = 0;
const int difficultySelect = 0;
const int difficultySelectRelease = 1;
const int demonstrateState = 2;
const int playWaitingForPress = 3;
const int playWaitingForRelease = 4;
const int failState = 5;
const int winState = 6;
bool holding = false;
int pressedKey;
int difficulty;
// Randomly generate sequence
int sequence[10];
// Timing parameters
int demonstrateTime[4] = {200, 300, 400, 500};
int demonstrateWaitTime[4] = {200, 300, 400, 500};
int correctSequenceTime = 500;
int winTime = 100;
int startWaitTime = 1000;
void setup() {
Serial.begin(9600);
// Set pin modes
for (int i = 0; i < 4; i++)
{
pinMode(light[i], OUTPUT);
pinMode(button[i], INPUT);
}
}
void loop() {
//WHY DO I NEED THIS?!
delay(10);
switch (state)
{
case difficultySelect:
{
PlayLights();
for (int i = 0; i < 4; i++)
{
if (digitalRead(button[i]) == HIGH)
{
state = difficultySelectRelease;
pressedKey = i;
}
}
break;
}
case difficultySelectRelease:
{
PlayLights();
if (digitalRead(button[pressedKey] == LOW))
{
StopLights();
long int elapsedTime = millis();
randomSeed(elapsedTime);
for (int i = 0; i < maxLevels; i++)
{
sequence[i] = random(0, 4);
}
state = demonstrateState;
difficulty = pressedKey;
delay(startWaitTime);
}
break;
}
case demonstrateState:
{
if (counter < level)
{
DemonstrateAStep();
counter++;
} else
{
state = playWaitingForPress;
counter = 0;
}
break;
}
case playWaitingForPress:
{
PlayLights();
for (int i = 0; i < 4; i++)
{
if (digitalRead(button[i]) == HIGH)
{
state = playWaitingForRelease;
pressedKey = i;
}
}
break;
}
case playWaitingForRelease:
{
PlayLights();
if (digitalRead(button[pressedKey]) == LOW)
{
if (pressedKey == sequence[counter])
{
counter++;
if (counter < level)
{
state = playWaitingForPress;
} else
{
StopLights();
delay(correctSequenceTime);
level++;
counter = 0;
if (level > maxLevels)
{
state = winState;
} else
{
state = demonstrateState;
}
}
} else
{
StopLights();
state = failState;
for (int i = 0; i < 4; i++)
{
digitalWrite(light[i], HIGH);
}
}
}
break;
}
case failState:
{
break;
}
case winState:
{
digitalWrite(light[counter], LOW);
counter--;
if (counter < 0)
{
counter = 3;
}
digitalWrite(light[counter], HIGH);
delay(winTime);
}
}
}
void DemonstrateAStep()
{
digitalWrite(light[sequence[counter]], HIGH);
delay(demonstrateTime[difficulty]);
digitalWrite(light[sequence[counter]], LOW);
delay(demonstrateWaitTime[difficulty]);
}
void PlayLights()
{
for (int i = 0; i < 4; i++)
{
if (digitalRead(button[i]) == HIGH)
{
digitalWrite(light[i], HIGH);
} else
{
digitalWrite(light[i], LOW);
}
}
}
void StopLights()
{
for (int i = 0; i < 4; i++)
{
digitalWrite(light[i], LOW);
}
}