Problema output progetto 2048 in C.

di il
7 risposte

Problema output progetto 2048 in C.

Buon pomeriggio a tutti, scrivo questo posto dopo il precedente sempre riguardante questo progetto.

Il programma mi funziona nel senso che il gioco é corretto e non da problemi.

Per quanto riguarda l'outputdella tabella, piú un numero é grande e piú si “deforma”.

Vi inserisco un'immagine di quello che intendo:

Qui sotto vi riporto il codice con la tebella "corretta":

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

#define FOR_WINDOWS 1


#if FOR_WINDOWS == 1
#define scanf scanf_s
#define gets gets_s
#endif

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------

int numbers[10] = {2, 4, 8, 16, 32, 64, 128, 256};


int directions[4] = {
                        72, //UP
                        75, //LEFT
                        77, //RIGHT
                        80  //DOWN
                    };
int Score = 0;


void clearScreen()
{
    if (FOR_WINDOWS)
        system("cls");
    else
        printf("\e[1;1H\e[2J");
}


int Random(int min, int max)
{
    return rand() % (max + 1 - min) + min;
}


int isTableFree(int Table[4][4])
{
    int i, j;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            if (!Table[i][j])
                return 1;
    return 0;
}


int canMove(int Table[4][4])
{
    int i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            if (Table[i][j] == Table[i][j + 1] || Table[i][j] == Table[i + 1][j])
                return 1;
    return 0;
}


void randomCoord(int coord[2])
{
    int i;
    for (i = 0; i < 2; i++)
        coord[i] = Random(0, 3);
}


void newNum(int Table[4][4])
{
    int coord[2], done = 0;
    do
    {
        randomCoord(coord);
        if (Table[coord[0]][coord[1]] == 0)
        {
            Table[coord[0]][coord[1]] = Random(1, 2) * 2;
            done++;
        }
    } while (!done && isTableFree(Table));
}


void moveNumbers(int Table[4][4], int dir)
{
    int i, j, k;
    switch (dir)
    {
    case 72:
        //UP
        for (k = 0; k < 3; k++)
            for (i = 3; i > 0; i--)
                for (j = 0; j < 4; j++)
                    if (Table[i - 1][j] == 0)
                    {
                        Table[i - 1][j] = Table[i][j];
                        Table[i][j] = 0;
                    }
        break;
    case 75:
        //LEFT
        for (k = 0; k < 3; k++)
            for (i = 0; i < 4; i++)
                for (j = 3; j > 0; j--)
                    if (Table[i][j - 1] == 0)
                    {
                        Table[i][j - 1] = Table[i][j];
                        Table[i][j] = 0;
                    }
        break;
    case 77:
        //RIGHT
        for (k = 0; k < 3; k++)
            for (i = 0; i < 4; i++)
                for (j = 0; j < 3; j++)
                    if (Table[i][j + 1] == 0)
                    {
                        Table[i][j + 1] = Table[i][j];
                        Table[i][j] = 0;
                    }
        break;
    case 80:
        //DOWN
        for (k = 0; k < 3; k++)
            for (i = 0; i < 3; i++)
                for (j = 0; j < 4; j++)
                    if (Table[i + 1][j] == 0)
                    {
                        Table[i + 1][j] = Table[i][j];
                        Table[i][j] = 0;
                    }
        break;
    }
}


int elaborateTable(int Table[4][4], int dir)
{
    int i, j, result[4][4];
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            result[i][j] = Table[i][j];
    moveNumbers(Table, dir);
    switch (dir)
    {
    case 72:
        //UP
        for (i = 0; i < 3; i++)
            for (j = 0; j < 4; j++)
                if (Table[i][j] == Table[i + 1][j])
                {
                    Table[i + 1][j] = 0;
                    Table[i][j] *= 2;
                    Score += Table[i][j];
                }
        break;
    case 75:
        //LEFT
        for (i = 0; i < 4; i++)
            for (j = 0; j < 3; j++)
                if (Table[i][j] == Table[i][j + 1])
                {
                    Table[i][j + 1] = 0;
                    Table[i][j] *= 2;
                    Score += Table[i][j];
                }
        break;
    case 77:
        //RIGHT
        for (i = 0; i < 4; i++)
            for (j = 3; j > 0; j--)
                if (Table[i][j] == Table[i][j - 1])
                {
                    Table[i][j - 1] = 0;
                    Table[i][j] *= 2;
                    Score += Table[i][j];
                }
        break;
    case 80:
        //DOWN
        for (i = 3; i > 0; i--)
            for (j = 0; j < 4; j++)
                if (Table[i][j] == Table[i - 1][j])
                {
                    Table[i - 1][j] = 0;
                    Table[i][j] *= 2;
                    Score += Table[i][j];
                }
        break;
    }
    moveNumbers(Table, dir);
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            if (result[i][j] != Table[i][j])
                return 1;
    return 0;
}


void initTable(int Table[4][4])
{
    int i, j, coord[2], initNumbers[2];
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            Table[i][j] = 0;
    initNumbers[0] = Random(1, 2) * 2;
    if (initNumbers[0] == 4)
        initNumbers[1] = 2;
    else
        initNumbers[1] = Random(1, 2) * 2;
    for (i = 0; i < 2; i++)
    {
        randomCoord(coord);
        if (Table[coord[0]][coord[1]] == 0)
            Table[coord[0]][coord[1]] = initNumbers[i];
        else
            i--;
    }
}


void printTable(int Table[4][4])
{
    int i, j;
    for (i = 0; i < 4; i++)
    {
        printf("|");
        for (j = 0; j < 4; j++)
        {
            if (Table[i][j] != 0)
            {
                printf("%4d", Table[i][j]);
                system("COLOR 00");
            }
            else
                printf("    ");
            printf("|");
        }
        printf("\n\n");
    }
    printf("Actual score: %d\n", Score);
}


int nextMove(int Table[4][4], int dir)
{
    if (elaborateTable(Table, dir))
        newNum(Table);
    else if (!isTableFree(Table) && !canMove(Table))
        return 1;
    printTable(Table);
    return 0;
}

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------



void color(int x){
	HANDLE hCon;
	hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hCon, x);
}

void stampa(int frase){

	
	if(frase == 1){
		
		color(15);printf("\t\t      .----------------.  .----------------.  .----------------.  .----------------. \n");
		printf("\t\t     | .--------------. || .--------------. || .--------------. || .--------------. | \n");
		printf("\t\t     | |    _____     | || |     ____     | || |   _    _     | || |     ____     | | \n");
		printf("\t\t     | |   / ___ `.   | || |   .'    '.   | || |  | |  | |    | || |   .' __ '.   | | \n");
		color(7);printf("\t\t     | |  |_/___) |   | || |  |  .--.  |  | || |  | |__| |_   | || |   | (__) |   | | \n");
		printf("\t\t     | |   .'____.'   | || |  | |    | |  | || |  |____   _|  | || |   .`____'.   | | \n");
		printf("\t\t     | |  / /____     | || |  |  `--'  |  | || |      _| |_   | || |  | (____) |  | | \n");
		printf("\t\t     | |  |_______|   | || |   '.____.'   | || |     |_____|  | || |  `.______.'  | | \n");
		color(8);printf("\t\t     | |              | || |              | || |              | || |              | | \n");
		printf("\t\t     | '--------------' || '--------------' || '--------------' || '--------------' | \n");
		printf("\t\t      '----------------'  '----------------'  '----------------'  '----------------' \n");	
		
	}else if(frase == 2){
		
		color(7);
		
		printf("\n\t\t\t\t\t    %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 218, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 191);
		printf("\t\t\t\t\t    %c  CI SI MUOVE CON LE FRECCIE  %c\n", 179, 179);	
		printf("\t\t\t\t\t    %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 192, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 217);
		
		
	}else if(frase == 3){
		
				
		printf("\n\t\t\t\t\t\t%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 218, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 191);
		printf("\t\t\t\t\t\t%c  PER RINIZIARE - 'R' %c\n", 179, 179);	
		printf("\t\t\t\t\t\t%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 192, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 217);
	
	}else if(frase == 4){
		
		color(15);
				
		printf("\n\t\t\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 218, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 191);
		printf("\t\t\t\t\t\t %c  PER USCIRE  - 'U' %c\n", 179, 179);	
		printf("\t\t\t\t\t\t %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 192, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 217);

	}else if(frase == 5){
		
		printf("\n\t\t\t\t\t   %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%C\n", 218, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 191);
		printf("\t\t\t\t\t   %c  PREMERE UN TASTO PER INIZIARE  %c\n", 179, 179);	
		printf("\t\t\t\t\t   %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%C\n", 192, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 217);
		
	}else{
		
		printf("\n\t\t\t\t\t\t   %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 218, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 191);
		printf("\t\t\t\t\t\t   %c  CARICAMENTO...  %c\n", 179, 179);	
		printf("\t\t\t\t\t\t   %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 192, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 217);
		
		
	}
	
}


int main(){
	
	int i, j, Table[4][4], dir, GameOver = 0, New = 0, cont;
	char s = -33;
	
	for(i = 0; i < 5; i++){
		stampa(i + 1);
	}
	
	printf("\t\t\t\t\t   ");
    getch();
    system("cls");
    stampa(1);
    color(7);
    stampa(999);
    printf("\t\t\t\t\t   ");
    color(2);
    
    for(i=0,j;i<36;i++)
    {
        printf("%c",s);
        j=i;
        if(i % 2 != 0 && i < 20){
            sleep(1);
        }

    }
    
    system("cls");
        
    do{
        New = 0;
        Score = 0;
        srand((unsigned int)time(0));
        clearScreen();
        initTable(Table);
        printTable(Table);
        do
        {
            do
            {
                dir = _getch();
                if (dir == 'n')
                    New = 1;
            } while (dir != directions[0] && dir != directions[1] && dir != directions[2] && dir != directions[3] && !New);
            if (!New)
            {
                clearScreen();
                GameOver = nextMove(Table, dir);
            }
        } while (!GameOver && !New);
        if (!New)
        {
            printf("GAME OVER!\n\nYour score is: %d\n", Score);
            system("PAUSE");
            printf("Continue? (Y/N)\n");
            cont = _getch();
        }
    }while (cont == 'y' || New);
    
    if (FOR_WINDOWS)
        system("PAUSE");
    return 0;
	
}

Scusate se non ci sono i commenti ma appunto voglio sistemare questa cosa prima di metterli.

Avete qualche idea ?

Spero possiate aiutarmi.

Grazie.

7 Risposte

Devi accedere o registrarti per scrivere nel forum
7 risposte