#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pins
const int trueBtnPin = 2;
const int falseBtnPin = 3;
const int buzzerPin = 8;
int score = 0;
int questionCount = 0;
const int totalQuestions = 10;
bool isAnswerCorrect;
void setup() {
lcd.begin(16, 2); // ✅ Correct usage for most I2C LCD libraries
lcd.backlight();
pinMode(trueBtnPin, INPUT);
pinMode(falseBtnPin, INPUT);
pinMode(buzzerPin, OUTPUT);
lcd.setCursor(0, 0);
lcd.print("Algebra Game!");
delay(2000);
lcd.clear();
randomSeed(analogRead(0));
generateQuestion();
}
void loop() {
if (digitalRead(trueBtnPin) == HIGH) {
checkAnswer(true);
delay(300);
}
if (digitalRead(falseBtnPin) == HIGH) {
checkAnswer(false);
delay(300);
}
}
void generateQuestion() {
lcd.clear();
int gameType = random(1, 11); // 1 to 10
int a = random(1, 11);
int b = random(1, 11);
int result;
int display;
String q;
switch (gameType) {
case 1: // Addition
result = a + b;
display = result + random(-2, 2);
isAnswerCorrect = (display == result);
q = String(a) + "+" + String(b) + "=" + String(display);
break;
case 2: // Subtraction
result = a - b;
display = result + random(-2, 2);
isAnswerCorrect = (display == result);
q = String(a) + "-" + String(b) + "=" + String(display);
break;
case 3: // Multiplication
result = a * b;
display = result + random(-2, 2);
isAnswerCorrect = (display == result);
q = String(a) + "*" + String(b) + "=" + String(display);
break;
case 4: // Division
result = a;
int temp = a * b;
display = result + random(-1, 2);
isAnswerCorrect = (display == result);
q = String(temp) + "/" + String(b) + "=" + String(display);
break;
case 5: // Square
result = a * a;
display = result + random(-3, 4);
isAnswerCorrect = (display == result);
q = String(a) + "^2=" + String(display);
break;
case 6: // Cube
result = a * a * a;
display = result + random(-5, 6);
isAnswerCorrect = (display == result);
q = String(a) + "^3=" + String(display);
break;
case 7: // Linear: 2x + 3 = ?
result = 2 * a + 3;
display = result + random(-2, 3);
isAnswerCorrect = (display == result);
q = "2*" + String(a) + "+3=" + String(display);
break;
case 8: // Quadratic: x^2 + 2x + 1
result = a * a + 2 * a + 1;
display = result + random(-3, 4);
isAnswerCorrect = (display == result);
q = String(a) + "^2+2*" + String(a) + "+1=" + String(display);
break;
case 9: // x + b = c, find x
int x = a;
int c = a + b;
display = x + random(-1, 2);
isAnswerCorrect = (display == x);
q = "x+" + String(b) + "=" + String(c) + ",x=" + String(display);
break;
case 10: // Exponent match
result = pow(2, a);
display = result + random(-5, 6);
isAnswerCorrect = (display == result);
q = "2^" + String(a) + "=" + String(display);
break;
}
lcd.setCursor(0, 0);
lcd.print(q.substring(0, 16));
lcd.setCursor(0, 1);
lcd.print("Score:" + String(score));
}
void checkAnswer(bool userInput) {
questionCount++;
if (userInput == isAnswerCorrect) {
score++;
tone(buzzerPin, 1000, 200); // correct
} else {
tone(buzzerPin, 300, 500); // wrong
}
delay(1000);
if (questionCount >= totalQuestions) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Game Over");
lcd.setCursor(0, 1);
lcd.print("Score: " + String(score));
while (1); // Freeze game
} else {
generateQuestion();
}
}