#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define RESET_PIN -1
const int btn_kiri = 6;
const int btn_atas = 7;
const int btn_kanan = 5;
const int btn_bawah = 4;
const int btn_okay = 3;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, RESET_PIN);
int snakeX = SCREEN_WIDTH / 2;
int snakeY = SCREEN_HEIGHT / 2;
int foodX, foodY;
int snakeSpeed = 40;
int snakeLength = 1;
bool gameOver = false;
void setup() {
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for (;;);
}
pinMode(btn_atas, INPUT_PULLUP);
pinMode(btn_kiri, INPUT_PULLUP);
pinMode(btn_bawah, INPUT_PULLUP);
pinMode(btn_kanan, INPUT_PULLUP);
pinMode(btn_okay, INPUT_PULLUP);
randomSeed(analogRead(0));
resetGame();
}
void loop() {
if (!gameOver) {
moveSnake();
checkCollision();
generateFood();
displayGame();
delay(100);
} else {
displayGameOver();
delay(1000);
resetGame();
}
}
void resetGame() {
snakeX = SCREEN_WIDTH / 2;
snakeY = SCREEN_HEIGHT / 2;
snakeSpeed = 1;
snakeLength = 1;
gameOver = false;
}
void moveSnake() {
if (digitalRead(btn_kanan) == LOW) {
snakeX += snakeSpeed;
} else if (digitalRead(btn_kiri) == LOW) {
snakeX -= snakeSpeed;
} else if (digitalRead(btn_bawah) == LOW) {
snakeY += snakeSpeed;
} else if (digitalRead(btn_atas) == LOW) {
snakeY -= snakeSpeed;
}
}
void checkCollision() {
if (snakeX >= SCREEN_WIDTH || snakeX < 0 || snakeY >= SCREEN_HEIGHT || snakeY < 0) {
gameOver = true;
}
if (snakeX == foodX && snakeY == foodY) {
foodX = random(SCREEN_WIDTH);
foodY = random(SCREEN_HEIGHT);
snakeLength++;
}
}
void generateFood() {
if (snakeLength > 0) {
display.setCursor(foodX, foodY);
display.println('A');
display.display();
}
}
void displayGame() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(snakeX, snakeY);
for (int i = 0; i < snakeLength; i++) {
display.println('S');
}
display.display();
}
void displayGameOver() {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10, SCREEN_HEIGHT / 2 - 10);
display.println("Game Over");
display.display();
delay(1000);
}