#include <LedControl.h>
typedef struct Snake Snake; // Definicja struktur dla węża i jabłka
struct Snake {
int glowa[2];
int cialo[40][2];
int len;
int dir[2];
};
typedef struct Apple Apple; // Definicja struktur dla jabłka
struct Apple {
int rzadPoz;
int colPoz;
};
// Konfiguracja sprzętu
const int DIN =12;
const int CS =11;
const int CLK = 10;
LedControl lc = LedControl(DIN, CLK, CS,1);
const int wartXPin = A3;
const int wartYPin = A4;
byte tab[8] = {0,0,0,0,0,0,0,0};
Snake snake = {{1,5},{{0,5}, {1,5}}, 2, {1,0}};
Apple apple = {(int)random(0,8),(int)random(0,8)};
float staryCzas = 0;
float czas = 0;
float czestoscOdsw = 3;
int i,j;
// Inicjalizacja układów
void setup() {
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
pinMode(wartXPin, INPUT);
pinMode(wartYPin, INPUT);
}
void loop() {
float deltaTime = calculateDeltaTime(); // Obliczanie czasu od ostatniej klatki
czas += deltaTime;
// Odczyt joysticka i zmiana kierunku węża
int xWart = analogRead(wartXPin);
int yWart = analogRead(wartYPin);
if(xWart<100 && snake.dir[1]==0){
snake.dir[0] = 0;
snake.dir[1] = -1;
}else if(xWart >920 && snake.dir[1]==0){
snake.dir[0] = 0;
snake.dir[1] = 1;
}else if(yWart<100 && snake.dir[0]==0){
snake.dir[0] = -1;
snake.dir[1] = 0;
}else if(yWart >920 && snake.dir[0]==0){
snake.dir[0] = 1;
snake.dir[1] = 0;
}
// Aktualizacja pozycji węża
if(czas > 1000/czestoscOdsw){
czas = 0;
Update();
}
Generuj(); // Generowanie obrazu na matrycy LED
}
// Obliczanie różnicy czasu
float calculateDeltaTime() {
float currentTime = millis();
float dt = currentTime - staryCzas;
staryCzas = currentTime;
return dt;
}
// Resetowanie tablicy
void reset() {
for(int j=0;j<8;j++){
tab[j] = 0;
}
}
// Aktualizacja pozycji węża
void Update() {
reset();
int newHead[2] = {snake.glowa[0]+snake.dir[0], snake.glowa[1]+snake.dir[1]};
// Obsługa przejścia przez krawędzie ekranu
if(newHead[0]==8){
newHead[0]=0;
}else if(newHead[0]==-1){
newHead[0] = 7;
}else if(newHead[1]==8){
newHead[1]=0;
}else if(newHead[1]==-1){
newHead[1]=7;
}
// Sprawdzenie kolizji z ciałem
for(j=0;j<snake.len;j++){
if(snake.cialo[j][0] == newHead[0] && snake.cialo[j][1] == newHead[1]){
delay(1000);
snake = {{1,5},{{0,5}, {1,5}}, 2, {1,0}};
apple = {(int)random(0,8),(int)random(0,8)};
return;
}
}
// Sprawdzenie, czy wąż zjadł jabłko
if(newHead[0] == apple.rzadPoz && newHead[1] ==apple.colPoz){
snake.len = snake.len+1;
apple.rzadPoz = (int)random(0,8);
apple.colPoz = (int)random(0,8);
} else {
usunPierwsze();
}
// Aktualizacja pozycji ciała
snake.cialo[snake.len-1][0]= newHead[0];
snake.cialo[snake.len-1][1]= newHead[1];
snake.glowa[0] = newHead[0];
snake.glowa[1] = newHead[1];
// Rysowanie węża i jabłka na matrycy
for(j=0;j<snake.len;j++){
tab[snake.cialo[j][0]] |= 128 >> snake.cialo[j][1];
}
tab[apple.rzadPoz] |= 128 >> apple.colPoz;
}
// Generowanie obrazu na matrycy
void Generuj() {
for(i=0;i<8;i++){
lc.setRow(0,i,tab[i]);
}
}
// Usuwanie pierwszego segmentu węża
void usunPierwsze() {
for(j=1;j<snake.len;j++){
snake.cialo[j-1][0] = snake.cialo[j][0];
snake.cialo[j-1][1] = snake.cialo[j][1];
}
}