#define GreenLed 4
#define GreenButton 2
#define GreenLedST 10
#define RedLedST 9
#define ButtonST 7
#define RedLed 13
#define RedButton 8
int ScoreRed;
int ScoreGreen;
bool RedisClick = false;
bool GreenisClick = false;
long long myTimer;
long GameTime = 10000;
int timeDis = GameTime/1000;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD(0x27, 16, 2);
byte LUP[] = {
B00000,
B00011,
B00100,
B01010,
B01000,
B01011,
B00100,
B00011
};
byte RUP[] = {
B00000,
B11000,
B00100,
B01010,
B00010,
B11010,
B00100,
B11000
};
byte LD[] = {
B00001,
B00110,
B01100,
B01000,
B01001,
B01001,
B01001,
B01111
};
byte RD[] = {
B10000,
B01100,
B00110,
B00010,
B10010,
B10010,
B10010,
B11110
};
void setup()
{
LCD.init();
LCD.backlight();
LCD.createChar(0, LUP);
LCD.createChar(1, RUP);
LCD.createChar(2, LD);
LCD.createChar(3, RD);
LCD.home();
LCD.write(0); LCD.write(1);
LCD.setCursor(0,1);
LCD.write(2); LCD.write(3);
LCD.setCursor(14,0);
LCD.write(0); LCD.write(1);
LCD.setCursor(14,1);
LCD.write(2); LCD.write(3);
LCD.setCursor(3,0);
LCD.print("Start");
LCD.setCursor(8,1);
LCD.print("Game!");
Serial.begin(9600);
pinMode(RedLed,OUTPUT);
pinMode(GreenLed,OUTPUT);
pinMode(RedLedST,OUTPUT);
pinMode(GreenLedST,OUTPUT);
pinMode(RedButton,INPUT_PULLUP);
pinMode(GreenButton,INPUT_PULLUP);
pinMode(ButtonST,INPUT_PULLUP);
digitalWrite(RedLed,HIGH);
digitalWrite(GreenLed,HIGH);
delay(300);
digitalWrite(RedLedST,HIGH);
digitalWrite(GreenLedST,HIGH);
for (byte i=0; i<3; i++) {
digitalWrite(RedLed,HIGH);
digitalWrite(GreenLed,HIGH);
digitalWrite(RedLedST,HIGH);
digitalWrite(GreenLedST,HIGH);
delay(200);
digitalWrite(RedLed,LOW);
digitalWrite(GreenLed,LOW);
digitalWrite(RedLedST,LOW);
digitalWrite(GreenLedST,LOW);
delay(200);
}
digitalWrite(RedLedST, HIGH);
LCD.setCursor(3,0);
LCD.print("Press START");
LCD.setCursor(5,1);
LCD.print("Button! ");
}
void loop()
{
if (digitalRead(GreenLedST) and (myTimer+millis())/1000){
LCD.setCursor(10,0);
if (timeDis>9){
LCD.print(timeDis);
} else {
LCD.print(timeDis);
LCD.print(" ");
}
timeDis += -1;
}
while(millis()-myTimer >= GameTime and digitalRead(GreenLedST)) {
digitalWrite(GreenLedST,LOW);
delay(100);
digitalWrite(RedLedST,HIGH);
Serial.println("Game End!");
if (ScoreRed == ScoreGreen) {
digitalWrite(GreenLed, HIGH);
digitalWrite(RedLed, HIGH);
Serial.println("Draw Draw");
LCD.setCursor(6,0);
LCD.print("Draw ");
LCD.setCursor(6,1);
LCD.print("Draw ");
}
if (ScoreRed > ScoreGreen) {
digitalWrite(GreenLed, LOW);
digitalWrite(RedLed, HIGH);
Serial.println("Red wins!");
LCD.setCursor(6,0);
LCD.print("Red ");
LCD.setCursor(6,1);
LCD.print("wins ");
}
if (ScoreRed < ScoreGreen) {
digitalWrite(GreenLed, HIGH);
digitalWrite(RedLed, LOW);
Serial.println("Green wins!");
LCD.setCursor(6,0);
LCD.print("Green ");
LCD.setCursor(6,1);
LCD.print("wins ");
}
}
if (!digitalRead(ButtonST)== 1){
digitalWrite(RedLedST, LOW);
delay(300);
digitalWrite(GreenLedST, HIGH);
myTimer = millis();
ScoreRed = 0;
ScoreGreen = 0;
digitalWrite(RedLed, LOW);
digitalWrite(GreenLed, LOW);
Serial.println("Game Start!");
timeDis = GameTime/1000;
LCD.setCursor(3,0);
LCD.print(" TIME: 60 ");
LCD.setCursor(4,1);
LCD.print("0 -- 0");
}
if (ButtonClick(RedButton, RedisClick)== 1 and digitalRead(GreenLedST)){
ScoreRed++;
Serial.println(String("Red Score = ")+ScoreRed);
if(ScoreRed < 10) {
LCD.setCursor(4,1);
LCD.print(ScoreRed);
} else if (ScoreRed > 9 and ScoreRed < 100) {
LCD.setCursor(3,1);
LCD.print(ScoreRed);
} else if (ScoreRed > 99 and ScoreRed < 1000) {
LCD.setCursor(3,1);
LCD.print(ScoreRed);
}
}
if (ButtonClick(GreenButton, GreenisClick)== 1 and digitalRead(GreenLedST)){
ScoreGreen++;
Serial.println(String("Green Score = ")+ScoreGreen);
if(ScoreGreen < 10) {
LCD.setCursor(11,1);
LCD.print(ScoreGreen);
} else if (ScoreGreen > 9 and ScoreGreen < 100) {
LCD.setCursor(10,1);
LCD.print(ScoreGreen);
} else if (ScoreGreen > 99 and ScoreGreen < 1000) {
LCD.setCursor(10,1);
LCD.print(ScoreGreen);
}
}
}
bool ButtonClick(byte pin, bool& isClick) {
if (digitalRead(pin)) {
if (isClick == false) {
isClick = true;
return true;
}
} else{
if (isClick == true) {
isClick = false;
}
}
return false;
}