Advertisement
Luz_Azevedo

2048.1 - problematico

Jul 11th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.54 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. void removeEnter(char v[])
  20. {
  21.     int i;
  22.     for(i = 0; v[i] != '\0'; i++)
  23.         if(v[i] == '\n')
  24.         {
  25.             v[i] = '\0';    // substitui o '\n' por '\0'
  26.             break;
  27.         }
  28. }
  29.  
  30. //retorta 1 caso sejam iguais, 0 caso não
  31. int matrizesIguais(int mat1[][TAM], int mat2[][TAM])
  32. {
  33.     int i, j;
  34.     for(i = 0; i < TAM; i++)
  35.         for(j = 0; j < TAM; j++)
  36.             if(mat1[i][j] != mat2[i][j])
  37.                 return 0;
  38.     return 1;
  39. }
  40.  
  41. //retorta 1 caso sejam iguais, 0 caso não
  42. int stringsIguais(char v[], char s[])
  43. {
  44.     int i;
  45.     for(i = 0; v[i] != '\0' && s[i] != '\0'; i++)
  46.         if (v[i] != s[i])
  47.             return 0;
  48.     return 1;
  49. }
  50.  
  51. Tabuleiro atualizaTabuleiro(Tabuleiro tab, char opcao)
  52. {
  53.     int i, j, k;
  54.     switch(opcao)
  55.     {
  56.     case 'w':
  57.     case 'W':
  58.         for(j = 0; j < TAM ; j++)   //lê as colunas da esquerda para a direita
  59.         {
  60.             for(i = 0; i < TAM ; i++) //lê as linhas de cima para baixo
  61.             {
  62.                 if(!tab.mat[i][j])  //caso o elemento seja nulo
  63.                 {
  64.                     for(k = i + 1; k < TAM ; k++) //percorre aquela coluna ate achar um elemento nao-nulo
  65.                         if(tab.mat[k][j])
  66.                         {
  67.                             tab.mat[i][j] = tab.mat[k][j]; //coloca o elemento nao nulo no primeiro elemento nulo daquela coluna
  68.                             tab.mat[k][j] = 0;      //o lugar do elemento nao nulo torna-se nulo
  69.                             break;
  70.                         }
  71.                 }
  72.             }
  73.             for(i = 0; i < TAM - 1; i++) // soma os numeros caso eles sejam iguais
  74.             {
  75.                 if(tab.mat[i + 1][j] == tab.mat[i][j])
  76.                 {
  77.                     tab.mat[i][j] *= 2;
  78.                     for(k = i + 1; k < TAM - 1 && tab.mat[k + 1][j] != 0; k++)
  79.                         tab.mat[k][j] = tab.mat[k + 1][j];
  80.                     tab.mat[k][j] = 0;
  81.                 }
  82.             }
  83.         }
  84.  
  85.         break;
  86.  
  87.     case 'a':
  88.     case 'A':
  89.         for(i = 0; i < TAM ; i++)// lê as linhas de cima para baixo
  90.         {
  91.             for(j = 0; j < TAM ; j++)   //lê as colunas da esquerda para a direita
  92.             {
  93.                 if(!tab.mat[i][j])    //caso o elemento seja nulo
  94.                 {
  95.                     for(k = j + 1; k < TAM ; k++) //percorre aquela linha ate achar um elemento nao-nulo
  96.                         if(tab.mat[i][k])
  97.                         {
  98.                             tab.mat[i][j] = tab.mat[i][k];  //coloca o elemento nao nulo no primeiro elemento nulo daquela linha
  99.                             tab.mat[i][k] = 0;        //o lugar do elemento nao nulo torna-se nulo
  100.                             break;
  101.                         }
  102.                 }
  103.             }
  104.             for(j = 0; j < TAM - 1; j++)
  105.             {
  106.                 if(tab.mat[i][j + 1] == tab.mat[i][j])
  107.                 {
  108.                     tab.mat[i][j] *= 2;
  109.                     for(k = j + 1; k < TAM - 1 && tab.mat[i][k + 1] != 0; k++)
  110.                         tab.mat[i][k] = tab.mat[i][k + 1];
  111.                     tab.mat[i][k] = 0;
  112.                 }
  113.             }
  114.         }
  115.  
  116.         break;
  117.  
  118.     case 's':
  119.     case 'S':
  120.         for(j = 0; j < TAM ; j++)  //lê as colunas da esquerda para a direita
  121.         {
  122.             for(i = TAM - 1; i >= 0 ; i--)  //lê as linhas da baixo para cima
  123.             {
  124.                 if(!tab.mat[i][j])    //caso o elemento seja nulo
  125.                 {
  126.                     for(k = i - 1 ; k >= 0 ; k--) //percorre aquela coluna de baixo para cima ate achar um elemento nao-nulo
  127.                         if(tab.mat[k][j])
  128.                         {
  129.                             tab.mat[i][j] = tab.mat[k][j]; //coloca o elemento nao nulo no ultimo elemento nulo daquela coluna
  130.                             tab.mat[k][j] = 0;        //o lugar do elemento nao nulo torna-se nulo
  131.                             break;
  132.                         }
  133.                 }
  134.             }
  135.             for(i = TAM - 1; i > 0 ; i--)
  136.             {
  137.                 if(tab.mat[i - 1][j] == tab.mat[i][j])
  138.                 {
  139.                     tab.mat[i][j] *= 2;
  140.                     for(k = i - 1; k > 0 && tab.mat[k - 1][j] != 0; k--)
  141.                         tab.mat[k][j] = tab.mat[k - 1][j];
  142.                     tab.mat[k][j] = 0;
  143.                 }
  144.             }
  145.         }
  146.  
  147.         break;
  148.  
  149.     case 'd':
  150.     case 'D':
  151.         for(i = 0; i < TAM ; i++)  // lê as linhas de cima para baixo
  152.         {
  153.             for(j = TAM - 1; j >= 0 ; j--)  //lê as colunas da direita para a esquerda
  154.             {
  155.                 if(!tab.mat[i][j])    //caso o elemento seja nulo
  156.                 {
  157.                     for(k = j - 1; k >= 0; k--) //percorre aquela linha da direita para a esquerda ate achar um elemento nao-nulo
  158.                         if(tab.mat[i][k])
  159.                         {
  160.                             tab.mat[i][j] = tab.mat[i][k]; //coloca o elemento nao nulo no ultimo elemento nulo daquela linha
  161.                             tab.mat[i][k] = 0;        //o lugar do elemento nao nulo torna-se nulo
  162.                             break;
  163.                         }
  164.                 }
  165.             }
  166.             for(j = TAM - 1; j > 0 ; j--)
  167.             {
  168.                 if(tab.mat[i][j - 1] == tab.mat[i][j])
  169.                 {
  170.                     tab.mat[i][j] *= 2;
  171.                     for(k = j - 1; k > 0 && tab.mat[i][k - 1] != 0; k--)
  172.                         tab.mat[i][k] = tab.mat[i][k - 1];
  173.                     tab.mat[i][k] = 0;
  174.                 }
  175.             }
  176.         }
  177.  
  178.         break;
  179.     }
  180.     return tab;
  181. }
  182.  
  183. void imprimeTabuleiro(int mat[][TAM])
  184. {
  185.     printf("\n");
  186.     printf("\t\t16\n");
  187.     printf("\t       ======\n\n");
  188.     int i, j;
  189.     for(i = 0; i < TAM; i++)
  190.     {
  191.         printf("\t ");
  192.         for(j = 0; j < TAM; j++)
  193.             if (mat[i][j] != 0)
  194.             {
  195.                 printf("|%3d ", mat[i][j]);
  196.             }
  197.             else
  198.                 printf("|    ");
  199.         printf("|\n");
  200.     }
  201.     printf("\n\n");
  202.     printf("\t\t^\n");
  203.     printf("\t\tw\n");
  204.     printf("\t    <a     s>\n");
  205.     printf("\t\td\n");
  206.     printf("\t\tv");
  207. }
  208.  
  209.  
  210. //percorre a matriz até achar o maior e o menor numero dela
  211. Tabuleiro checaMaiorMenor(Tabuleiro tab)
  212. {
  213.     int i, j;
  214.     tab.maiorNum[0] = 0;
  215.     tab.menorNum[0] = 0;
  216.     for(i = 0; i < TAM; i++)
  217.     {
  218.         for(j = 0; j < TAM; j++)
  219.         {
  220.             if (tab.maiorNum[0] < tab.mat[i][j])
  221.                 tab.maiorNum[0] = tab.mat[i][j];
  222.             if (tab.menorNum[0] > tab.mat[i][j])
  223.                 tab.menorNum[0] = tab.mat[i][j];
  224.         }
  225.     }
  226.     return tab;
  227. }
  228.  
  229. Tabuleiro jogo()
  230. {
  231.     Tabuleiro tab, controle, controle1; //variavel do tabuleiro e duas variaveis de controle para comparação
  232.     char direcao; //direção de rotação do tabuleiro escolhida pelo jogador
  233.  
  234.     //variaveis auxiliares
  235.     int novoNum;
  236.     int i, j;
  237.     Posicao posicao;
  238.  
  239.     srand(time(NULL));
  240.  
  241.  
  242.     //preenche o tabuleiro com 0
  243.     for(i = 0; i < TAM; i++)
  244.     {
  245.         for(j = 0; j < TAM; j++)
  246.         {
  247.             tab.mat[i][j] = 0;
  248.         }
  249.     }
  250.     controle = tab;
  251.  
  252.     /*
  253.  
  254.         Creio que o problema está nesse próximo do-while
  255.         quando o tabuleiro está cheio, ao invés de ele simplesmente sair do do-while
  256.         e dar game over ele trava e fica parado aqui mesmo
  257.  
  258.         */
  259.     do
  260.     {
  261.         tab = checaMaiorMenor(tab);
  262.  
  263.         //gera um 2 ou um 4 para colocar no tabuleiro
  264.         novoNum = rand() % 2 + 1;
  265.         novoNum *= 2;
  266.  
  267.         //procura uma posição nula aleatória para armazenar o novo numero gerado
  268.         if (tab.menorNum[0] == 0)
  269.         {
  270.             do
  271.             {
  272.                 posicao.linha = rand() % TAM;
  273.                 posicao.coluna = rand() % TAM;
  274.             }
  275.             while(tab.mat[posicao.linha][posicao.coluna]);
  276.         }
  277.         tab.mat[posicao.linha][posicao.coluna] = novoNum;
  278.  
  279.  
  280.         printf("\n\n");
  281.         system("cls");
  282.         imprimeTabuleiro(tab.mat);
  283.  
  284.         controle = tab;
  285.         do
  286.         {
  287.             scanf("%c%*c", &direcao);
  288.             while(direcao != 'w' && direcao != 'a' && direcao != 's' && direcao != 'd' && direcao != 'W' && direcao != 'A' && direcao != 'S' && direcao != 'D')
  289.             {
  290.                 scanf("%c%*c", &direcao);
  291.             }
  292.             tab = atualizaTabuleiro(tab, direcao);
  293.  
  294.             //rotaciona controle1 para verificar se existe algum movimento possivel
  295.             controle1 = tab;
  296.             controle1 = atualizaTabuleiro(controle1, 'w');
  297.             controle1 = atualizaTabuleiro(controle1, 'a');
  298.             controle1 = atualizaTabuleiro(controle1, 's');
  299.             controle1 = atualizaTabuleiro(controle1, 'd');
  300.  
  301.         }
  302.         //faz tudo isso enquanto há movimentos possíveis e a movimentação não mudar o tabuleiro
  303.         //(ex.: a pessoa aperta w 500x mesmo não existindo mais nenhum movimento apertando a tecla w)
  304.         while(matrizesIguais(tab.mat, controle.mat) && !(matrizesIguais(tab.mat, controle1.mat)));
  305.  
  306.  
  307.         //imprime o novo tabuleiro rotacionado
  308.         system("cls");
  309.         imprimeTabuleiro(tab.mat);
  310.         tab = checaMaiorMenor(tab);
  311.     }
  312.     //verifica se a pessoa terminou o jogo ou se não há mais movimentos possíveis
  313.     while(tab.maiorNum[0] < 16 && tab.menorNum[0] == 0);
  314.     system("cls");
  315.     return tab;
  316. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement