#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
#define JOY_X A0
#define JOY_Y A1
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
const int gridSize = 10;
const int maxLength = 100;
int snakeX[maxLength], snakeY[maxLength];
int length = 5;
int dirX = 1, dirY = 0;
int foodX, foodY;
bool gameOver = false;
unsigned long lastMove = 0;
int moveInterval = 150;
void setup() {
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
for (int i = 0; i < length; i++) {
snakeX[i] = 50 - i * gridSize;
snakeY[i] = 50;
}
spawnFood();
}
void loop() {
if (gameOver) return;
readJoystick();
if (millis() - lastMove > moveInterval) {
moveSnake();
lastMove = millis();
}
}
void readJoystick() {
int xVal = analogRead(JOY_X);
int yVal = analogRead(JOY_Y);
if (xVal < 400 && dirX != 1) { dirX = -1; dirY = 0; }
else if (xVal > 600 && dirX != -1) { dirX = 1; dirY = 0; }
if (yVal < 400 && dirY != 1) { dirX = 0; dirY = -1; }
else if (yVal > 600 && dirY != -1) { dirX = 0; dirY = 1; }
}
void moveSnake() {
tft.fillRect(snakeX[length - 1], snakeY[length - 1], gridSize, gridSize, ILI9341_BLACK);
for (int i = length - 1; i > 0; i--) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
snakeX[0] += dirX * gridSize;
snakeY[0] += dirY * gridSize;
if (snakeX[0] < 0 || snakeX[0] >= tft.width() ||
snakeY[0] < 0 || snakeY[0] >= tft.height()) {
endGame();
return;
}
for (int i = 1; i < length; i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
endGame();
return;
}
}
if (snakeX[0] == foodX && snakeY[0] == foodY) {
if (length < maxLength) length++;
spawnFood();
}
tft.fillRect(snakeX[0], snakeY[0], gridSize, gridSize, ILI9341_GREEN);
}
void spawnFood() {
foodX = random(0, tft.width() / gridSize) * gridSize;
foodY = random(0, tft.height() / gridSize) * gridSize;
tft.fillRect(foodX, foodY, gridSize, gridSize, ILI9341_RED);
}
void endGame() {
gameOver = true;
tft.setCursor(60, 100);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("Game Over!");
}