#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int FIRE_BTN = 3;
const int UP_BTN = 4;
const int DOWN_BTN = 5;
const int MAX_LASERS = 5; // Maximum number of lasers that can be active
int alienPOSy = 0;
int alienPOSx = 15;
int playerPOSy = 0;
int playerPOSx = 0;
int score = 0;
int speed = 100;
byte player[] = {
B11100,
B11100,
B00110,
B11111,
B11111,
B00110,
B11100,
B11100
};
byte alien[] = {
B00001,
B00011,
B00111,
B11111,
B00111,
B11111,
B00111,
B00001
};
struct Laser {
int x;
int y;
bool active;
};
Laser lasers[MAX_LASERS];
void setup() {
lcd.init();
lcd.backlight();
randomSeed(analogRead(0));
lcd.createChar(0, player);
lcd.createChar(1, alien);
lcd.setCursor(2, 0);
lcd.print("SPACE IMPACT");
delay(2000);
}
void loop() {
alienPOSy = random(0, 2);
do {
lcd.clear();
lcd.setCursor(playerPOSx, playerPOSy);
lcd.write((byte)0);
lcd.setCursor(alienPOSx, alienPOSy);
lcd.write((byte)1);
if (digitalRead(UP_BTN) == HIGH) {
playerPOSy = 0;
}
if (digitalRead(DOWN_BTN) == HIGH) {
playerPOSy = 1;
}
if (digitalRead(FIRE_BTN) == HIGH) {
for (int i = 0; i < MAX_LASERS; i++) {
if (!lasers[i].active) {
lasers[i].x = playerPOSx + 1;
lasers[i].y = playerPOSy;
lasers[i].active = true;
break;
}
}
}
for (int i = 0; i < MAX_LASERS; i++) {
if (lasers[i].active) {
lcd.setCursor(lasers[i].x, lasers[i].y);
lcd.print("-");
lasers[i].x++;
if (lasers[i].x >= 15) {
lasers[i].active = false;
}
if (lasers[i].x == alienPOSx && lasers[i].y == alienPOSy) {
alienPOSx = 15;
score += 1;
lasers[i].active = false;
}
}
}
if (playerPOSx == alienPOSx && playerPOSy == alienPOSy) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("GAME OVER");
lcd.setCursor(2, 1);
lcd.print("SCORE:");
lcd.setCursor(10, 1);
lcd.print(score);
delay(5000);
score = 0;
speed = 100;
}
alienPOSx--;
delay(speed);
} while (alienPOSx >= 0);
alienPOSx = 15;
if (speed > 20) {
speed -= 3;
}
}