#include <Adafruit_NeoPixel.h>
#define PIN 3 // номер порта к которому подключен модуль
#define width 9
#define height 10
#define pixinpix 3
#define count_led 100 // количество светодиодов
#define width 9
#define height 10
#define pixinpix 3
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(count_led, PIN, NEO_GRB + NEO_KHZ800);
byte figureScin[5]={
0b11010010,
0b11110000,
0b11011000,
0b10010010,
0b10111000};
struct figure{
int x = 0;
int y = 0;
uint32_t collor;
byte pix;
};
figure figure1;
struct background{
//uint32_t col = pixels.Color(0,0,0);
bool l = false;
};
background back[300];
//bool background[width*height];
void setup() {
pixels.begin();
pixels.show(); // Устанавливаем все светодиоды в состояние "Выключено"
figure1 = spawn(figure1);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
}
void loop() {
pixels.clear();
drawBackground();
if(chekCollizion(figure1)){
figure1.y-=1;
drawFigure(figure1);
setBackground(figure1);
figure1 = spawn(figure1);
}else{
drawFigure(figure1);
figure1.y+=1;
}
chekLine();
if(!digitalRead(5)){
figure1.x-=1;
}else if(!digitalRead(6)){
figure1.x+=1;
}
delay(200);
pixels.show();
}
void chekLine(){
int a=0;
for(int i1 = 0; i1<width;i1++){
for(int i2 = 0; i2<height;i2++){
if(back[i2+i1*width].l && i1==0)
for(int i3 = 0; i3<width;i3++)
for(int i4 = 0; i4<height;i4++)
back[i3+i4*width].l = false;
if(back[i2+i1*width].l)
a++;
if(a==9){
for(int i3 = width; i3>0;i3--)
for(int i4 = i2; i4>0;i4--)
if(i4<=i2)
back[i3+(i4+1)*width].l=back[i3+(i4)*width].l;
a=0;
}
}
a=0;
}
}
figure spawn(figure fig){
fig.y = 0;
fig.x = random(1, width-1);
fig.pix = figureScin[random(0, 3)];
fig.collor = pixels.Color(random(50, 255),random(50, 255),random(50, 255));
return fig;
}
void drawBackground(){
for(int i1 = 0; i1<width;i1++)
for(int i2 = 0; i2<height;i2++)
if(back[i1+i2*width].l)
setpix(i1,i2,pixels.Color(255,255,0));
}
void setBackground(figure fig){
for(int i1 = 0; i1<3;i1++)
for(int i2 = 0; i2<3;i2++)
if(fig.pix & (1 << i1+i2*3))
back[i1+fig.x+(i2+fig.y)*width].l = 1;
}
bool chekCollizion(figure fig){
for(int i1 = 0; i1<3;i1++)
for(int i2 = 0; i2<3;i2++)
if(fig.pix & (1 << i1+i2*3) && back[(fig.x+i1)+(fig.y+i2)*width].l || fig.y>height-3)
return 1;
return 0;
}
void drawFigure(figure fig){
for(int i1 = 0; i1<3;i1++)
for(int i2 = 0; i2<3;i2++)
if(fig.pix & (1 << i1+i2*3))
setpix(i1+fig.x,i2+fig.y, fig.collor);
}
void setpix(int x, int y, uint32_t col){
int num;
if(y%2==0){
num = (x)+width*(y);
}else{
num = (x)+width*(y);
}
pixels.setPixelColor(num, col);
}