Делаю тетрис на портативном устройстве. Программа еще сырая, но включает генерацию фигуры, функцию поворота, передвижения и установки фигуры.
После запуска на дисплее ничего не происходит, скорее всего где-то зацикливание. Воид сетап проходит, что-то в лупе не правильное.
После запуска на дисплее ничего не происходит, скорее всего где-то зацикливание. Воид сетап проходит, что-то в лупе не правильное.
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();
}