#define LED_RED 2
#define LED_YEL 3
#define LED_GRE 4
#define LED_BLU 5
#define LED_PUR 10
#define BUT_RED 6
#define BUT_YEL 7
#define BUT_GRE 8
#define BUT_BLU 9
#define BUT_PUR 13
#define GAMESTR 12
#define TIMEOUT 5000
#define LEVEL 20
#define GAMESPD 500
int statGame = 0;
int ledSeq [5] { LED_RED , LED_YEL , LED_GRE , LED_BLU , LED_PUR};
int butSeq [5] { BUT_RED , BUT_YEL , BUT_GRE , BUT_BLU , BUT_PUR};
int gamSeq[LEVEL];
int pointer = 0;
void light(int point) {
digitalWrite(ledSeq[point], HIGH);
delay(GAMESPD);
digitalWrite(ledSeq[point], LOW);
delay(GAMESPD/2);
}
void setup() {
randomSeed(analogRead(0));
pinMode( GAMESTR, INPUT);
for (int i=0; i<5;i++) {
pinMode( butSeq[i] ,INPUT);
pinMode( ledSeq[i] ,OUTPUT);
}
}
void loop() {
statGame = 0;
pointer = 0;
while (statGame == 0){
digitalWrite(ledSeq[pointer], HIGH);
delay(200);
digitalWrite(ledSeq[pointer], LOW);
pointer++;
if (pointer > 3) pointer = 0;
if (digitalRead(GAMESTR) == HIGH) statGame = 1;
}
unsigned long timeout = millis();
int playGame = 0;
bool gameOver = false;
pointer = 0;
while (statGame == 1){
while (pointer < !gameOver) {
if (playGame == 0) {
delay(1000);
int rndValue = -1;
while ( rndValue < 0 || rndValue > 4) {
rndValue = random(5);
if (pointer >0 && rndValue == gamSeq[pointer-1] && pointer % 4 != 0) rndValue = -1;
}
gamSeq[pointer] = rndValue;
for (int i=0; i <= pointer; i++) light(gamSeq[i]);
playGame = 1;
if (playGame == 1) {
int j=0;
while (j <= pointer && !gameOver) {
if (timeout + TIMEOUT < millis()) {gameOver = true; j = pointer+1;}
for (int i=0;i<5;i++) {
if (digitalRead(butSeq[i]) == HIGH) {
timeout = millis();
light(i);
if (i == gamSeq[j]) j++;
else { i=5; gameOver = true;}
}
}
}
playGame = 0;
pointer++;
}
}
statGame = 0;
delay(1000);
if (!gameOver) {
for (int j=0;j<20;j++) {
for (int i=0;i<5;i++) {
digitalWrite(ledSeq[i], HIGH);
delay(40);
digitalWrite(ledSeq[i], LOW);
}
}
}
else { //boooh!!! Loser!!!
for (int i=0;i<5;i++) digitalWrite(ledSeq[i], HIGH);
delay(2000);
for (int i=0;i<5;i++) digitalWrite(ledSeq[i], LOW);
delay(1000);
}
}
}
}