문제
그래서 나는 C에서 학교 프로젝트로서 테트리스 게임을하고 있습니다. 나는 다음과 같은 상황에 문제가 있었다. TETRI에서 수평 행을 완료하면 행을 삭제해야하며 행 위의 모든 것이 한 곳에서 움직여야합니다. 내 코드에 대한 이상한 점은 보드의 왼쪽이나 중앙에 블록을두면 블록이 유지됩니다.그곳에는해야합니다.그러나 보드의 오른쪽에 블록을 놓으면 즉시 삭제됩니다. 아래의 소스 코드를 아래에 두어 내가 무슨 말을하는지 볼 수 있습니다.
함수 CheckFory (int ycheckup, int yp)
if(ycheckup==1)
{
yp++;
return yp;
}
else if(ycheckup==0)
{
yp=0;
return yp;
}
.
main :
int Block_O[2][2] = {{1,1},{1,1}};
int printb[8][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
int saveb[8][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
int x;
int y;
int i;
int xp = 0;
int yp = 0;
int ycheckup = 0;
int ch1;
int ch2;
int ytemp;
int ycheck = 0;
int xcheck = 2;
while(1)
{
for(y=0;y<8;y++)
{
for(x=0;x<4;x++)
{
if(y==ycheck && x==xcheck || y==ycheck+1 && x==xcheck || y==ycheck && x==xcheck+1 || y==ycheck+1 && x==xcheck+1)//Looks for place to put block in
{
//printf(" %d ",xp);
printb[y][x] = Block_O[yp][xp];
printf("%d", printb[y][x]);
ycheckup=1;
xp++;
}
else
{
printb[y][x] = saveb[y][x];
printf("%d", printb[y][x]);
ycheckup=0;
}
}
//checkycor(ycheck,printb);
yp = checkfory(ycheckup, yp);
xp=0;
printf("\n");
}
for(i=0; i<30000000; i++) //Delay
{
;
}
ycheck++;
system("cls");
if(ycheck==7 || printb[ycheck+1][xcheck] == 1 || printb[ycheck+1][xcheck+1] == 1 ) //Checks for correlation
{
for(y=0;y<8;y++)
{
for(x=0;x<4;x++)
{
saveb[y][x] = printb[y][x];
if((printb[y][x] == 1) && (printb[y][x+1] == 1) && (printb[y][x+2] == 1) && (printb[y][x+3] == 1)) //Checks for full row
{
ytemp = y;
for(y=ytemp;y>0;y--)
{
for(x=0;x<4;x++)
{
if(y>0)
{
saveb[y][x] = printb[y-1][x]; //moves everything above deleted row, one row down
}
else
{
saveb[y][x] = 0;
}
printb[y][x] = saveb[y][x];
}
}
}
}
}
ycheck=0;
}
if (kbhit()!=0)
{
ch1 = getch();
ch2 = 0;
ch2 = getch();
switch(ch2)
{
case 75:
xcheck--;
break; //left
case 77:
xcheck++;
break;
default:
;
break;
};
}
}
. 해결책
저는 checkfory ()를 공유하는 이유를 확신 할 수 없습니다. 행을 지우는 논리와 관련된 것 같습니다.부부 의견은 아프지 않을 것입니다. 그래서 우리는 블록을 움직이는 부분을 쉽게 알 수 있으며, 조각이 최종 위치에있는 일단 연속을 제거하는 것은 쉽게 알 수 있습니다.
전체 행을 찾는 IF 문에서 오류가있는 것으로 보이는 것을 알 수 있습니다. x에 따라 다르지만 루프 증가 x 내부입니다.체크가 첫 번째 루프에서만 올바르게 작동하는 것만이고 그 다음 블록의 다음 블록 줄로 읽는 것 같습니다.따라서 오른쪽에 배치 된 블록은 해당 블록에서 비교를 수행하고 나머지 3 개의 검사는 다음 행의 블록에 대해 반대합니다.
나는 당신이 잘못 배치 된 엔드 브레이스를 가지고 있으며, 중간 섹션의 첫 번째 x 루프는 현재 행의 섀도 복사본을 만드는 한 줄 (필요한 경우, 필요할 경우 이동)