Pregunta

Así que estoy trabajando en un juego de Tetris como un proyecto escolar en C. Tengo un pequeño problema con la siguiente situación. En Tetris, cuando complete una fila horizontal, la fila debe eliminarse y todo lo anterior debe moverse hacia abajo un lugar. Lo extraño de mi código es que cuando coloco un bloque a la izquierda o el centro de la placa, el bloque se queda.allí como debería.Pero cuando coloco un bloque en el lado derecho del tablero, se elimina de inmediato. Pongo mi código fuente a continuación para que pueda ver de qué estoy hablando.

Función CheckFory (INT YCHECKUP, INT YP)

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

principal:

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

}

¿Fue útil?

Solución

No estoy seguro de por qué compartió la checkfory (), eso no parece estar relacionado con la lógica de eliminar una fila.Un par de comentarios no lastimaría, por lo que sabríamos fácilmente qué parte es para mover el bloque que bajaba, y lo que es para borrar una fila una vez que la pieza está en su posición final.

Veo lo que parece ser un error en la instrucción IF que busca una fila completa, depende de X, pero está dentro de un bucle incrementando X.Me parece que la verificación solo funcionará correctamente en el primer bucle, y está leyendo en la siguiente línea de bloques después de eso.Por lo tanto, un bloque colocado en el lado derecho hará un compareciente en ese bloque y los 3 cheques restantes están en contra de los bloques en la siguiente fila.

Creo que tiene una abrazadera final extraviada, y el primer bucle FOR-X en la sección central debe ser la única línea que hace que una copia de sombra de la fila actual (para ser movida hacia abajo si es necesario).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top