#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);

}