#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#define PIN_SCLK 10
#define PIN_DIN 11
#define PIN_DC 14
#define PIN_CS 13
#define PIN_RST 12
Adafruit_PCD8544 display = Adafruit_PCD8544(PIN_SCLK, PIN_DIN, PIN_DC, PIN_CS, PIN_RST);
#define JOY_HORZ 1
#define JOY_VERT 2
#define JOY_SEL 4
// Snake grid size (each cell = 2x2 pixels)
#define GRID_W 42
#define GRID_H 24
// Snake storage
int snakeX[200];
int snakeY[200];
int snakeLength = 5;
int foodX, foodY;
int dirX = 1; // start moving right
int dirY = 0;
unsigned long lastMove = 0;
int speedDelay = 120;
void spawnFood() {
foodX = random(0, GRID_W);
foodY = random(0, GRID_H);
}
void resetGame() {
snakeLength = 5;
for (int i = 0; i < snakeLength; i++) {
snakeX[i] = GRID_W / 2 - i;
snakeY[i] = GRID_H / 2;
}
dirX = 1;
dirY = 0;
spawnFood();
}
void drawCell(int gx, int gy) {
display.fillRect(gx * 2, gy * 2, 2, 2, BLACK);
}
void setup() {
Serial.begin(115200);
pinMode(JOY_SEL, INPUT_PULLUP);
display.begin();
display.setContrast(60);
display.clearDisplay();
display.display();
randomSeed(analogRead(1));
resetGame();
}
void loop() {
// Read joystick
int h = analogRead(JOY_HORZ);
int v = analogRead(JOY_VERT);
int sel = digitalRead(JOY_SEL);
// Inverted direction control
if (h < 1500 && dirX != -1) { dirX = 1; dirY = 0; } // LEFT → RIGHT
else if (h > 3000 && dirX != 1) { dirX = -1; dirY = 0; } // RIGHT → LEFT
else if (v < 1500 && dirY != -1) { dirX = 0; dirY = 1; } // UP → DOWN
else if (v > 3000 && dirY != 1) { dirX = 0; dirY = -1; } // DOWN → UP
// Move snake
if (millis() - lastMove > speedDelay) {
lastMove = millis();
// Shift body
for (int i = snakeLength - 1; i > 0; i--) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
// Move head
snakeX[0] += dirX;
snakeY[0] += dirY;
// Wall collision
if (snakeX[0] < 0 || snakeX[0] >= GRID_W || snakeY[0] < 0 || snakeY[0] >= GRID_H) {
resetGame();
}
// Self collision
for (int i = 1; i < snakeLength; i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
resetGame();
}
}
// Food collision
if (snakeX[0] == foodX && snakeY[0] == foodY) {
snakeLength++;
spawnFood();
}
}
// Draw everything
display.clearDisplay();
// Draw food
drawCell(foodX, foodY);
// Draw snake
for (int i = 0; i < snakeLength; i++) {
drawCell(snakeX[i], snakeY[i]);
}
display.display();
// Restart on SEL
if (sel == LOW) {
resetGame();
delay(300);
}
}
Loading
nokia-5110
nokia-5110