#include "WProgram.h"
void playSequence(int count);
int readButtons();
void flashSuccess();
void flashFailure();
int ledPin1 = 12;
int ledPin2 = 13;
int ledPin3 = 10;
int inPin1 = 7;
int inPin2 = 6;
int inPin3 = 5;
int val1 = 0; 
int val2 = 0; 
int val3 = 0; 
long val_rand = 0;
int rand_array[20];
int score = 1;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(inPin1, INPUT);
  pinMode(inPin2, INPUT);  
  pinMode(inPin3, INPUT);
  
  for (int i=0; i<=20; i++){
    rand_array[i] = random (3);
  }
  
}

void playSequence(int count)
{
  
  for (int i=0; i<=count; i++){

    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    
    delay (200); 
    
    switch (rand_array[i]) {
      case 0:
        digitalWrite(ledPin1, HIGH);
        break;
      case 1:
        digitalWrite(ledPin2, HIGH);
        break;  
      case 2:
        digitalWrite(ledPin3, HIGH);
        break;         
     }
            
     delay (200);
  
  }  
  
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);

  
}

int readButtons()
{   
    do {
     val1 = digitalRead(inPin1);
     val2 = digitalRead(inPin2);
     val3 = digitalRead(inPin3);  
     
    } while (val1 == HIGH && val2 == HIGH && val3 == HIGH);
    
    if (val1==LOW){
      return 0;
    } else if (val2==LOW) {
      return 1;
    } else if (val3==LOW) {
      return 2;
    }

}


void flashSuccess()
{
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);

  delay (100);  

  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);

  delay (100);  
  
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);

  delay (100);  
  
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);
  
  delay (100);
  
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);

  delay (100);  


}

void flashFailure()
{
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);

  delay (100);  

  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);

  delay (500);  
  
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);

  delay (100); 
  
}


void loop(){
  int input_key;
  int winning = true;
  int i=0;
  
  playSequence(score-1);
  
   
  while (winning && i<score){  
    
   input_key = readButtons();  

   if (input_key == rand_array[i]){
     i++;
     flashSuccess();
    } else {
     winning = false;
     flashFailure();
    }
     
  }
  
  if (winning) {
  score++;
  }
 
}
  
  

int main(void)
{
	init();

	setup();
    
	for (;;)
		loop();
        
	return 0;
}

