#define MAX_LEVEL 100
int8_t buttons_pin[4] = { 0, 1, 2, 3 };
int8_t leds_pin[4] = { 4, 5, 6, 7 };
int8_t task[MAX_LEVEL];
int8_t level = 0;
int8_t input_id = 0;
int8_t life = 4;
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Game start!");
for (int8_t i = 0; i < 4; i++)
{
pinMode(buttons_pin[i], INPUT_PULLUP);
pinMode(leds_pin[i], OUTPUT);
}
LedsPlayStart();
delay(1000);
}
void LedOn(int8_t pin_id, uint16_t time_on, uint16_t time_off_delay)
{
digitalWrite(leds_pin[pin_id], HIGH);
delay(time_on);
digitalWrite(leds_pin[pin_id], LOW);
delay(time_off_delay);
}
void LedsPlayStart()
{
for (int8_t i = 0; i < 3; i++)
{
for (int8_t ii = 0; ii < 4; ii++)
{
LedOn(ii, 100, 0);
}
}
}
bool WaitButton()
{
for(;;)
{
for (int8_t i = 0; i < 4; i++)
{
if (digitalRead(buttons_pin[i]) == LOW)
{
if (task[input_id] == i)
{
Serial.println("Valid button!");
LedOn(i, 500, 500);
input_id += 1;
return true;
}
else
{
LedOn(i, 200, 200);
return false;
}
}
}
}
return false;
}
void LedsPlayTask()
{
for (int8_t i = 0; i <= level; i++)
{
LedOn(leds_pin[task[i]], 500, 500);
}
}
void InitNewGame()
{
input_id = 0;
level = 0;
life = 4;
}
void LedsPlayLife()
{
for (int8_t i = 0; i < 3; i++)
{
for (int8_t ii = 0; ii < life; ii++)
{
digitalWrite(leds_pin[ii], HIGH);
}
delay(200);
for (int8_t ii = 0; ii < 4; ii++)
{
digitalWrite(leds_pin[ii], LOW);
}
delay(200);
}
}
void loop()
{
if (input_id >= level)
{
delay(1000);
task[level] = random(0, 4);
LedsPlayTask();
input_id = 0;
level += 1;
delay(100);
}
if (WaitButton())
{
delay(100);
}
else
{
if (life > 0)
{
life -= 1;
input_id = 0;
delay(1000);
LedsPlayLife();
delay(1000);
LedsPlayTask();
delay(100);
}
else
{
Serial.println("Game over!!!");
InitNewGame();
LedsPlayStart();
delay(1000);
}
}
}