
int buttons[] = {3, 5, 7}; //The three button input pins
int leds[] = {2, 4, 6};  // LED pins
int display[]={1, 0, 12, 11, 10, 9, 8}; //Buttons from from a-g 
int flash;
int gameState = 0;
int score = 0;

void setup()
{
  //setting pin types
  for(int pin=0; pin<4; pin++)
  {
  	pinMode(leds[pin], OUTPUT);
  }
  
  for(int pin=0; pin<4; pin++)
  {
  	pinMode(buttons[pin], INPUT);
  }
  
  for(int pin=0; pin<7; pin++)
  {
  	pinMode(display[pin], OUTPUT);
  }
  randomSeed(analogRead(40)); // initializes the pseudo-random number generator,

}

//functions for each number
void nine()
{
  digitalWrite(display[0], LOW);
  digitalWrite(display[1], LOW);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], HIGH);
  digitalWrite(display[4], HIGH);
  digitalWrite(display[5], LOW);
  digitalWrite(display[6], LOW);
  
}

void eight()
  {
  digitalWrite(display[0], LOW);
  digitalWrite(display[1], LOW);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], LOW);
  digitalWrite(display[4], LOW);
  digitalWrite(display[5], LOW);
  digitalWrite(display[6], LOW);

}

void seven()
  {
  digitalWrite(display[0], LOW);
  digitalWrite(display[1], LOW);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], HIGH);
  digitalWrite(display[4], HIGH);
  digitalWrite(display[5], HIGH);
  digitalWrite(display[6], HIGH);

}
void six()
  {
  digitalWrite(display[0], LOW);
  digitalWrite(display[1], HIGH);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], LOW);
  digitalWrite(display[4], LOW);
  digitalWrite(display[5], LOW);
  digitalWrite(display[6], LOW);

}

void five()
  {
  digitalWrite(display[0], LOW);
  digitalWrite(display[1], HIGH);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], LOW);
  digitalWrite(display[4], HIGH);
  digitalWrite(display[5], LOW);
  digitalWrite(display[6], LOW);

}

void four()
  {
  digitalWrite(display[0], HIGH);
  digitalWrite(display[1], LOW);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], HIGH);
  digitalWrite(display[4], HIGH);
  digitalWrite(display[5], LOW);
  digitalWrite(display[6], LOW);

}

void three()
  {
  digitalWrite(display[0], LOW);
  digitalWrite(display[1], LOW);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], LOW);
  digitalWrite(display[4], HIGH);
  digitalWrite(display[5], HIGH);
  digitalWrite(display[6], LOW);

}

void two()
  {
  digitalWrite(display[0], LOW);
  digitalWrite(display[1], LOW);
  digitalWrite(display[2], HIGH);
  digitalWrite(display[3], LOW);
  digitalWrite(display[4], LOW);
  digitalWrite(display[5], HIGH);
  digitalWrite(display[6], LOW);

}

void one()
  {
  digitalWrite(display[0], HIGH);
  digitalWrite(display[1], LOW);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], HIGH);
  digitalWrite(display[4], HIGH);
  digitalWrite(display[5], HIGH);
  digitalWrite(display[6], HIGH);

}

void zero()
  {
  digitalWrite(display[0], LOW);
  digitalWrite(display[1], LOW);
  digitalWrite(display[2], LOW);
  digitalWrite(display[3], LOW);
  digitalWrite(display[4], LOW);
  digitalWrite(display[5], LOW);
  digitalWrite(display[6], HIGH);
}

void off()
{
  digitalWrite(display[0], HIGH);
  digitalWrite(display[1], HIGH);
  digitalWrite(display[2], HIGH);
  digitalWrite(display[3], HIGH);
  digitalWrite(display[4], HIGH);
  digitalWrite(display[5], HIGH);
  digitalWrite(display[6], HIGH);
}

//displays the score
void keepScore()
{
  if (score == 0)
    zero();
  else if (score == 1)
    one();
  else if (score == 2)
    two();
  else if (score == 3)
    three();
  else if (score == 4)
    four();
  else 
    five();
}

//flashs random led for .5 seconds
void ledFlash()
{
  delay(1000);
  flash = random(0,3); //includes 0 but not 3
  
  digitalWrite(leds[flash], HIGH);
  delay(500);
  digitalWrite(leds[flash], LOW);
  delay(500);
}

//counts down from 3 to 0
void countdown()
{
  three();
  delay(1000);
  two();
  delay(1000);
  one();
  delay(1000);
  zero();
  delay(1000);
}

//reads user answer
void readAnswer()
{
  long currentMillis = 0; 
  long previousMillis = 0;
  
  bool guessing = true;
  int buttonState = 0;
  
  currentMillis = millis(); 
  previousMillis = currentMillis;

  while (guessing == true )
  {
    //if user takes over one second to guess
    if (currentMillis - previousMillis > 900)
    {
      guessing = false;
      gameState = 0;
    }
    
    //checks status of buttons
    for (int i = 0; i <=2; i ++)
    {
      buttonState = digitalRead(buttons[i]);
      //checks if the button pressed is right
      if (buttonState == 1)
      {
       
        if (i == flash)
        {
          score += 1;
          delay(500);
          if (score == 5)
          {
            gameState = 0;
          }
        }
        else
        {
          gameState = 0; 
          delay(1000);
        }
        guessing = false;
      }
    }
    delay(10);
    currentMillis = millis();
  }
}

void loop()
{ 
  int buttonState = 0;
  score = 0; 
  off();
  
  while (gameState == 0) //if any of the buttons is pressed game starts from countdown
  {
    for (int i = 0; i <=2; i ++)
    {
      buttonState = digitalRead(buttons[i]);

      if (buttonState == 1)
      {
        gameState = 1;
        countdown();
      }
    } 
    delay(10);
  } 
  while (gameState == 1)
  {
    ledFlash();
    readAnswer();
    keepScore();
    delay(500);
  }
}