#include <FastLED.h>
#define WIDTH 16 //Ширина матрицы
#define HEIGHT 16 //Высота матрицы
#define LED_PIN 13 //Пин подключения матрицы на ардуино
#define NUM_LEDS (WIDTH * HEIGHT) //Общее количество светодиодов
#define BRIGHTNESS 255 //Яркость (0-255)
CRGB leds[NUM_LEDS]; //Массив для светодиодов
char board[WIDTH][HEIGHT] = {0}; // Инициализация игрового поля
void setup() {
FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
randomSeed(analogRead(0));
SetNewBoard();
}
void NextStep() { //Функция обновления состояния доски
char tempBoard[WIDTH][HEIGHT] = {0}; //Временный массив
bool flag = false;
for (char i = 0; i < HEIGHT; i++) {
for (char j = 0; j < WIDTH; j++) {
leds[XY(i, j)] = CRGB::Black; //Очистка светодиодов
if (board[i][j] == 3) {
flag = true;
tempBoard[i][j] = 1;
tempBoard[i + 1][j] = 2;
tempBoard[i][j + 1] = 2;
tempBoard[i][j - 1] = 2;
tempBoard[i - 1][j] = 2;
}
else if (board[i][j] == 2) {
flag = true;
tempBoard[i][j] = 1;
if (i == 0 || j == 0 || i == HEIGHT - 1 || j == WIDTH - 1)
continue;
char arr[2] = {-1, 1};
char x = random(-1, 2);
char y = 0;
if (x == 0)
y = arr[random(2)];
tempBoard[i + y][j + x] = 2;
}
else if (board[i][j] == 1 && tempBoard[i][j] != 2) {
tempBoard[i][j] = 1;
}
}
}
for (char i = 0; i < WIDTH; i++) { //Копирование временного массива в основной
for (char j = 0; j < HEIGHT; j++) {
board[i][j] = tempBoard[i][j];
}
}
if (flag == false)
SetNewBoard();
}
void SetNewBoard() {
for (char i = 0; i < HEIGHT; i++) {
for (char j = 0; j < WIDTH; j++) {
board[i][j] = 0;
}
}
for (char i = 0; i < random(3, 7); i++)
board[random(HEIGHT)][random(WIDTH)] = 3;
}
int XY(char x, char y) { //Функция преобразования координат
return ((WIDTH - x) * WIDTH - (HEIGHT - y));
}
void loop() {
for (char i = 0; i < HEIGHT; i++) { //Отображение текущего состояния на матрице
for (char j = 0; j < WIDTH; j++) {
if (board[i][j] == 3)
leds[XY(i, j)] = CRGB(0, 255, 0);
else if (board[i][j] == 2)
leds[XY(i, j)] = CRGB(255, 0, 0);
else if (board[i][j] == 1)
leds[XY(i, j)] = CRGB(0, 0, 255);
}
}
FastLED.show();
delay(100);
NextStep(); //Переход к следующему шагу
}