[C] Gioco del tetris - problemi nella rotazione

di il
1 risposte

[C] Gioco del tetris - problemi nella rotazione

Salve, mi dispiace dover consumare questo mio secondo post per la ricerca di un aiuto, ma purtroppo ne necessito

Entro le prossime 2 settimane devo sviluppare un gioco del tetris per consegnarlo all'esame di programmazione. Credo di esser giunto ad un buon punto, tuttavia non riesco proprio ad implementare la rotazione dei blocchi creati casualmente (in realta' il blocco da ruotare e' soltanto la linea).
Ho provato a manovrare gli indici dell'array relativo alla linea ma questo, dopo essersi messo in posizione orizzontale ( XXX ) ritorna in verticale al passo successivo. Davvero non capisco cosa comporti cio', e non so come continuare, per questo chiedo aiuto a voi.

Di seguito vi allego la traccia del progetto e il codice che ho scritto fino ad ora.
Si vuole implementare un programma per la simulazione del gioco del tetris.
Si consideri per semplicità che l’utente abbia a disposizione solo oggetti quadrati (formati da 4 quadratini) e lineari (3 quadratini) da inserire in una griglia. Ad ogni istante l’utente può scegliere di ruotare l’oggetto lineare creato casualmente, a destra o sinistra. Se si completa una linea sul fondo della griglia l’utente guadagna un punto e l’intera linea viene eliminata. Il gioco finisce dopo la creazione casuale di 20 oggetti o se l’utente non può inserire più oggetti. Nella simulazione mostrare le fasi del gioco.
Effettuare almeno 5 test, visualizzando le fasi del gioco (con almeno una vincita e almeno una perdita).
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <time.h>

#define RIGA 21
#define COLONNA 10
#define DESTRA 77
#define SINISTRA 75
#define GIU 80
#define SU 72

void GotoXY(int x, int y)
{
    COORD CursorPos = {x, y};
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hConsole, CursorPos);
}

// FUNCTION PER RALLENTARE I MOVIMENTI
void ritardo()
{
    long double i;
    for(i=0;i<=(30000000);i++);
}

int i, j; // CONTATORI
int sposta, random; // VARIABILI BOOLEANE
int punti = 0; // VARIABILE PERASSEGNAZIONE DEI PUNTI
int contatore_pezzi = 1; // VARIABILE PER CONTARE IL NUMERO DI OGGETTI CREATI
char griglia[21][10]; // DICHIARAZIONE ARRAY DI CHAR
char pezzo[2][2] = {{'X', 'X'}, // DICHIARAZIONE CUBO
                    {'X', 'X'}};
char linea[3][1] = {{'X'},
                    {'X'},
                    {'X'}}; // DICHIARAZIONE LINEA
char linea_or[1][3] = { {'X'},{'X'},{'X'}};

void caricaArray() // INIZIALIZZA L'ARRAY VUOTO CON CICLI FOR INNESTATI
{
    for (i = 0; i < RIGA; i++)
    {
        for (j = 0; j < COLONNA; j++)
        {
            griglia[i][j] = ' ';
        }
    }
}

// PROTOTIPI FUCTION
void movimenti();
void assegnaPezzo();
void eliminaRiga();
void stampaBordi();

int main()
{
    printf("\n                                 BENVENUTI IN\n\n");
    printf(" /////////////////// XXXXX  XXXXX  XXXXX  XXXX    X  XXXXX ///////////////////\n");
    printf(" ///////////////////   X    X        X    X   X   X  X     ///////////////////\n");
    printf(" ///////////////////   X    XXXX     X    XXXX    X  XXXXX ///////////////////\n");
    printf(" ///////////////////   X    X        X    X  X    X      X ///////////////////\n");
    printf(" ///////////////////   X    XXXXX    X    X   X   X  XXXXX ///////////////////\n\n");
    printf("ISTRUZIONI:\n - Per muoverti all'interno della griglia premi le frecce direzionali (SINISTRA/DESTRA)\n");
    printf(" - Per ruotare le forme premi la freccia direzionale SU\n");
    printf(" - Per ogni riga completata verra' totalizzato un punto.\n\N");
    printf("Per iniziare a giocare premi un tasto.\n");
    system("PAUSE");
    caricaArray();
    movimenti();
    printf("\n\n");
    return 0;
}

void visualizzaArray() // VISUALIZZA L'ARRAY ALLO STATO ATTUALE
{
    printf("\n");
    for (i = 0; i < RIGA; i++)
    {
        printf(" "); //Spazio per visualizzare tutti i punti all'interno del bordo
        for (j = 0; j < COLONNA; j++)
        {
            printf("%c ", griglia[i][j]);
        }
        printf("\n");
    }
        stampaBordi();
}

void movimenti() // GESTISCE TUTTI I POSSIBILI MOVIMENTI DELLA FORMA
{
    do {
        eliminaRiga(); // Ad ogni ciclo verifica la presenza di righe piene
        int r = 0;
        int c = 4;
        srand(time(NULL)); // Random
        random = rand() % 2;
        assegnaPezzo();
        visualizzaArray();

        do {
            GotoXY(r,c); // Inizia a scorrere verso il basso
            r++;
            system("cls");
            if (random == 0) { // Se l'oggetto creato e' il cubo
                griglia[r-1][c] = ' '; // Libera le posizioni precedenti
                griglia[r-1][c+1] = ' ';
                griglia[r][c] = pezzo[0][0]; // Riassegna l'oggetto nella nuova posizione
                griglia[r][c+1] = pezzo[0][1];
                griglia[r+1][c] = pezzo[1][0];
                griglia[r+1][c+1] = pezzo[1][1];
            }
            if (random == 1) { // Se l'oggetto creato e' la linea
                    if ( !kbhit() ) // Se non si premono tasti
                        {
                            griglia[r-1][c] = ' '; // Libera le posizioni precedenti
                            griglia[r][c] = linea[0][0]; // Riassegna l'oggetto nella nuova posizione
                            griglia[r+1][c] = linea [1][0];
                            griglia[r+2][c] = linea [2][0];
                        }
            }
            visualizzaArray();
            ritardo();
            if ( kbhit() ) // Se durante lo scroll verticale si preme un tasto
                {
                    sposta = getch(); // Prende in input un tasto e lo assegna alla variabile sposta
                    if (sposta==SU) // E se e' la freccia SU
                        {
                            griglia[r-1][c] = ' ';
                            griglia[r][c-1] = linea_or[0][0];
                            griglia[r][c] = linea_or[1][0];
                            griglia[r][c+1] = linea_or[2][0];
                        }

                    if (sposta == DESTRA ) // E se e' la freccia DESTRA
                    {
                        c++; // L'oggetto si sposta a destra
                        system("cls");
                        if (random == 0) {
                            if (c+1>COLONNA-1) { break; } // Se supera il bordo destro
                        griglia[r][c-1] = ' '; // Libera le posizioni precedenti
                        griglia[r+1][c-1] = ' ';
                        }
                        else if (random == 1) {
                        griglia[r-2][c-1] = ' '; // Libera le posizioni precedenti
                        griglia[r-1][c-1] = ' ';
                        griglia[r][c-1] = ' ';
                        griglia[r+1][c-1] = ' ';
                        griglia[r+2][c-1] = ' ';
                        }
                        visualizzaArray(); //visualizza il tutto
                    }
                    if (sposta == SINISTRA ) // E se e' la freccia SINISTRA
                    {
                        c--; // L'oggetto si sposta a sinistra
                        if (c<0) { break; } // Se supera il bordo sinistro
                        system("cls");
                        if (random == 0) {
                        griglia[r][c+2] = ' '; // Libera le posizioni precedenti
                        griglia[r+1][c+2] = ' ';
                        }
                        else if (random == 1) {
                        griglia[r-1][c+2] = ' '; // Libera le posizioni precedenti
                        griglia[r-1][c+1] = ' ';
                        griglia[r][c+1] = ' ';
                        griglia[r+1][c+1] = ' ';
                        griglia[r+2][c+1] = ' ';
                        }
                        visualizzaArray();
                    }
                }
            if (random == 0) {
            if (griglia[r+2][c] == 'X' || griglia[r+2][c+1] == 'X') // Se il pezzo tocca un altro pezzo inferiormente
            {
                if (griglia[0][c] == 'X' || griglia[1][c] == 'X') // Se lo spazio superiore e' troppo piccolo
                {
                    system("cls");
                    printf("HAI PERSO!\nPremi ESC per uscire.");
                    break;
                }
                contatore_pezzi++;
                return movimenti(); //Allora attiva la ricorsivita'
            }
            }
            if (random == 1) {
                if (griglia[r+3][c] == 'X') {
                    if (griglia[0][c] == 'X' || griglia[1][c] == 'X')
                    {
                        system("cls");
                        printf("HAI PERSO!\nPremi ESC per uscire.");
                        break;
                    }
                    contatore_pezzi++;
                    return movimenti();
                }
            }
            if (random == 0) {
            if (r+1==20) { // Se tocca il borso inferiore crea un altro oggetto
                contatore_pezzi++;
                return movimenti(); }
            }
            else if (random == 1) {
            if (r+2==20) { // Se tocca il borso inferiore crea un altro oggetto
                contatore_pezzi++;
                return movimenti(); }
            }
        } while ( sposta != 27 );
    } while ( getch() != 27 );
}

void stampaBordi() // STAMPA LA CORNICE DEL CAMPO DI GIOCO
{
    for(i=1;i<=19;i++)
    {
        GotoXY(i,22); putch('-');
        GotoXY(i,0); putch('-');
    }
        printf("   PUNTI:%d - PEZZO No %d", punti, contatore_pezzi);
    for (j=1;j<22; j++) {
        GotoXY(0,j); putch('|');
        GotoXY(20,j); putch('|');
    }
}

void assegnaPezzo()
{
    int i1 = 0;
    int j1 = 4;
    if (random==0) {
    griglia[i1][j1] = pezzo[0][0]; // Assegna il pezzo nella posizione iniziale
    griglia[i1][j1+1] = pezzo[0][1];
    griglia[i1+1][j1] = pezzo[1][0];
    griglia[i1+1][j1+1] = pezzo[1][1];
    }
    if (random==1) {
        griglia[i1][j1] = linea[0][0];
        griglia[i1+1][j1] = linea [1][0];
        griglia[i1+2][j1] = linea [2][0];
    }
}

void eliminaRiga() // ELIMINA UNA O PIU' RIGHE, SE PIENE
{
    int k;
    int cont_riga;
    int colonna;
    char aus[COLONNA];
    for (cont_riga=0; cont_riga<=20; cont_riga++)
    {
        if (griglia[cont_riga][0] == 'X' && griglia[cont_riga][1] == 'X' && griglia[cont_riga][2] == 'X' && griglia[cont_riga][3] == 'X' && griglia[cont_riga][4] == 'X' && griglia[cont_riga][5] == 'X' && griglia[cont_riga][6] == 'X' && griglia[cont_riga][7] == 'X' && griglia[20][8] == 'X' && griglia[20][9] == 'X')
        {
            for (colonna=0; colonna<10; colonna++) {
                aus[colonna] = griglia[cont_riga-1][colonna];
            }
            for (colonna=0; colonna<10; colonna++) {
                griglia[cont_riga][colonna] = aus[colonna];
            }
            for (colonna=0; colonna<10; colonna++) {
                griglia[cont_riga-1][colonna] = '.';
            }
            punti++;
            for (k=2; k<11; k++) {
            if (griglia[cont_riga-k][0] == 'X' || griglia[cont_riga-k][1] == 'X' || griglia[cont_riga-k][2] == 'X' || griglia[cont_riga-k][3] == 'X' || griglia[cont_riga-k][4] == 'X' || griglia[cont_riga-k][5] == 'X' || griglia[cont_riga-k][6] == 'X' || griglia[cont_riga-k][7] == 'X' || griglia[cont_riga-k][8] == 'X' || griglia[cont_riga-k][9] == 'X' )
                {
                    for (colonna=0; colonna<10; colonna++) {
                    aus[colonna] = griglia[cont_riga-k][colonna];
                    }
                    for (colonna=0; colonna<10; colonna++) {
                    griglia[cont_riga-k+1][colonna] = aus[colonna];
                    }
                    for (colonna=0; colonna<10; colonna++) {
                    griglia[cont_riga-k][colonna] = '.';
                    }
                }
            }
            system("cls");
            visualizzaArray();
        }
    }
}

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte