Jump to content
Lfelipe97

Problema em jogo 2048 C

Recommended Posts

Lfelipe97

Eai Galera, tenho um trabalho pra faculdade no qual devo fazer o jogo 2048 em C. Estou me matando com isso ja, o professor pediu que  o usuário pudesse  escolher  o tamanho do tabuleiro e com qual valor  o jogo iniciaria (2, 2ou4, 2,4 ou 8), ja fiz quase tudo mas na hora de compilar  o jogo e testar tem numeros que somem na hora da soma tipo tem um 32 e ele some, ja não sei mais o que fazer... Me ajudem!!!

 

Segue Codigo...

ps: é enorme rs


#include <cstdlib>
#include <stdio.h>
#include <time.h> //srand
#include <conio.c> //Cores
#include <fstream> //Arquivos
#include <iostream> //cin,cout


using namespace std;

//Var Global//
int conf_gameLC = 0, conf_gameScore = 0,conf_gameP = 0;
char player[20];
int lin,col,num = 2,tam = 4;
int LargTab = 24; //Largura do tabuleiro do jogo
int AlturaTab = 16; //Altura do tabuleiro do jogo
int boardGame[6][6] = { 0 };
int gameScore,WinGame = 2048;
bool Replay_jogo = false;


//Limpa Tela
void apaga()
{
system("cls");    
}

//Posições GOTO
void gotoXY(int column, int line)
{
    COORD coord;
    coord.X = column;
    coord.Y = line;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void showCur(bool CursorVisibility)
{
    /* HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursor = { 1, CursorVisibility };
    SetConsoleCursorInfo(handle, &cursor); */
}

//------------------------------------------------MENU---------------------------------------------------------------------------------------------
void Inicio()
{
        textcolor(10);
    printf("\n\n");
    printf("           222222222222222         000000000            444444444       888888888     \n"); Sleep(50);
    printf("          2:::::::::::::::22     00:::::::::00         4::::::::4     88:::::::::88   \n"); Sleep(50);
    printf("          2::::::222222:::::2  00:::::::::::::00      4:::::::::4   88:::::::::::::88 \n"); Sleep(50);
    printf("          2222222     2:::::2 0:::::::000:::::::0    4::::44::::4  8::::::88888::::::8\n"); Sleep(50);
    printf("                      2:::::2 0::::::0   0::::::0   4::::4 4::::4  8:::::8     8:::::8\n"); Sleep(50);
    printf("                      2:::::2 0:::::0     0:::::0  4::::4  4::::4  8:::::8     8:::::8\n"); Sleep(50);
    printf("                   2222::::2  0:::::0     0:::::0 4::::4   4::::4   8:::::88888:::::8 \n"); Sleep(50);
    printf("              22222::::::22   0:::::0 000 0:::::04::::444444::::444  8:::::::::::::8  \n"); Sleep(50);
    printf("            22::::::::222     0:::::0 000 0:::::04::::::::::::::::4 8:::::88888:::::8 \n"); Sleep(50);
    printf("           2:::::22222        0:::::0     0:::::04444444444:::::4448:::::8     8:::::8\n"); Sleep(50);
    printf("          2:::::2             0:::::0     0:::::0          4::::4  8:::::8     8:::::8\n"); Sleep(50);
    printf("          2:::::2             0::::::0   0::::::0          4::::4  8:::::8     8:::::8\n"); Sleep(50);
    printf("          2:::::2       2222220:::::::000:::::::0          4::::4  8::::::88888::::::8\n"); Sleep(50);
    printf("          2::::::2222222:::::2 00:::::::::::::00         44::::::44 88:::::::::::::88 \n"); Sleep(50);
    printf("          2::::::::::::::::::2   00:::::::::00           4::::::::4   88:::::::::88   \n"); Sleep(50);
    printf("          22222222222222222222     000000000             4444444444     888888888     \n"); Sleep(50);
    printf("\n"); Sleep(50); 
    
    textcolor(8);
    printf("\t\t\t\t\t\t\t\t\t\t\t By Luiz Felipe & Matheus.\n");
        textcolor(14);
        printf(" Digite seu nome: ");
        scanf("%[^\n]s",&player);
        
    textcolor(11);
    printf("\n Configuracoes do jogo:        \n");
    
    do{
    textcolor(15);
    printf("\n Numero de Linhas|Colunas desejado:    |    (1)4    |    (2)5    |    (3)6      | =  ");
    scanf("%d",&conf_gameLC);
        if (conf_gameLC >3 || conf_gameLC == 0)
        {
        textcolor(12);
        printf("\nPorfavor Informe um numero valido.");
        }
        }while (conf_gameLC >3 || conf_gameLC == 0);
    
        
        do{
            textcolor(3);
            printf("\n Pontuacao maxima desejada:    |    (1)512    |    (2)1024    |    (3)2048    |    (4)4096      | =  ");
            scanf("%d",&conf_gameScore);
                if (conf_gameScore >4 || conf_gameScore == 0)
                {
                    textcolor(12);
                    printf("\nPorfavor Informe um numero valido.");
                }
          }while (conf_gameScore >4 || conf_gameScore == 0);
    
            do{
                textcolor(5);
                printf("\n Pecas iniciais: |    (1)2    |    (2)2 ou 4    |    (3)2,4 ou 8      | =  ");
                scanf("%d",&conf_gameP);
                    if (conf_gameP >3 || conf_gameP == 0)
                    {
                    textcolor(12);
                    printf("\nPorfavor Informe um numero valido.");
                    }
               }while (conf_gameP >3 || conf_gameP == 0);
                
                showCur(true);
                apaga();
}

//------------------------------------------------RECEBE CONFIG.GAME------------------------------------------------------------------------------

void Conf_game()
{
    switch(conf_gameLC)  //Definindo Configuração do Jogo(Linha|Coluna)
    {
      case 1: LargTab = 24;
                AlturaTab = 16;
                tam = 4;
              break;
      case 2: LargTab = 30;
                AlturaTab = 20;
                tam = 5;
              break;
      case 3: LargTab = 36;
                AlturaTab = 24;
                tam = 6;
              break;
    }        
    
    switch(conf_gameScore) //Definindo Configuração do Jogo(Score)
    {
      case 1: WinGame = 512;
              break;
      case 2: WinGame = 1024;
              break;
      case 3: WinGame = 2048;
              break;
      case 4: WinGame = 4096;;
              break;
    }

    
    switch(conf_gameP) //Definindo Configuração do Jogo(Peças)
    {
      case 1: num = 2;
              break;
      case 2: srand(time(NULL));
                num = rand() % 4;
              
                  if (num > 2){
                      num = 4;
                  }else{
                      num = 2;
                  }
              break;
      case 3: srand(time(NULL));
                num = rand() % 8;
              
                  if (num > 5){
                      num = 8;
                  }else
                  if (num > 2){
                      num = 4;
                  }else{
                      num = 2;
                  }
              break;
    }        
}


//-----------------------------------------------CODIGO-JOGO-2048----------------------------------------------------------------------------------

void Mostra_Tabuleiro()
{
    for (int lin = 0; lin <= LargTab ; lin++) {
        for (int col = 0; col <= AlturaTab; col++) {
            if (col % 4 == 0) {
                gotoXY(lin + 1, col + 1);
                textcolor(8);
                printf("%c", 219);
            }

            else if (lin % 6 == 0) {
                gotoXY(lin + 1, col + 1);
                textcolor(8);
                printf("%c", 219);
            }

            else {
                textcolor(15);
                gotoXY(lin + 1, col + 1);
                printf("%c", 219);
            }
        }
    }
}


void Monta_Tabuleiro()
{
    Mostra_Tabuleiro();

    gameScore = 0;
    for (int lin = 0; lin < LargTab; lin++) {
        for (int col= 0; col < AlturaTab; col++) {
            boardGame[lin][col] = 0;
        }
    }
    
    srand(time(NULL));
    int rand_in[6];
    

    rand_in[0] = rand() % num;
    rand_in[1] = rand() % num;
    rand_in[2] = rand() % num;

    do {
        rand_in[3] = rand() % num;
        rand_in[4] = rand() % num;
        rand_in[5] = rand() % num;
    } while (rand_in[0] == rand_in[3] || rand_in[1] == rand_in[4]  || rand_in[2] == rand_in[5]);

    
    boardGame[rand_in[0]][rand_in[3]] = num;  //recebe numero de inicio
    boardGame[rand_in[1]][rand_in[4]] = num;
    boardGame[rand_in[2]][rand_in[5]] = num;
}

//Direção a-w-s-d
void ParaCima()
{
    for (col = 0; col < tam ; col++) {
        int t = 0;
        for (lin = 0; lin < tam ; lin++) {
            if (boardGame[lin][col] != 0) {
                boardGame[t][col] = boardGame[lin][col];
                t++;
            }
        }
        for (lin = t; lin < tam ; lin++) boardGame[lin][col] = 0;
    }

    for (col = 0; col < tam ; col++) {
        int t = 0;
        for (lin = 0; lin < tam ; lin++) {
            if (boardGame != 0) {
                if (boardGame[lin][col] == boardGame[lin + 1][col]) {
                    boardGame[t][col] = 2 * boardGame[lin][col];
                    gameScore += boardGame[t][col];
                    t++;
                    lin++;
                }
                else {
                    boardGame[t][col] = boardGame[lin][col];
                    t++;
                }
            }
        }
        for (lin = t; lin < tam ; lin++) boardGame[lin][col] = 0;
    }

}

void ParaBaixo()
{
    for (col = 0; col < tam ; col++) {
        int t = 5;
        for (lin = 5; lin >= 0; lin--) {
            if (boardGame[lin][col] != 0) {
                boardGame[t][col] = boardGame[lin][col];
                t--;
            }
        }
        for (lin = t; lin >= 0; lin--) boardGame[lin][col] = 0;
    }

    for (col = 0; col < tam ; col++) {
        int t = 5;
        for (lin = 5; lin >= 0; lin--) {
            if (boardGame != 0) {
                if (boardGame[lin][col] == boardGame[lin - 1][col]) {
                    boardGame[t][col] = 2 * boardGame[lin][col];
                    gameScore += boardGame[t][col];
                    t--;
                    lin--;
                }
                else {
                    boardGame[t][col] = boardGame[lin][col];
                    t--;
                }
            }
        }
        for (lin = t; lin >= 0; lin--) boardGame[lin][col] = 0;
    }
}

void ParaEsquerda()
{
    for (lin = 0; lin < tam ; lin++) {
        int t = 0;
        for (col = 0; col < tam ; col++) {
            if (boardGame[lin][col] != 0) {
                boardGame[lin][t] = boardGame[lin][col];
                t++;
            }
        }
        for (col = t; col < tam ; col++) boardGame[lin][col] = 0;
    }

    for (lin = 0; lin < tam ; lin++) {
        int t = 0;
        for (col = 0; col < tam ; col++) {
            if (boardGame[lin][col] != 0) {
                if (boardGame[lin][col] == boardGame[lin][col + 1]) {
                    boardGame[lin][t] = 2 * boardGame[lin][col];
                    gameScore += boardGame[lin][t];
                    col++;
                    t++;
                }
                else {
                    boardGame[lin][t] = boardGame[lin][col];
                    t++;
                }
            }
        }
        for (col = t; col < tam ; col++) boardGame[lin][col] = 0;
    }
}

void ParaDireita()
{
    for (lin = 0; lin < tam; lin++) {
        int t = 5;
        for (col = 5; col >= 0; col--) {
            if (boardGame[lin][col] != 0) {
                boardGame[lin][t] = boardGame[lin][col];
                t--;
            }
        }
        for (col = t; col >= 0; col--) boardGame[lin][col] = 0;
    }


    for (lin = 0; lin < tam ; lin++) {
        int t = 5;
        for (col = 5; col >= 0; col--) {
            if (boardGame[lin][col] != 0) {
                if (boardGame[lin][col] == boardGame[lin][col - 1]) {
                    boardGame[lin][t] = 2 * boardGame[lin][col];
                    gameScore += boardGame[lin][t];
                    col--;
                    t--;
                }
                else {
                    boardGame[lin][t] = boardGame[lin][col];
                    t--;
                }
            }
        }
        for (int col = t; col >= 0; col--) boardGame[lin][col] = 0;
    }
}


//Cor de fundo numeros...
void cor_numeros(int value)
{
    switch (value) {
    case 2:        textcolor(0);textbackground(15); break;
    case 4:        textcolor(0);textbackground(14); break;
    case 8:        textcolor(0);textbackground(13); break;
    case 16:    textcolor(0);textbackground(1); break;
    case 32:    textcolor(0);textbackground(11); break;
    case 64:    textcolor(0);textbackground(10); break;
    case 128:    textcolor(0);textbackground(9); break;
    case 256:    textcolor(0);textbackground(8); break;
    case 512:    textcolor(0);textbackground(7);break;
    case 1024:  textcolor(0);textbackground(6); break;
    case 2048:  textcolor(0);textbackground(5); break;
    case 4096:  textcolor(0);textbackground(4); break;
    case 8192:  textcolor(0);textbackground(3); break;
    case 16384: textcolor(0);textbackground(2); break;
    }
}


//Arquivos
void write_bestScore(int s)
{
    fstream fileScore;
    fileScore.open("score.txt", ios::out);
    fileScore << s;
    fileScore.close();
}

int bestScore()
{
    int score;
    fstream fileScore;
    fileScore.open("score.txt", ios::in);
    fileScore >> score;
    fileScore.close();
    return score;
}


//Tela do jogo
void Tela()
{
    if (gameScore > bestScore()) {
        write_bestScore(gameScore);
    }
    
//Instrucoes gotoXY
gotoXY(65, 2);    
textcolor(11);printf(" Jogador: ");
gotoXY(75, 2);    
textcolor(15);printf(player);
gotoXY(79, 5);    
textcolor(15);printf("Teclas");
gotoXY(80, 8);
textcolor(10);printf("A");
gotoXY(82, 7);
textcolor(14);printf("W");
gotoXY(84, 8);
textcolor(9);printf("D");
gotoXY(90, 8);
gotoXY(82, 9);
textcolor(13);printf("S");
gotoXY(77, 12);
textcolor(14);printf("< r > replay");
gotoXY(77, 14);
textcolor(12);printf("< x > sair!");
gotoXY(66, 16);
textcolor(11);printf("Best Score: %d", bestScore());


    for (lin = 3; lin <= LargTab; lin += 6) {
        for (col = 3; col <= AlturaTab; col += 4) {
            textcolor(15);
            gotoXY(lin, col); printf("%c%c%c%c", 219, 219, 219, 219);
            cor_numeros(boardGame[(col - 3) / 4][(lin - 3) / 6]);
            if (boardGame[(col - 3) / 4][(lin - 3) / 6] == 0) {
                textcolor(15);
                gotoXY(lin, col); printf("%c%c%c%c", 219, 219, 219, 219);
            }
            else if (boardGame[(col - 3) / 4][(lin - 3) / 6] < 100) {
                gotoXY(lin + 1, col); 
                printf("%d", boardGame[(col - 3) / 4][(lin - 3) / 6]);
            }
            else {
                gotoXY(lin, col);
                printf("%d", boardGame[(col - 3) / 4][(lin - 3) / 6]);
            }
        }
    }
    gotoXY(66, 3);
    textcolor(11);textbackground(0);
    printf("Score: ");
    textcolor(12);
    printf("%d", gameScore);
}

bool Zero_Matriz()
{
    for (lin = 0; lin < tam; lin++) {
        for (col = 0; col < tam; col++) {
            if (boardGame[lin][col] == 0) {
                return true;
            }
        }
    }
    return false;
}

//Proximos numeros
void num_tab()
{
    if (Zero_Matriz() == false) return;


    int x, y;
    srand(time(NULL));

    do {
        x = rand() % tam;
        y = rand() % tam;
    } while (boardGame[x][y] != 0);

    int s = rand() % 20;
    if (s > 17) boardGame[x][y] = 2;
    else boardGame[x][y] = num;
}

int boardCheck[6][6];

void creCheck()
{
    for (lin = 0; lin < tam; lin++) {
        for (col = 0; col < tam; col++) {
            boardCheck[lin][col] = boardGame[lin][col];
        }
    }
}

bool Movimento()
{
    for (lin = 0; lin < tam; lin++) {
        for (col = 0; col < tam; col++) {
            if (boardCheck[lin][col] != boardGame[lin][col]) return true;
        }
    }
    return false;
}

bool GameOver()
{
    if (Zero_Matriz() == false) {
        for (lin = 0; lin < tam ; lin++) {
            for (col = 0; col < tam ; col++) {
                if (boardGame[lin][col] == boardGame[lin][col + 1] || 
                    boardGame[lin][col] == boardGame[lin + 1][col]) return false;
            }
        }
    }
    else if (Zero_Matriz() == true) return false;
    return true;
}

//Arrumar
bool Ganhou()
{
        for (lin = 0; lin < tam ; lin++) {
            for (col = 0; col < tam ; col++) {
                if (boardGame[lin][col] == WinGame) return true;
                
            }
        }
    return false;    
}

int main()
{
    Inicio();
    Conf_game();
    Monta_Tabuleiro();

    while (true) {
        
        if (Replay_jogo == true) { //Replay jogo
            apaga();
            Inicio();
            Conf_game();
            Monta_Tabuleiro();
            Replay_jogo = false;
        }
        showCur(false);
        Tela();

        if (GameOver() == true) {
            gotoXY(68, 22);
            printf("GAME OVER!");
        }
        

    //Movimentação
    char tecla = getch();
    creCheck();

    if (tecla == 'w' || tecla == 'W') {
    ParaCima();
    }
        else if (tecla == 's' || tecla == 'S') {
            ParaBaixo();
        }
            else if (tecla == 'a' || tecla == 'A') {
                ParaEsquerda();
            }
                else if (tecla == 'd' || tecla == 'D') {
                    ParaDireita();
                }
                    else if (tecla == 'r' || tecla == 'R') {
                        Replay_jogo = true;
                    }
                        else if (tecla == 'x' || tecla == 'X') {
                            exit(true);
                        }
                        else continue;
    
        if (Ganhou() == true) {
        gotoXY(30, 10);
        textcolor(10);printf("voce GANHOU!!");
        }

        if (Movimento() == false) continue;
        num_tab();
}

    getch();

    return 0;
}

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

não percebi o problema. E favor explicar com clareza qual e o problema, algo que e esperado por uma pessoa que anda na universidade


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Pedro Meneses
1 hora atrás, HappyHippyHippo disse:

não percebi o problema. E favor explicar com clareza qual e o problema, algo que e esperado por uma pessoa que anda na universidade

Pelo que entendi, ele quer que o utilizador inicie o jogo com X tamanho do tabuleiro e X valor do jogo (2,2 / 2,4 / 2,8) , e ao fazer a soma??? dá um numero (32) e o numero desaparece 

Share this post


Link to post
Share on other sites
Lfelipe97
33 minutos atrás, Pedro Meneses disse:

Pelo que entendi, ele quer que o utilizador inicie o jogo com X tamanho do tabuleiro e X valor do jogo (2,2 / 2,4 / 2,8) , e ao fazer a soma??? dá um numero (32) e o numero desaparece 

Então, exatamente isso desculpe se nao fui claro.

 O erro acontece quando o usuário está jogando, ao apertar as teclas (a,s,d,w) o jogo deve somar as os números iguais certo? Ele faz isso mas chega uma hora que o numero digamos 32 some do tabuleiro,e deveria virar 64 mas isso nao acontece. Outro problema é quando o jogador ganha o jogo nao para...

Share this post


Link to post
Share on other sites
HappyHippyHippo

testei o código, (se bem que tive de dar umas marteladas no código para ele compilar sequer), e isso não parece estar bem a fazer os movimentos ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Lfelipe97
4 horas atrás, HappyHippyHippo disse:

testei o código, (se bem que tive de dar umas marteladas no código para ele compilar sequer), e isso não parece estar bem a fazer os movimentos ...

Haha, nao deve ter compilado pelo fato de ter que instalar a biblioteca conio, enfim, é exatamente nos movimentos que estou com problemas. Ja tentei de tudo

Share this post


Link to post
Share on other sites
HappyHippyHippo

se podes escolher o tamanho do tabuleiro, porque existem constantes cravadas no meio do código ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Lfelipe97
1 hora atrás, HappyHippyHippo disse:

se podes escolher o tamanho do tabuleiro, porque existem constantes cravadas no meio do código ?

Este é um dos meus problemas, só sei que ta difícil, preciso de 100% da nota, e estou a um mês nisso. Sobre as constantes você se refere a quais?

Share this post


Link to post
Share on other sites
Lfelipe97
1 hora atrás, HappyHippyHippo disse:

bem ... basta pesquisares pelo numero 5 ...

Oloco, agradeço nem tinha notado isso mudei para 0 comando para direita nao funciona mais... Vou dar uma revisada aqui vlw

Share this post


Link to post
Share on other sites
HappyHippyHippo

zero ?

olha bem para a pergunta que fiz : 

3 hours ago, HappyHippyHippo said:

se podes escolher o tamanho do tabuleiro, porque existem constantes cravadas no meio do código ?

 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Lfelipe97
21 minutos atrás, HappyHippyHippo disse:

zero ?

olha bem para a pergunta que fiz : 

 

Em alguns casos (para baixo, e direita) no lugar do 5 coloquei uma variável que recebe o valor la no caso, e no resto coloquei 0. Funcionou até agora muito obrigado.

 

Outro probleminha agora é que o professor pediu pra ter um arquivo que salve a pontuação, e faça um rank dos jogadores :'(

Share this post


Link to post
Share on other sites
HappyHippyHippo
13 hours ago, Lfelipe97 said:

Em alguns casos (para baixo, e direita) no lugar do 5 coloquei uma variável que recebe o valor la no caso, e no resto coloquei 0. Funcionou até agora muito obrigado.

vez como a pergunta que tinha feito tinha um sentido ?

13 hours ago, Lfelipe97 said:

Outro probleminha agora é que o professor pediu pra ter um arquivo que salve a pontuação, e faça um rank dos jogadores :'(

e ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.