#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));
}
void NextStep() { //Функция обновления состояния доски
for (char i = WIDTH - 1; i >= 0; i--) {
for (char j = HEIGHT - 1; j >= 0; j--) {
if (board[i][j] != 0) {
if (i == HEIGHT - 1){
board[i][j] = 0;
continue;
}
board[i][j] -= 1;
char rand;
if (j == 0) {
for (char q = 0; q < 10; q--){
rand = random(0, 2);
if (board[i + 1][j + rand] == 0){
board[i + 1][j + rand] = board[i][j];
board[i][j] = 0;
break;
}
}
}
else if (j == WIDTH - 1) {
for (char q = 0; q < 10; q--){
rand = random(-1, 1);
if (board[i + 1][j + rand] == 0){
board[i + 1][j + rand] = board[i][j];
board[i][j] = 0;
break;
}
}
}
else {
for (char q = 0; q < 10; q--){
rand = random(-1, 2);
if (board[i + 1][j + rand] == 0){
board[i + 1][j + rand] = board[i][j];
board[i][j] = 0;
break;
}
}
}
}
}
}
}
int XY(char x, char y) { //Функция преобразования координат
return ((16 - x) * WIDTH - (16 - y));
}
void loop() {
board[0][7] = 14;
board[0][8] = 14;
board[1][7] = 14;
board[1][8] = 14;
for (char i = 0; i < WIDTH; i++) { //Отображение текущего состояния на матрице
for (char j = 0; j < HEIGHT; j++) {
if (board[i][j] == 16) {
leds[XY(i, j)] = CRGB::White;
}
else if (board[i][j] != 0) {
leds[XY(i, j)].setHue(board[i][j] * 2);
}
else if (board[i][j] == 0){
leds[XY(i, j)] = CRGB::Black;
}
}
}
FastLED.show();
delay(80);
NextStep(); //Переход к следующему поколению
}