Advertisement
Luz_Azevedo

2048.2 - problemático

Jul 11th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define TAM 4
  6.  
  7. typedef struct
  8. {
  9.     int linha, coluna;
  10. } Posicao;
  11.  
  12. typedef struct
  13. {
  14.     int mat[TAM][TAM];
  15.     int maiorNum[1];
  16.     int menorNum[1];
  17. } Tabuleiro;
  18.  
  19. typedef struct
  20. {
  21.     char nome[3];
  22.     double tempo;
  23. } Player;
  24.  
  25. void removeEnter(char v[])
  26. {
  27.     int i;
  28.     for(i = 0; v[i] != '\0'; i++)
  29.         if(v[i] == '\n')
  30.         {
  31.             v[i] = '\0';    // substitui o '\n' por '\0'
  32.             break;
  33.         }
  34. }
  35.  
  36. //retorta 1 caso sejam iguais, 0 caso não
  37. int matrizesIguais(int mat1[][TAM], int mat2[][TAM])
  38. {
  39.     int i, j;
  40.     for(i = 0; i < TAM; i++)
  41.         for(j = 0; j < TAM; j++)
  42.             if(mat1[i][j] != mat2[i][j])
  43.                 return 0;
  44.     return 1;
  45. }
  46.  
  47. //retorta 1 caso sejam iguais, 0 caso não
  48. int stringsIguais(char v[], char s[])
  49. {
  50.     int i;
  51.     for(i = 0; v[i] != '\0' && s[i] != '\0'; i++)
  52.         if (v[i] != s[i])
  53.             return 0;
  54.     return 1;
  55. }
  56.  
  57. Tabuleiro atualizaTabuleiro(Tabuleiro tab, char opcao)
  58. {
  59.     int i, j, k;
  60.     switch(opcao)
  61.     {
  62.     case 'w':
  63.     case 'W':
  64.         for(j = 0; j < TAM ; j++)   //lê as colunas da esquerda para a direita
  65.         {
  66.             for(i = 0; i < TAM ; i++) //lê as linhas de cima para baixo
  67.             {
  68.                 if(!tab.mat[i][j])  //caso o elemento seja nulo
  69.                 {
  70.                     for(k = i + 1; k < TAM ; k++) //percorre aquela coluna ate achar um elemento nao-nulo
  71.                         if(tab.mat[k][j])
  72.                         {
  73.                             tab.mat[i][j] = tab.mat[k][j]; //coloca o elemento nao nulo no primeiro elemento nulo daquela coluna
  74.                             tab.mat[k][j] = 0;      //o lugar do elemento nao nulo torna-se nulo
  75.                             break;
  76.                         }
  77.                 }
  78.             }
  79.             for(i = 0; i < TAM - 1; i++) // soma os numeros caso eles sejam iguais
  80.             {
  81.                 if(tab.mat[i + 1][j] == tab.mat[i][j])
  82.                 {
  83.                     tab.mat[i][j] *= 2;
  84.                     for(k = i + 1; k < TAM - 1 && tab.mat[k + 1][j] != 0; k++)
  85.                         tab.mat[k][j] = tab.mat[k + 1][j];
  86.                     tab.mat[k][j] = 0;
  87.                 }
  88.             }
  89.         }
  90.  
  91.         break;
  92.  
  93.     case 'a':
  94.     case 'A':
  95.         for(i = 0; i < TAM ; i++)// lê as linhas de cima para baixo
  96.         {
  97.             for(j = 0; j < TAM ; j++)   //lê as colunas da esquerda para a direita
  98.             {
  99.                 if(!tab.mat[i][j])    //caso o elemento seja nulo
  100.                 {
  101.                     for(k = j + 1; k < TAM ; k++) //percorre aquela linha ate achar um elemento nao-nulo
  102.                         if(tab.mat[i][k])
  103.                         {
  104.                             tab.mat[i][j] = tab.mat[i][k];  //coloca o elemento nao nulo no primeiro elemento nulo daquela linha
  105.                             tab.mat[i][k] = 0;        //o lugar do elemento nao nulo torna-se nulo
  106.                             break;
  107.                         }
  108.                 }
  109.             }
  110.             for(j = 0; j < TAM - 1; j++)
  111.             {
  112.                 if(tab.mat[i][j + 1] == tab.mat[i][j])
  113.                 {
  114.                     tab.mat[i][j] *= 2;
  115.                     for(k = j + 1; k < TAM - 1 && tab.mat[i][k + 1] != 0; k++)
  116.                         tab.mat[i][k] = tab.mat[i][k + 1];
  117.                     tab.mat[i][k] = 0;
  118.                 }
  119.             }
  120.         }
  121.  
  122.         break;
  123.  
  124.     case 's':
  125.     case 'S':
  126.         for(j = 0; j < TAM ; j++)  //lê as colunas da esquerda para a direita
  127.         {
  128.             for(i = TAM - 1; i >= 0 ; i--)  //lê as linhas da baixo para cima
  129.             {
  130.                 if(!tab.mat[i][j])    //caso o elemento seja nulo
  131.                 {
  132.                     for(k = i - 1 ; k >= 0 ; k--) //percorre aquela coluna de baixo para cima ate achar um elemento nao-nulo
  133.                         if(tab.mat[k][j])
  134.                         {
  135.                             tab.mat[i][j] = tab.mat[k][j]; //coloca o elemento nao nulo no ultimo elemento nulo daquela coluna
  136.                             tab.mat[k][j] = 0;        //o lugar do elemento nao nulo torna-se nulo
  137.                             break;
  138.                         }
  139.                 }
  140.             }
  141.             for(i = TAM - 1; i > 0 ; i--)
  142.             {
  143.                 if(tab.mat[i - 1][j] == tab.mat[i][j])
  144.                 {
  145.                     tab.mat[i][j] *= 2;
  146.                     for(k = i - 1; k > 0 && tab.mat[k - 1][j] != 0; k--)
  147.                         tab.mat[k][j] = tab.mat[k - 1][j];
  148.                     tab.mat[k][j] = 0;
  149.                 }
  150.             }
  151.         }
  152.  
  153.         break;
  154.  
  155.     case 'd':
  156.     case 'D':
  157.         for(i = 0; i < TAM ; i++)  // lê as linhas de cima para baixo
  158.         {
  159.             for(j = TAM - 1; j >= 0 ; j--)  //lê as colunas da direita para a esquerda
  160.             {
  161.                 if(!tab.mat[i][j])    //caso o elemento seja nulo
  162.                 {
  163.                     for(k = j - 1; k >= 0; k--) //percorre aquela linha da direita para a esquerda ate achar um elemento nao-nulo
  164.                         if(tab.mat[i][k])
  165.                         {
  166.                             tab.mat[i][j] = tab.mat[i][k]; //coloca o elemento nao nulo no ultimo elemento nulo daquela linha
  167.                             tab.mat[i][k] = 0;        //o lugar do elemento nao nulo torna-se nulo
  168.                             break;
  169.                         }
  170.                 }
  171.             }
  172.             for(j = TAM - 1; j > 0 ; j--)
  173.             {
  174.                 if(tab.mat[i][j - 1] == tab.mat[i][j])
  175.                 {
  176.                     tab.mat[i][j] *= 2;
  177.                     for(k = j - 1; k > 0 && tab.mat[i][k - 1] != 0; k--)
  178.                         tab.mat[i][k] = tab.mat[i][k - 1];
  179.                     tab.mat[i][k] = 0;
  180.                 }
  181.             }
  182.         }
  183.  
  184.         break;
  185.     }
  186.     return tab;
  187. }
  188.  
  189. void imprimeTabuleiro(int mat[][TAM])
  190. {
  191.     printf("\n");
  192.     printf("\t\t16\n");
  193.     printf("\t       ======\n\n");
  194.     int i, j;
  195.     for(i = 0; i < TAM; i++)
  196.     {
  197.         printf("\t ");
  198.         for(j = 0; j < TAM; j++)
  199.             if (mat[i][j] != 0)
  200.             {
  201.                 printf("|%3d ", mat[i][j]);
  202.             }
  203.             else
  204.                 printf("|    ");
  205.         printf("|\n");
  206.     }
  207.     printf("\n\n");
  208.     printf("\t\t^\n");
  209.     printf("\t\tw\n");
  210.     printf("\t    <a     s>\n");
  211.     printf("\t\td\n");
  212.     printf("\t\tv");
  213. }
  214.  
  215.  
  216. //percorre a matriz até achar o maior e o menor numero dela
  217. Tabuleiro checaMaiorMenor(Tabuleiro tab)
  218. {
  219.     int i, j;
  220.     tab.maiorNum[0] = 0;
  221.     tab.menorNum[0] = 0;
  222.     for(i = 0; i < TAM; i++)
  223.     {
  224.         for(j = 0; j < TAM; j++)
  225.         {
  226.             if (tab.maiorNum[0] < tab.mat[i][j])
  227.                 tab.maiorNum[0] = tab.mat[i][j];
  228.             if (tab.menorNum[0] > tab.mat[i][j])
  229.                 tab.menorNum[0] = tab.mat[i][j];
  230.         }
  231.     }
  232.     return tab;
  233. }
  234.  
  235. Tabuleiro jogo()
  236. {
  237.     Tabuleiro tab, controle, controle1; //variavel do tabuleiro e duas variaveis de controle para comparação
  238.     char direcao; //direção de rotação do tabuleiro escolhida pelo jogador
  239.  
  240.     //variaveis auxiliares
  241.     int novoNum;
  242.     int i, j;
  243.     Posicao posicao;
  244.  
  245.     srand(time(NULL));
  246.  
  247.  
  248.     //preenche o tabuleiro com 0
  249.     for(i = 0; i < TAM; i++)
  250.     {
  251.         for(j = 0; j < TAM; j++)
  252.         {
  253.             tab.mat[i][j] = 0;
  254.         }
  255.     }
  256.     controle = tab;
  257.  
  258.     /*
  259.  
  260.         Creio que o problema está nesse próximo do-while
  261.         quando o tabuleiro está cheio, ao invés de ele simplesmente sair do do-while
  262.         e dar game over ele trava e fica parado aqui mesmo
  263.  
  264.         */
  265.     do
  266.     {
  267.         tab = checaMaiorMenor(tab);
  268.  
  269.         //gera um 2 ou um 4 para colocar no tabuleiro
  270.         novoNum = rand() % 2 + 1;
  271.         novoNum *= 2;
  272.  
  273.         //procura uma posição nula aleatória para armazenar o novo numero gerado
  274.         if (tab.menorNum[0] == 0)
  275.         {
  276.             do
  277.             {
  278.                 posicao.linha = rand() % TAM;
  279.                 posicao.coluna = rand() % TAM;
  280.             }
  281.             while(tab.mat[posicao.linha][posicao.coluna]);
  282.         }
  283.         tab.mat[posicao.linha][posicao.coluna] = novoNum;
  284.  
  285.  
  286.         printf("\n\n");
  287.         system("cls");
  288.         imprimeTabuleiro(tab.mat);
  289.  
  290.         controle = tab;
  291.         do
  292.         {
  293.             scanf("%c%*c", &direcao);
  294.             while(direcao != 'w' && direcao != 'a' && direcao != 's' && direcao != 'd' && direcao != 'W' && direcao != 'A' && direcao != 'S' && direcao != 'D')
  295.             {
  296.                 scanf("%c%*c", &direcao);
  297.             }
  298.             tab = atualizaTabuleiro(tab, direcao);
  299.  
  300.             //rotaciona controle1 para verificar se existe algum movimento possivel
  301.             controle1 = tab;
  302.             controle1 = atualizaTabuleiro(controle1, 'w');
  303.             controle1 = atualizaTabuleiro(controle1, 'a');
  304.             controle1 = atualizaTabuleiro(controle1, 's');
  305.             controle1 = atualizaTabuleiro(controle1, 'd');
  306.  
  307.         }
  308.         //faz tudo isso enquanto há movimentos possíveis e a movimentação não mudar o tabuleiro
  309.         //(ex.: a pessoa aperta w 500x mesmo não existindo mais nenhum movimento apertando a tecla w)
  310.         while(matrizesIguais(tab.mat, controle.mat) && !(matrizesIguais(tab.mat, controle1.mat)));
  311.  
  312.  
  313.         //imprime o novo tabuleiro rotacionado
  314.         system("cls");
  315.         imprimeTabuleiro(tab.mat);
  316.         tab = checaMaiorMenor(tab);
  317.     }
  318.     //verifica se a pessoa terminou o jogo ou se não há mais movimentos possíveis
  319.     while(tab.maiorNum[0] < 16 && tab.menorNum[0] == 0);
  320.     system("cls");
  321.     return tab;
  322. }
  323.  
  324. void salvaRank(Player player[], double tempo_de_cpu)
  325. {
  326.     FILE *ranking;
  327.     int i, j, numJogadores, aux;
  328.  
  329.     for(numJogadores = 0; player[numJogadores].tempo != -1 ; numJogadores++);// conta o numero de nomes que ja foram salvos
  330.  
  331.     //caso o numero de jogadores no rank ja seja maximo e o tempo da pessoa foi maior que o ultimo colocado
  332.     if(numJogadores == 5 && tempo_de_cpu > player[5].tempo)
  333.         return;
  334.  
  335.     //adiciona o player na sua posição no board já ordenado
  336.     aux = 1;
  337.     for(i = 0; i < numJogadores; i++)
  338.         if(tempo_de_cpu < player[i].tempo)
  339.             for(j = numJogadores; j > i; j--)
  340.             {
  341.                 if(j < 5)
  342.                     player[j] = player[j - 1];
  343.  
  344.                 printf("\n\n\tDigite 3 letras: ");
  345.                 fgets(player[i].nome, 4, stdin);
  346.                 player[i].tempo = tempo_de_cpu;
  347.                 aux = 0;
  348.                 numJogadores++;
  349.                 break;
  350.             }
  351.     //caso o nome da pessoa não tenha sido adicionado, coloca-o em ultimo
  352.     if(aux)
  353.     {
  354.         printf("\n\n\tDigite 3 letras: ");
  355.         fgets(player[i].nome, 4, stdin);
  356.         player[i].tempo = tempo_de_cpu;
  357.         numJogadores++;
  358.     }
  359.    
  360.     //salva o novo board de ranking no .txt
  361.     ranking = fopen("Ranking.txt", "w");
  362.     if(ranking == NULL)
  363.     {
  364.         system("cls");
  365.         printf("Erro");
  366.         system("pause");
  367.         exit(-1);
  368.     }
  369.  
  370.  
  371.     for(i = 0; i < numJogadores && i < 5; i++)
  372.     {
  373.         fprintf(ranking, "%s\n", player[i].nome);
  374.         fprintf(ranking, "%lf\n", player[i].tempo);
  375.     }
  376. }
  377.  
  378. void imprimeRank(Player player[])
  379. {
  380.     //imprime o ranking atual
  381.     int i;
  382.     system("cls");
  383.     printf("\n\n\t\t  16\n");
  384.     printf("\t         ======\n\n");
  385.     printf("\t      FIM DE JOGO!\n");
  386.     printf("\t     ==============\n\n");
  387.     printf("\n\t\tRANKING:\n");
  388.     printf("\t       ==========\n\n");
  389.     printf("\tLUGAR     NOME      TEMPO\n");
  390.     for(i = 0; i < 5; i++)
  391.     {
  392.         if(player[i].tempo < 0)
  393.             break;
  394.         printf("\t");
  395.         printf("   %d      %-10s   ", i + 1, player[i].nome);
  396.         printf("%-10.3lf", player[i].tempo);
  397.         printf("\n");
  398.     }
  399. }
  400.  
  401. void rank(Player player[])
  402. {
  403.     /*
  404.    
  405.     Talvez o outro erro que mencionei esteja aqui, não faço ideia tho, deem uma olhada por essas funções de ranking
  406.     a logica delas é meio estranha, entao se precisarem que eu explique, só me chamar
  407.    
  408.     */
  409.     // abre e coleta os dados no .txt
  410.     int i, aux;
  411.     FILE *ranking;
  412.     ranking = fopen("Ranking.txt", "a");
  413.  
  414.     if(ranking == NULL)
  415.     {
  416.         system("cls");
  417.         printf("Erro");
  418.         system("pause");
  419.         exit(-1);
  420.     }
  421.     fprintf(ranking, "\n%c", EOF);
  422.     fclose(ranking);
  423.     ranking = fopen("Ranking.txt", "r");
  424.     if(ranking == NULL)
  425.     {
  426.         system("cls");
  427.         printf("Erro");
  428.         system("pause");
  429.         exit(-1);
  430.     }
  431.  
  432.     for(i = 0; i < 5 ; i++)
  433.         player[i].tempo = -1;
  434.  
  435.     for (i = 0; i < 5 && (aux = fgetc(ranking)) != EOF; i++)
  436.     {
  437.         fgets(player[i].nome, 5, ranking);
  438.         fscanf(ranking, "%lf", &player[i].tempo);
  439.     }
  440. }
  441.  
  442. int main(int argc, char** argv)
  443. {
  444.     Tabuleiro tab;
  445.     clock_t inicio, fim;
  446.     double tempo_de_cpu;
  447.     Player player[5];
  448.    
  449.     //conta o tempo de jogo
  450.     inicio = clock();
  451.  
  452.     tab = jogo();
  453.  
  454.     fim  = clock();
  455.     tempo_de_cpu = ((double)(fim - inicio)) / CLOCKS_PER_SEC;
  456.  
  457.  
  458.     //chama as funções de exibição de fim de jogo
  459.     if(tab.maiorNum[0] == 16)
  460.     {
  461.         rank(player);
  462.         salvaRank(player, tempo_de_cpu);
  463.         imprimeRank(player);
  464.     }
  465.     else
  466.         imprimeRank(player);
  467.     return 0;
  468. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement