#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int horzPin = A1;
const int vertPin = A0;
const int selPin = 2;
int credits = 10;
int bet = 1;
int cursorPosition = 0;
const char heroes[] = "WATPHK";
const int multipliers[] = {2, 3, 5, 7, 11, 12};
unsigned long lastMoveTime = 0;
int debounceDelay = 200;
bool bettingPhase = true;
int lastCursor = -1, lastBet = -1, lastCredits = -1;
char winnerHero = ' ';
void setup() {
lcd.init();
lcd.backlight();
pinMode(selPin, INPUT_PULLUP);
displayGame(true);
}
void loop() {
int horzValue = analogRead(horzPin);
int vertValue = analogRead(vertPin);
int selPressed = digitalRead(selPin);
if (bettingPhase && millis() - lastMoveTime > debounceDelay) {
if (horzValue > 700 && cursorPosition < 5) {
cursorPosition++;
lastMoveTime = millis();
} else if (horzValue < 300 && cursorPosition > 0) {
cursorPosition--;
lastMoveTime = millis();
}
}
if (bettingPhase && millis() - lastMoveTime > debounceDelay) {
if (vertValue > 700 && bet < credits) {
bet++;
lastMoveTime = millis();
} else if (vertValue < 300 && bet > 1) {
bet--;
lastMoveTime = millis();
}
}
if (bettingPhase && selPressed == LOW) {
bettingPhase = false;
lcd.clear();
lcd.print("Bet placed!");
delay(1000);
playGame();
return;
}
if (bettingPhase) {
displayGame(false);
}
}
void displayGame(bool forceUpdate) {
if (forceUpdate || cursorPosition != lastCursor || credits != lastCredits || bet != lastBet) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WATPHK");
lcd.setCursor(7, 0);
lcd.print("C:");
lcd.print(credits);
lcd.setCursor(12, 0);
lcd.print("B:");
lcd.print(bet);
lcd.setCursor(11, 1);
lcd.print("WIN: ");
lcd.setCursor(cursorPosition, 1);
lcd.print("-");
if (!bettingPhase){
lcd.setCursor(5,1);
lcd.print(winnerHero);
}
lastCursor = cursorPosition;
lastCredits = credits;
lastBet = bet;
}
}
void playGame() {
int randomHeroIndex = random(0, 6);
winnerHero = heroes[randomHeroIndex];
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Result: ");
lcd.print(winnerHero);
if (heroes[cursorPosition] == winnerHero) {
int winnings = bet * multipliers[randomHeroIndex];
credits += winnings;
lcd.setCursor(0, 1);
lcd.print("Win! +");
lcd.print(winnings);
} else {
credits -= bet;
lcd.setCursor(0, 1);
lcd.print("Lose! -");
lcd.print(bet);
}
delay(2000);
if (credits > 0) {
bettingPhase = true;
bet = 1;
cursorPosition = 0;
displayGame(true);
} else {
lcd.clear();
lcd.print("Game Over!");
while (true);
}
}