문제

그래서 나는 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 루프는 현재 행의 섀도 복사본을 만드는 한 줄 (필요한 경우, 필요할 경우 이동)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top