Salve, ho notato questo forum molto attivo per quanto riguarda la programmazione.
Volevo chiedervi aiuto relativamente al gioco del Tetris in C
Ho un problema sulla rotazione di un pezzo, praticamente quando l’utente digita il tasto per ruotare, un frammento del pezzo che scende resta bloccato, e l’oggetto non ruota.
Qualcuno sarebbe così gentile da aiutarmi?
Grazie in anticipo.
Questo è il codice:
#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();
}
}
}
[/quote]