/*
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// button set-ups
const int buttonAPin = 7;
const int buttonBPin = 8;
unsigned long debounceDelay = 100; // how long must there be between two different input
// mutable variables
unsigned long lastReadTimeA = 0; // record when does it reads a difference last time
unsigned long lastReadTimeB = 0; // record for button B
int buttonStateA, buttonStateB;
int lastButtonStateA = LOW, lastButtonStateB = LOW;
int gameStatus = 0; // if 0, game in menu, 1 starts the game
// When gameStatus = 0, 0 -> not ready, 1-> ready
// When gameStatus = 1, 0, 1, 2 -> finished laps
int playerAStatus = 0, playerBStatus = 0;
int win = 0; // check if game ends
int playerAPos = 0, playerBPos = 0; // player position
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
pinMode(buttonAPin, INPUT);
pinMode(buttonBPin, INPUT);
}
// Reads button and check debounce
void ButtonRead(int buttonStateA, int buttonStateB, int lastReadTimeA, int lastReadTimeB, int lastButtonStateA, int lastButtonStateB){
int readA = digitalRead(buttonAPin);
int readB = digitalRead(buttonBPin);
if(readA != lastButtonStateA)
lastReadTimeA = millis();
if(readB != lastButtonStateB)
lastReadTimeB = millis();
if((millis() - lastReadTimeA) > debounceDelay){
buttonStateA = readA;
}
if((millis() - lastReadTimeB) > debounceDelay){
buttonStateB = readB;
}
lastButtonStateA = readA;
lastButtonStateB = readB;
}
// Game menu part
void GameMenu(){
ButtonRead(buttonStateA, buttonStateB, lastReadTimeA, lastReadTimeB, lastButtonStateA, lastButtonStateB);
if(playerAStatus == 0 && buttonStateA == 1)
playerAStatus = 1;
if(playerBStatus == 0 && buttonStateB == 1)
playerBStatus = 1;
lcd.setCursor(0, 1);
if(playerAStatus == 0)
lcd.print("Player 1");
else lcd.print("1");
lcd.setCursor(0, 2);
if(playerBStatus == 0)
lcd.print("Player 2");
else lcd.print("2");
if(playerAStatus == 1 && playerBStatus == 1){
gameStatus = 1;
playerAStatus = 0;
playerBStatus = 0;
}
}
//Game start
void GameOn(){
ButtonRead(buttonStateA, buttonStateB, lastReadTimeA, lastReadTimeB, lastButtonStateA, lastButtonStateB);
//player moving
if(buttonStateA == 1){
lcd.setCursor(playerAPos,1);
lcd.scrollDisplayRight();
playerAPos ++;
if(playerAStatus = 1){
lcd.setCursor(15, 1);
lcd.print("#");
}
}
if(buttonStateB == 1){
lcd.setCursor(playerBPos,2);
lcd.scrollDisplayRight();
playerBPos ++;
if(playerBStatus = 1){
lcd.setCursor(15, 2);
lcd.print("#");
}
}
//if lap finished
if(playerAPos == 15){
playerAStatus ++;
if(playerAStatus == 2){
delay(500);
win = 1;
return;
}
else{
playerAPos = 0;
lcd.setCursor(0, 1);
lcd.print("1");
lcd.setCursor(15, 1);
lcd.print("#");
}
}
if(playerBPos == 15){
playerBStatus ++;
if(playerBStatus == 2){
delay(500);
win = 1;
return;
}
else{
playerBPos = 0;
lcd.setCursor(0, 2);
lcd.print("2");
lcd.setCursor(15, 2);
lcd.print("#");
}
}
}
//Player win case
void WinCase(){
delay(500);
lcd.clear();
if(playerAStatus == 2){
lcd.setCursor(0, 1);
lcd.print("Player 1 wins !!!");
}
if(playerBStatus == 2){
lcd.setCursor(0, 2);
lcd.print("Player 2 wins !!!");
}
delay(2000);
//reset
lastReadTimeA = 0;
lastReadTimeB = 0;
buttonStateA = 0;
buttonStateB = 0;
lastButtonStateA = LOW;
lastButtonStateB = LOW;
gameStatus = 0;
playerAStatus = 0;
playerBStatus = 0;
win = 0;
playerAPos = 0;
playerBPos = 0;
}
void loop() {
if (gameStatus == 0)
GameMenu();
else
GameOn();
if(win)
WinCase();
}