Domanda

Quindi sto lavorando a un gioco tetris come progetto scolastico in C. Ho avuto un piccolo problema con la seguente situazione. In Tetris quando si completa una riga orizzontale, la riga deve essere cancellata e tutto sopra la riga dovrebbe abbattere un posto. La cosa strana del mio codice è che quando metto un blocco a sinistra o al centro del tabellone, il blocco rimanelà come dovrebbe.Ma quando metto un blocco sul lato destro del tabellone, viene immediatamente cancellato. Ho messo il mio codice sorgente qui sotto in modo da poter vedere di cosa sto parlando.

Funzione checkfory (int ycheckup, int yp)

        if(ycheckup==1)
        {
            yp++;
            return yp;
        }
        else if(ycheckup==0)
        {
            yp=0;
            return yp;
        }
.

Principale:

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;
            };
        }

}
.

È stato utile?

Soluzione

Non sono sicuro del motivo per cui hai condiviso il checkfory (), che non sembra essere correlato alla logica di ripulire una riga.Un coppia comandi non sarebbe ferita, quindi sapremmo facilmente quale parte è per spostare il blocco scendendo, e cosa è per cancellare una riga una volta che il pezzo è nella sua posizione finale.

Vedo cosa sembra essere un errore nella dichiarazione IF che cerca una riga completa - dipende da X, ma è all'interno di un anello che incrementa x.Mi sembra che il controllo funzionerà solo correttamente sul primo loop e sta leggendo nella riga successiva dei blocchi dopo di ciò.Quindi un blocco posto sul lato destro farà un confronto su quel blocco e i restanti 2 controlli sono contro i blocchi sulla riga successiva.

Penso che tu abbia un brace end-end fraced e il primo ciclo per-x nella sezione centrale dovrebbe essere solo la linea che rende una copia ombra della riga corrente (da spostare se necessario).

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top