Question

Je travaille donc sur un jeu Tetris en tant que projet scolaire dans C. J'ai eu un petit problème avec la situation suivante. Dans Tetris quand on complète une rangée horizontale, la rangée doit être supprimée et tout au-dessus de la rangée doit descendre d'un endroit. La chose étrange sur mon code est que lorsque je place un bloc à gauche ou au centre de la planche, le bloc resteLà comme ça devrait.Mais quand je place un bloc sur le côté droit de la planche, il est immédiatement supprimé. Je mets mon code source ci-dessous pour que vous puissiez voir ce dont je parle.

Checkfory de fonction (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;
            };
        }

}

Était-ce utile?

La solution

Je ne sais pas pourquoi vous avez partagé CheckFory (), cela ne semble pas être lié à la logique de l'élimination d'une ligne.Un couple de commentaires ne ferait pas mal, alors nous savions facilement quelle partie est de déplacer le bloc descendant, et ce qui est pour effacer une ligne une fois que la pièce est dans sa position finale.

Je vois ce qui semble être une erreur dans la déclaration IF qui recherche une rangée complète - cela dépend de x, mais c'est à l'intérieur d'une boucle incrémentation de x.Il me semble que la vérification ne fonctionnera que correctement sur la première boucle et lit dans la prochaine ligne de blocs après cela.Donc, un bloc placé sur le côté droit fera un comparateur sur ce bloc et les 3 chèques restants sont contre des blocs de la ligne suivante.

Je pense que vous avez une attelle d'extrémité égarée, et la première boucle For-X dans la section centrale doit simplement être la ligne qui fait une copie ombragée de la ligne actuelle (pour être déplacée si nécessaire).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top