/*
Arduino | coding-help
Help with quiz-like game
Asianviking8 - Sunday, February 8, 2026 3:28 PM
When i run my code(file attached) and play the math quiz,
it instantly game overs, I've tried troubleshooting for about
an hour and asking AI but i can't seem to find the problem.
what is causing this bug?(look to void Gam5 for the problem area)
*/
// C++ code
//TXT boy game console
#include <LiquidCrystal.h>
const int NUM_BTNS = 4;
const int BTN_PINS[] = {6, 5, 4, 3};
const int BUZZ_PIN = 2;
const int SEED_PIN = A0;
const char* Msg[] = {
"Yes",
"No",
"Try again",
"Maybe",
"Definitely",
"Most likely",
"Probably not"
};
const char* GAME_NAMES[] = {
"Menu", "Blackjack", "Guess", "R / P / S",
"Reaction Timer", "Math Quiz", "Magic 8 Ball"
};
enum game_state {
MENU_STATE,
BLJ_STATE,
GUESS_STATE,
RPS_STATE,
REACT_STATE,
QUIZ_STATE,
BALL_STATE
};
game_state currGame;
int btnState[NUM_BTNS];
int oldBtnState[NUM_BTNS];
int stateNum = 1;
int oldStateNum = -1;
int Dturn = 0;
int player = 0;
int playerNum = 0;
int dealer = 0;
int menupress = 0;
int bState1 = 0;
int bState2 = 0;
int bState3 = 0;
int Dchance = 0;
int gameFinnish = 0;
int randNum = 0;
int CPUchoice = 0;
int mathA = 0;
int mathB = 0;
int mathC = 0;
int answerRNG = 0;
int fail = 0;
int num1 = 0;
int num2 = 0;
unsigned long startTime = 0;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int checkButtons() {
int btnNumber = 0;
for (int i = 0; i < NUM_BTNS; i++) {
// check each button
btnState[i] = digitalRead(BTN_PINS[i]);
if (btnState[i] != oldBtnState[i]) { // if it changed
oldBtnState[i] = btnState[i]; // remember state for next time
btnNumber = i + 1;
//Serial.print("Button ");
//Serial.print(btnNumber);
if (btnState[i] == LOW) { // was just pressed
//Serial.println(" pressed.");
} else {
btnNumber = -1; // was just released
//Serial.println(" released.");
}
delay(20); // debounce
}
}
return btnNumber;
}
void selectGame(int selectedGame) {
currGame = selectedGame;
Serial.println(GAME_NAMES[stateNum]);
switch (currGame) {
case MENU_STATE:
//Serial.println("Menu");
break;
case BLJ_STATE:
Serial.println("Black Jack");
//Gam1(); //start blackjack
break;
case GUESS_STATE:
Serial.println("Guess");
//Gam2(); //start number guess game NOT FINISHED
break;
case RPS_STATE:
Serial.println("R / P / S");
//Gam3();
break;
case REACT_STATE:
Serial.println("Reaction");
//Gam4();
break;
case QUIZ_STATE:
Serial.println("Math quiz");
//Gam5();
break;
case BALL_STATE:
Serial.println("8 Ball");
//Gam6();
break;
default:
Serial.println("WTF");
}
}
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
for (int i = 0; i < NUM_BTNS; i++) {
pinMode(BTN_PINS[i], INPUT_PULLUP);
}
randomSeed(analogRead(SEED_PIN));
// initialize
currGame = MENU_STATE;
lcd.setCursor(0, 0);
lcd.print("Multi-Game Demo");
lcd.setCursor(6, 1);
lcd.print("V1.0");
tone(BUZZ_PIN, 440, 2500);
delay(400);
tone(BUZZ_PIN, 220, 250);
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Select game:");
}
void loop() {
int btnNumber = checkButtons();
if (btnNumber) {
if (btnNumber == 1) {
//Serial.println("Up button pressed");
stateNum++;
if (stateNum > 6 ) stateNum = 1;
} else if (btnNumber == 2) {
//Serial.println("Down button pressed");
stateNum--;
if (stateNum < 1 ) stateNum = 6;
} else if (btnNumber == 3) {
//Serial.println("Select button pressed");
selectGame(stateNum);
} else if (btnNumber == 4) {
Serial.println("Back button pressed");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Select game:");
stateNum = 1;
}
}
if (stateNum != oldStateNum) {
oldStateNum = stateNum;
//lcd.clear();
lcd.setCursor(0, 1);
lcd.print(" ");
//Serial.println(GAME_NAMES[stateNum]);
lcd.setCursor(0, 1);
lcd.print(GAME_NAMES[stateNum]);
}
}
/*
void setup()
{
pinMode(RNG, INPUT);
randomSeed(analogRead(RNG)); // sets number generation seed
lcd.begin(16, 2); // Set up the number of columns and rows on the LCD.
pinMode( IN1, INPUT);// all IN are buttons
pinMode( IN2, INPUT);
pinMode( IN3, INPUT);
pinMode(SPKR, OUTPUT);
tone(SPKR, 200, 600);
delay(100);
tone(SPKR, 600, 500);
lcd.setCursor(0, 0);
lcd.print(" SELECT GAME");
lcd.setCursor(0, 2);
lcd.print(" PRESS BUTTON 1");//sets up start menu
Serial.begin(9600);
}
void loop()
{
if (pgm_state == MENU_STATE) {
bState1 = digitalRead(IN1);
bState2 = digitalRead(IN2);
bState3 = digitalRead(IN3); // Read inputs
Serial.println(bState3);
if (bState1 == HIGH) {
menupress += 1; //position on menu
tone(SPKR, 600, 20);
delay(200);// delay for accuracy
}
if (menupress == 1) {
BLJ(); //start blackjack start menu
}
if (menupress == 2) {
numGuess(); //start number guess game NOT FINISHED
}
if (menupress == 3) {
RPS();
}
if (menupress == 4) {
react();
}
if (menupress == 5) {
quiz();
}
if (menupress == 6) {
RNGball();
}
if (menupress > 6) {
menupress = 1; // if greater than planned selection, go back to start of list
}
}
if (pgm_state == BLJ_STATE) {
Gam1();
}
if (pgm_state == GUESS_STATE) {
Gam2();
}
if (pgm_state == RPS_STATE) {
Gam3();
}
if (pgm_state == REACT_STATE) {
Gam4();
}
if (pgm_state == QUIZ_STATE) {
Gam5();
}
if (pgm_state == BALL_STATE) {
Gam6();
}
}
*/
/*
void BLJ()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PLAY BLACKJACK?");
lcd.setCursor(0, 2);
lcd.print("3 = yes 1=next");
delay(100);
bState3 = digitalRead(IN3);// read 3rd button
if (bState3 == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Press 1 to start.");
pgm_state = BLJ_STATE;
}
}
void numGuess()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PLAY NUMGUESS?");
lcd.setCursor(0, 2);
lcd.print("3 = yes 1=next");
delay(100);
bState3 = digitalRead(IN3);// read 3rd button
if (bState3 == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Guess 1-100");
randNum = random(1, 100);
Serial.println(randNum); //numGuess game debugging
pgm_state = GUESS_STATE;
}
}
void RPS()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PLAY RPS?");
lcd.setCursor(0, 2);
lcd.print("3 = yes 1=next");
delay(100);
bState3 = digitalRead(IN3);// read 3rd button
if (bState3 == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("1=rock 2=paper");
lcd.setCursor(0, 2);
lcd.print(" 3=scicors");
randNum = random(1, 3);
Serial.println(randNum); //numGuess game debugging
delay(1000);
pgm_state = RPS_STATE;
}
}
void react()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PLAY Reaction?");
lcd.setCursor(0, 2);
lcd.print("3 = yes 1=next");
delay(100);
bState3 = digitalRead(IN3);// read 3rd button
if (bState3 == 1) {
lcd.clear();
lcd.setCursor(0, 2);
lcd.print("Press 3 to start.");;
CPUchoice = random(1000, 1600);
Serial.println(CPUchoice); //numGuess game debugging
delay(1000);
pgm_state = REACT_STATE;
}
}
void quiz() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PLAY MATH QUIZ?");
lcd.setCursor(0, 2);
lcd.print("3 = yes 1=next");
delay(100);
bState3 = digitalRead(IN3);// read 3rd button
if (bState3 == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Keep going");
lcd.setCursor(0, 2);
lcd.print("until incorect");
randNum = random(1, 3);
delay(1000);
pgm_state = QUIZ_STATE;
}
}
void RNGball() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PLAY 8 BALL?");
lcd.setCursor(0, 2);
lcd.print("3 = yes 1=next");
delay(100);
bState3 = digitalRead(IN3);// read 3rd button
if (bState3 == 1) {
lcd.clear();
lcd.setCursor(0, 2);
lcd.print("Press 3 to shake.");;
String randomMessage = Msg[random (0, 6)];
pgm_state = BALL_STATE;
}
}
*/
/*
void Gam1() {
Dchance = random(0, 20);
//bState1 = digitalRead(IN1);
//bState2 = digitalRead(IN2);
//bState3 = digitalRead(IN3); // Read inputs
// 1. DEALING
if ((bState1 == 1) && (player + dealer == 0)) {
player = random(2, 21);
dealer = random(2, 21);
refreshBLJ();
delay(200);
}
// 2. PLAYER HITS (Button 3)
else if (player > 0 && bState3 == 1) {
tone(BUZZ_PIN, 600, 20);
player += random(1, 10);
if (player > 21) {
lcd.clear();
lcd.print(" DEALER WINS!");
lcd.setCursor(0, 2);
lcd.print("YOU WENT OVER 21");
delay(2000);
endGame();
} else {
refreshBLJ();
delay(300);
}
}
else if (player > 0 && bState2 == 1) {
dealerAI();
}
}
void dealerAI() {
// Use a while loop so the dealer keeps taking cards until 17
while (dealer < 17) {
dealer += random(1, 10);
tone(BUZZ_PIN, 600, 20);
refreshBLJ();
delay(800); // Wait so player can see the dealer's progress
}
// Final Scoring Logic
lcd.clear();
if (dealer > 21 || player > dealer) {
lcd.print(" YOU WIN!");
tone(BUZZ_PIN, 1000, 800);
} else if (dealer > player) {
lcd.print(" DEALER WINS!");
tone(BUZZ_PIN, 200, 800);
} else {
lcd.print(" PUSH! (TIE)");
tone(BUZZ_PIN, 600, 800);
}
delay(3000);
endGame();
}
// Helper function to save space and keep LCD updated
void refreshBLJ() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player");
lcd.setCursor(0, 2);
lcd.print(player);
lcd.setCursor(8, 0);
lcd.print("Dealer");
lcd.setCursor(10, 2);
lcd.print(dealer);
}
void Gam2()
{
//bState1 = digitalRead(IN1);
//bState2 = digitalRead(IN2);
//bState3 = digitalRead(IN3); // Read inputs
player = 100;
if (digitalRead(IN1) == HIGH) {
playerNum++;
lcd.clear();
lcd.setCursor(0, 2);
lcd.print(playerNum); delay(150);
}
if (digitalRead(IN2) == HIGH) {
playerNum--;
lcd.clear();
lcd.setCursor(0, 2);
lcd.print(playerNum); delay(150);
}
if ((digitalRead(IN3) == HIGH) && (playerNum > 0)) {
lcd.clear();
if (playerNum == randNum) {
lcd.print("CORRECT!");
lcd.setCursor(4, 2);
lcd.print("score:");
lcd.setCursor(8, 2);
lcd.print(player);
tone(BUZZ_PIN, 500, 400);
delay(200);
tone(BUZZ_PIN, 1000, 500); // Victory sound
delay(2000);
endGame();// Return to menu
} else if (playerNum < randNum) {
lcd.print("HIGHER"); // Feedback logic
player --;
delay(400);
} else {
lcd.print("LOWER");
player--;
delay(400);
}
lcd.clear();
}
}
void Gam3()
{
//bState1 = digitalRead(IN1);
//bState2 = digitalRead(IN2);
//bState3 = digitalRead(IN3); // Read inputs
if (bState1 == 1) {
player = 1;
play();
} else if (bState2 == 1) {
player = 2;
play();
} else if (bState3 == 1) {
player = 3;
Serial.println(player);
play();
}
}
void play()
{
if ( player == randNum) {
lcd.clear();
lcd.print("TIE!");
delay(2000);
endGame();
} else if ((player == 1) && (randNum == 2)) {
lcd.clear();
lcd.print("YOU LOSE!");
delay(2000);
endGame();
} else if ((player == 2) && (randNum == 1)) {
lcd.clear();
lcd.print("YOU WIN!!");
delay(2000);
endGame();
} else if ((player == 2) && (randNum == 3)) {
lcd.clear();
lcd.print("YOU LOSE!");
delay(2000);
endGame();
} else if ((player == 3) && (randNum == 2)) {
lcd.clear();
lcd.print("YOU WIN!!");
delay(2000);
endGame();
}
}
void Gam4()
{
//bState3 = digitalRead(IN3);
if (bState3 == HIGH) {
lcd.clear();
lcd.print("ready...");
delay(CPUchoice);
lcd.clear();
lcd.print("PRESS BUTTON 1!!");
unsigned long startTime = millis(); // Localize for accuracy
// Check the pin directly in the loop
while (digitalRead(IN1) == LOW);
unsigned long reactionTime = millis() - startTime;
lcd.clear();
lcd.print("Your time was:");
lcd.setCursor(0, 2);
lcd.print(reactionTime / 1000.0);
lcd.print(" seconds");
tone(BUZZ_PIN, 500, 400);
delay(200);
tone(BUZZ_PIN, 1000, 500); // Victory sound
delay(2000);
endGame();
}
}
void Gam5()
{
delay(100);
if (num1 + num2 == 0) {
Mathset();
}
if ((bState3 == 1) && (mathC == answerRNG)) {
delay(100);
player + 1;
num1 = 0;
num2 = 0;
}
if ((bState1 == 1) && (mathA == answerRNG)) {
delay(100);
player + 1;
Mathset();
}
if ((bState2 == 1) && (mathB == answerRNG)) {
delay(100);
player + 1;
Mathset();
}
if ((bState3 == 1) && (mathC != answerRNG)) {
delay(100);
mathEnd();
}
if ((bState1 == 1) && (mathA != answerRNG)) {
delay(100);
//mathEnd();
}
if ((bState2 == 1) && (mathB != answerRNG)) {
delay(100);
//mathEnd();
}
}
void Mathset() {
num1 = random(1, 100);
num2 = random(1, 100);
answerRNG = num1 + num2;
if ( randNum == 1) {
mathA = answerRNG;
mathB = answerRNG - random(1, 20);
mathC = answerRNG + random(1, 20);
} else if ( randNum == 2) {
mathB = answerRNG;
mathA = answerRNG - random(1, 20);
mathC = answerRNG + random(1, 20);
} else {
mathC = answerRNG;
mathB = answerRNG + random(1, 20);
mathA = answerRNG + random(1, 20);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(num1);
lcd.setCursor(3, 0);
lcd.print("+");
lcd.setCursor(4, 0);
lcd.print(num2);
lcd.setCursor(7, 0);
lcd.print("= ?");
lcd.setCursor(0, 2);
lcd.print(mathA);
lcd.setCursor(5, 2);
lcd.print(mathB);
lcd.setCursor(9, 2);
lcd.print(mathC);
}
void mathEnd() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("GAME OVER!");
lcd.setCursor(0, 2);
lcd.print("Your score:");
lcd.setCursor(11, 2);
lcd.print(player);
delay(2000);
endGame();
}
void Gam6() {
if (digitalRead(IN3) == HIGH) {
lcd.clear();
lcd.setCursor(0, 0);
int index = random(0, 6);
lcd.print(Msg[index]);
delay(100);
}
}
void endGame() {
startTime = 0;
playerNum = 0;
dealer = 0;
player = 0;
Dchance = 0;
randNum = 0;
CPUchoice = 0;
answerRNG = 0;
mathA = 0;
mathB = 0;
mathC = 0;
//pgm_state = MENU_STATE;
menupress = 0;
tone(BUZZ_PIN, 523, 500);
tone(BUZZ_PIN, 600, 500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" SELECT GAME");
lcd.setCursor(0, 2);
lcd.print(" PRESS BUTTON 1");//sets up start menu
}
*/
UP
DOWN
SEL
BACK