Помогите найти ошибку в коде

buldozzeralegantniy

✩✩✩✩✩✩✩
12 Апр 2023
5
0
Делаю тетрис на портативном устройстве. Программа еще сырая, но включает генерацию фигуры, функцию поворота, передвижения и установки фигуры.
После запуска на дисплее ничего не происходит, скорее всего где-то зацикливание. Воид сетап проходит, что-то в лупе не правильное.
C++:
#include <GyverOLED.h>

#define RIGHTBUTTON 4
#define LEFTBUTTON 3
#define DOWNBUTTON 2
#define ROTATIONBUTTON 5


GyverOLED<SSD1306_128x32, OLED_BUFFER> oled;


int8_t x1[5];     int8_t y1[5]; //координаты частей фигуры. x1[0] и y1[0] обозначают координаты условного центра фигуры, остальное координаты частей фигуры относительно центра

uint32_t time=0;
bool pics[10][42];//массив из всех клеток поля, 10 - координата x, 42 - координата y, 0 означает пустую клетку, 1 - заполненую

bool right_buttone; bool right_buttone_flag; bool right_flag; //переменные для флажка
bool left_buttone; bool left_buttone_flag; bool left_flag;
bool down_buttone; bool down_buttone_flag; bool down_flag;
bool rotation_buttone; bool rotation_buttone_flag; bool rotation_flag;

byte xd[5]; byte yd[5]; //сконвертируемые координаты фигуры для дисплея

//функции для генерации фигуры, просвоение координаты относительно условного центра фигуры
void onef(){
  x1[1]=0; y1[1]=0; x1[2]=1; y1[2]=0; x1[3]=0; y1[3]=1; x1[4]=1; y1[4]=1;
}
void twof(){
  x1[1]=0; y1[1]=0; x1[2]=-1; y1[2]=1; x1[3]=0; y1[3]=1; x1[4]=1; y1[4]=1;
}
void threef(){
  x1[1]=0; y1[1]=0; x1[2]=1; y1[2]=0; x1[3]=-1; y1[3]=1; x1[4]=0; y1[4]=1;
}
void fourf(){
  x1[1]=1; y1[1]=1; x1[2]=1; y1[2]=0; x1[3]=-1; y1[3]=1; x1[4]=0; y1[4]=1;
}
void fivef(){
  x1[1]=-1; y1[1]=-1; x1[2]=0; y1[2]=-1; x1[3]=1; y1[3]=-1; x1[4]=2; y1[4]=-1;
}
void sixf(){
   x1[1]=0; y1[1]=0; x1[2]=-1; y1[2]=0; x1[3]=0; y1[3]=1; x1[4]=1; y1[4]=1;
}
void sevenf(){
  x1[1]=1; y1[1]=1; x1[2]=-1; y1[2]=0; x1[3]=-1; y1[3]=1; x1[4]=0; y1[4]=1;
}


void fig_generative(byte number){ //функция выбора фигуры для генерации
 if (number == 1){
   onef();
 } else if (number == 2){
   twof();
 } else if (number == 3){
   threef();
 } else if (number == 4){
   fourf();
 } else if (number == 5){
   fivef();
 } else if (number == 6){
   sixf();
 } else if (number == 7){
   sevenf();
 }
}

void display(){ //функция конвертирования координат фигуры для дисплея
  for (int i=1;i++;i<5){
    xd[i]=(y1[i]+y1[0])*3+1;
    yd[i]=(9-x1[i]-x1[0])*3+1;
  }
}

void fig_rotation(){//функция для поворота фигуры, здесь вроде никаких проблем
  byte i=1;
  while(i<5){
      if (y1[i]==-1){
    y1[i]=x1[i]+1;
    x1[i]=1-x1[i];
    i++;
  }
  if (y1[i]==0){
    y1[i]=x1[i];
    x1[i]=-x1[i];
    i++;
  }
  if (y1[i]==1){
    y1[i]=x1[i]-1;
    x1[i]=-1-x1[i];
    i++;
  }
  if (y1[i]==2){
    y1[i]-=1;
    x1[i]-=3;
    i++;
  }
  if (y1[i]==-2){
    x1[i]=2;
    y1[i]=-1;
    i++;
  }
  }
}


void setup() {
  pinMode(RIGHTBUTTON, INPUT_PULLUP);
  pinMode(LEFTBUTTON, INPUT_PULLUP);
  pinMode(DOWNBUTTON, INPUT_PULLUP);
  pinMode(ROTATIONBUTTON, INPUT_PULLUP);
  pinMode(A0, INPUT);

  for (byte x=0; x++; x<10){ //все клетки поля изначально пустые
    for (byte y=0; y++; y<42){
      pics[x][y]=0;
    }
  }

  oled.init();        // инициализация
  oled.clear();       // очистка
  oled.update();
randomSeed(analogRead(A0));
  x1[0]=5;
  y1[0]=41;
 
  fig_generative(random(1,7));//генерация первой фигуры
}
void loop() {
  oled.clear();
  oled.rect(0,0,127,31, OLED_STROKE);
 

  if (millis()-time>1000){ //падение фигуры
    y1[0]++;
    time=millis();
  }

 
 for (int a=1;a++;a<5){//при прикосновении фигуры с полом:
  if(y1[a]+y1[0]>41){
    for (int j=1;j++;j<5){
      pics[x1[j]+x1[0]][y1[j]+y1[0]-1]=1;//заполнить соответствующие клетки на поле
      x1[0]=5;
      y1[0]=41;
      fig_generative(random(1,7));//сгенерировать новую фигуру
      a=5;
      j=5;//закончить цикл, хз как это нормально делается
    }
  } 
        if (pics[x1[a]+x1[0]][y1[a]+y1[0]]==1){//при прикосновении фигуры с заполненой клеткой:
          for (int j=1;j++;j<5){
          pics[x1[j]+x1[0]][y1[j]+y1[0]-1]=1;//заполнение клеток поля
            x1[0]=5;
            y1[0]=41;
            fig_generative(random(1,7));//генерация новой фигуры
          a=5;
          j=5;
        }
  
  }
 
  }



  right_buttone = !digitalRead(RIGHTBUTTON); //флажок для кнопки перемещения вправо
if (right_buttone == 1 && right_buttone_flag == 0){
  right_buttone_flag=1;
  right_flag=!right_flag;
}
if (right_buttone == 0 && right_buttone_flag == 1){
  right_buttone_flag = 0;
}
if (right_flag){
  x1[0]++;
 for (int i=1;i++; i<5){
   if (x1[i]+x1[0]>9){
     x1[0]--;
     i=5;
   }
 }
 right_flag=0;
}



  left_buttone = !digitalRead(LEFTBUTTON); //флажок для кнопки перемещения влево
if (left_buttone == 1 && left_buttone_flag == 0){
  left_buttone_flag=1;
  left_flag=!left_flag;
}
if (left_buttone == 0 && left_buttone_flag == 1){
  left_buttone_flag = 0;
}
if (left_flag){
  x1[0]--;
 for (int i=1;i++; i<5){
   if (x1[i]+x1[0]<0){
     x1[0]++;
     i=5;
   }
 }
 left_flag=0;
}



  rotation_buttone = !digitalRead(ROTATIONBUTTON);//флажок для кнопки вращения фигуры
if (rotation_buttone == 1 && rotation_buttone_flag == 0){
  rotation_buttone_flag=1;
  rotation_flag=!left_flag;
}
if (rotation_buttone == 0 && rotation_buttone_flag == 1){
  rotation_buttone_flag = 0;
}
if (rotation_flag){
 fig_rotation();
 rotation_flag=0;
}



  down_buttone = !digitalRead(DOWNBUTTON); //флажок для кнопки быстрого падения фигуры, пока просто пустышка
if (down_buttone == 1 && down_buttone_flag == 0){
  down_buttone_flag=1;
  down_flag=!down_flag;
}
if (down_buttone == 0 && down_buttone_flag == 1){
  down_buttone_flag = 0;
}
if (down_flag){
 down_flag=0;
}

display(); //функция конвертирования координат в правильные для дисплея


for (int i=1;i++;i<5){
oled.rect(xd[i], yd[i], xd[i]+2, yd[i]+2, OLED_FILL);
}//отрисовка фигуры

for (int x=0;x++;x<10){//отрисовка залитых клеток
  for (int y=0;y++;y<42){
    if(pics[x][y]){
      oled.rect(y*3+1,(9-x)*3+1,y*3+3,(9-x)*3+3, OLED_FILL);
    }
  }
}

oled.update();
}
 

poty

★★★★★★✩
19 Фев 2020
3,265
950

@buldozzeralegantniy, посмотрите синтаксис for: первым параметром идёт инициализация, вторым - условие продолжения цикла, третьим - изменение параметра.
И это не программа тяжёлая, а способ хранения данных.
 
  • Лойс +1
Реакции: te238s

в а пи

✩✩✩✩✩✩✩
10 Июн 2023
1
0
int8_t x1[5]; int8_t y1[5]; //координаты частей фигуры. x1[0] и y1[0] обозначают координаты условного центра фигуры, остальное кординаты частей фигуры относительно центра