#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C address 0x27, 20 columns, 4 rows
const int rightButtonPin = 2; // Digital pin for the right button
const int leftButtonPin = 3; // Digital pin for the left button
const int upButtonPin = 4; // Digital pin for the up button
const int downButtonPin = 5; // Digital pin for the down button
int offensivePlayerX = 0; // X position of the offensive player
int offensivePlayerY = 0; // Y position of the offensive player
int defenderX = 18; // X position for defenders (start on column 18)
int defenderY[3]; // Y positions for the three defenders
int lastRightButtonState = HIGH; // Previous state of the right button
int lastLeftButtonState = HIGH; // Previous state of the left button
int lastUpButtonState = HIGH; // Previous state of the up button
int lastDownButtonState = HIGH; // Previous state of the down button
const int endZoneWidth = 2; // Width of the end zones
void setup() {
lcd.begin(20, 4);
lcd.print("do2xg Retro Football");
delay(2000);
lcd.clear();
pinMode(rightButtonPin, INPUT_PULLUP);
pinMode(leftButtonPin, INPUT_PULLUP);
pinMode(upButtonPin, INPUT_PULLUP);
pinMode(downButtonPin, INPUT_PULLUP);
// Set initial positions for three defenders
for (int i = 0; i < 3; i++) {
defenderY[i] = i;
}
}
void loop() {
// Read button states
int rightButtonState = digitalRead(rightButtonPin);
int leftButtonState = digitalRead(leftButtonPin);
int upButtonState = digitalRead(upButtonPin);
int downButtonState = digitalRead(downButtonPin);
// Check for changes in button states
if (rightButtonState != lastRightButtonState && rightButtonState == LOW) {
moveOffensivePlayer(1, 0); // Move right
}
if (leftButtonState != lastLeftButtonState && leftButtonState == LOW) {
moveOffensivePlayer(-1, 0); // Move left
}
if (upButtonState != lastUpButtonState && upButtonState == LOW) {
moveOffensivePlayer(0, -1); // Move up
}
if (downButtonState != lastDownButtonState && downButtonState == LOW) {
moveOffensivePlayer(0, 1); // Move down
}
// Move defenders towards the offensive player randomly
moveDefenders();
// Update last button states
lastRightButtonState = rightButtonState;
lastLeftButtonState = leftButtonState;
lastUpButtonState = upButtonState;
lastDownButtonState = downButtonState;
// Display players on LCD
lcd.clear();
// Display end zones
for (int i = 0; i < endZoneWidth; i++) {
lcd.setCursor(i, 0);
lcd.print(" ");
lcd.setCursor(i, 3);
lcd.print(" ");
lcd.setCursor(19 - i, 0);
lcd.print(" ");
lcd.setCursor(19 - i, 3);
lcd.print(" ");
}
// Display offensive player
lcd.setCursor(offensivePlayerX, offensivePlayerY);
lcd.print("-");
// Display defenders
for (int i = 0; i < 3; i++) {
lcd.setCursor(defenderX, defenderY[i]);
lcd.print("-");
}
delay(500); // Adjust the delay for slower offensive movements
}
void moveOffensivePlayer(int deltaX, int deltaY) {
// Move the offensive player within bounds
if (offensivePlayerX + deltaX >= 1 && offensivePlayerX + deltaX <= 17 &&
offensivePlayerY + deltaY >= 0 && offensivePlayerY + deltaY <= 3) {
offensivePlayerX += deltaX;
offensivePlayerY += deltaY;
}
}
void moveDefenders() {
// Move defenders towards the offensive player randomly with a longer delay for slower movement
delay(1000); // Adjust the delay for slower defensive movements
for (int i = 0; i < 3; i++) {
// Randomly choose to move horizontally or vertically
if (random(2) == 0) {
// Move horizontally
int newDefenderX = defenderX;
while (newDefenderX == defenderX) {
newDefenderX = (defenderX > offensivePlayerX) ? defenderX - 1 : defenderX + 1;
}
defenderX = newDefenderX;
} else {
// Move vertically
int newDefenderY = defenderY[i];
while (newDefenderY == defenderY[i]) {
newDefenderY = (defenderY[i] > offensivePlayerY) ? defenderY[i] - 1 : defenderY[i] + 1;
}
defenderY[i] = newDefenderY;
}
}
}