#include <MD_MAX72xx.h>
#include <SPI.h>
#include <stdlib.h>
// Dot Matrix ayarları
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 1 // Kullanılan 8x8 modül sayısı
#define CS_PIN 10
#define DATA_PIN 11 // MD_MAX72XX kütüphanesi SPI kullanır
#define CLK_PIN 13
MD_MAX72XX matrix = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
#define UP_BTN 2
#define DOWN_BTN 3
#define LEFT_BTN 4
#define RIGHT_BTN 5
#define MAX_SNAKE_LENGTH 64
unsigned long updateInterval = 500;
struct Point {
uint8_t x;
uint8_t y;
};
Point snake[MAX_SNAKE_LENGTH];
int snakeLength = 1;
int dirX = 1;
int dirY = 0;
Point food;
bool foodAvailable = false;
unsigned long lastUpdate = 0;
void spawnFood() {
bool valid = false;
while (!valid) {
food.x = random(0, 8);
food.y = random(0, 8);
valid = true;
for (int i = 0; i < snakeLength; i++) {
if (snake[i].x == food.x && snake[i].y == food.y) {
valid = false;
break;
}
}
}
foodAvailable = true;
}
void resetGame() {
snakeLength = 1;
snake[0].x = 0;
snake[0].y = 0;
dirX = 1;
dirY = 0;
spawnFood();
}
void setup() {
randomSeed(analogRead(0));
matrix.begin();
matrix.clear();
pinMode(UP_BTN, INPUT_PULLUP);
pinMode(DOWN_BTN, INPUT_PULLUP);
pinMode(LEFT_BTN, INPUT_PULLUP);
pinMode(RIGHT_BTN, INPUT_PULLUP);
resetGame();
}
void loop() {
if (digitalRead(UP_BTN) == LOW && dirY != 1) {
dirX = 0; dirY = -1;
}
else if (digitalRead(DOWN_BTN) == LOW && dirY != -1) {
dirX = 0; dirY = 1;
}
else if (digitalRead(LEFT_BTN) == LOW && dirX != 1) {
dirX = -1; dirY = 0;
}
else if (digitalRead(RIGHT_BTN) == LOW && dirX != -1) {
dirX = 1; dirY = 0;
}
if (millis() - lastUpdate > updateInterval) {
lastUpdate = millis();
Point newHead;
newHead.x = snake[0].x + dirX;
newHead.y = snake[0].y + dirY;
if (newHead.x > 7 || newHead.y > 7 || newHead.x < 0 || newHead.y < 0) {
resetGame();
return;
}
for (int i = 0; i < snakeLength; i++) {
if (snake[i].x == newHead.x && snake[i].y == newHead.y) {
resetGame();
return;
}
}
for (int i = snakeLength; i > 0; i--) {
snake[i] = snake[i - 1];
}
snake[0] = newHead;
if (foodAvailable && newHead.x == food.x && newHead.y == food.y) {
if (snakeLength < MAX_SNAKE_LENGTH)
snakeLength++;
foodAvailable = false;
spawnFood();
}
matrix.clear();
for (int i = 0; i < snakeLength; i++) {
matrix.setPoint(snake[i].y, snake[i].x, true);
}
matrix.setPoint(food.y, food.x, true);
}
}