Advertisement
Jvsierra

2048 em C

Apr 11th, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <time.h>
  5.  
  6. //2048
  7.  
  8. #define TAMANHO_MATRIZ 4
  9.  
  10. int matriz[TAMANHO_MATRIZ][TAMANHO_MATRIZ], score = 0, game_loop = 0;
  11.  
  12. //game_loop = 0 -> jogo rolando
  13. //game_loop = 1 -> jogador ganhou (formou um quadrado 2048)
  14. //game_loop = -1 -> jogador perdeu
  15.  
  16. char dir;
  17.  
  18. void botaZero();
  19. void iniciaMatriz();
  20. void imprimeMatriz();
  21. void gameLoop();
  22. int checaVitoriaDerrota();
  23. int checaColuna(int linha, int dir);
  24. int checaLinha(int coluna, int dir);
  25.  
  26. int main() {
  27.   srand(time(NULL));
  28.  
  29.   int res;
  30.  
  31.   printf("\n\n\t\t\t2048\t\t\t\t\n\n");
  32.  
  33.   botaZero();
  34.  
  35.   iniciaMatriz();
  36.  
  37.   imprimeMatriz();
  38.  
  39.   gameLoop();
  40.  
  41.   res = checaVitoriaDerrota();
  42.  
  43.   if (res == 1)
  44.     printf("Vc ganhou!\n");
  45.   else
  46.     printf("Derrota!\n");
  47.  
  48.   getch();
  49. }
  50.  
  51. void botaZero() {
  52.   int i, j;
  53.  
  54.   for (i = 0; i < TAMANHO_MATRIZ; i++) {
  55.     for (j = 0; j < TAMANHO_MATRIZ; j++) {
  56.       matriz[i][j] = 0;
  57.     }
  58.   }
  59. }
  60.  
  61. void iniciaMatriz() {
  62.   int i, linha, coluna;
  63.  
  64.   for (i = 0; i < 2; i++) {
  65.     do {
  66.       linha = rand() % 4;
  67.       coluna = rand() % 4;
  68.     } while (matriz[linha][coluna] != 0);
  69.  
  70.     matriz[linha][coluna] = 2;
  71.   }
  72. }
  73.  
  74. void gameLoop() {
  75.     int fim = 0, i, j, pos;
  76.  
  77.     fim = checaVitoriaDerrota();
  78.  
  79.     fflush(stdin);
  80.  
  81.     scanf("%c", & dir);
  82.  
  83.     while (fim == 0) {
  84.       if (dir == 'B' || dir == 'b') {
  85.         for (i = TAMANHO_MATRIZ - 1; i >= 0; i--) {
  86.           for (j = TAMANHO_MATRIZ - 1; j >= 0; j--) {
  87.             pos = checaLinha(i, 1);
  88.  
  89.             if (matriz[j][i] > 0) {
  90.               if (pos > j) {
  91.                 matriz[pos][i] = matriz[j][i];
  92.  
  93.                 matriz[j][i] = 0;
  94.  
  95.                 if (pos <= 2) {
  96.                   if (matriz[pos + 1][i] == matriz[pos][i]) {
  97.                       matriz[pos + 1][i] *= 2;
  98.                       matriz[pos][i] = 0;
  99.  
  100.                       score += matriz[pos + 1][i];
  101.                     }
  102.                   }
  103.                 } else {
  104.                   if (j <= 2) {
  105.                     if(matriz[j + 1][i] == matriz[j][i]) {
  106.                       matriz[j + 1][i] *= 2;
  107.                       matriz[j][i] = 0;
  108.  
  109.                       score += matriz[j + 1][i];
  110.                     }
  111.                   }
  112.                 }
  113.               }
  114.             }
  115.           }
  116.         }
  117.         else if(dir == 'C' || dir == 'c')
  118.         {
  119.          for(i = 0; i < TAMANHO_MATRIZ; i++)
  120.          {
  121.              for(j = 0; j < TAMANHO_MATRIZ; j++)
  122.              {
  123.                  pos = checaLinha(i, -1);
  124.  
  125.                  if (matriz[j][i] > 0) {
  126.                   if (pos < j && pos > -1) {
  127.                     matriz[pos][i] = matriz[j][i];
  128.  
  129.                     matriz[j][i] = 0;
  130.  
  131.                     if (pos > 0) {
  132.                       if (matriz[pos - 1][i] == matriz[pos][i]) {
  133.                           matriz[pos - 1][i] *= 2;
  134.                           matriz[pos][i] = 0;
  135.  
  136.                           score += matriz[pos - 1][i];
  137.                         }
  138.                       }
  139.                     } else {
  140.                       if (j > 0) {
  141.                         if(matriz[j - 1][i] == matriz[j][i]) {
  142.                           matriz[j - 1][i] *= 2;
  143.                           matriz[j][i] = 0;
  144.  
  145.                           score += matriz[j - 1][i];
  146.                         }
  147.                       }
  148.                     }
  149.                   }
  150.              }
  151.          }
  152.         }
  153.         else if(dir == 'D' || dir == 'd')
  154.         {
  155.             for(i = 0; i < TAMANHO_MATRIZ; i++)
  156.             {
  157.                 for(j = TAMANHO_MATRIZ - 1; j >= 0; j--)
  158.                 {
  159.                     pos = checaColuna(i, 1);
  160.  
  161.                     if(matriz[i][j] > 0)
  162.                     {
  163.                         if(pos > j)
  164.                         {
  165.                             matriz[i][pos] = matriz[i][j];
  166.                             matriz[i][j] = 0;
  167.  
  168.                             if(pos < 3)
  169.                             {
  170.                                 if(matriz[i][pos + 1] == matriz[i][pos])
  171.                                 {
  172.                                     matriz[i][pos + 1] *= 2;
  173.                                     matriz[i][pos] = 0;
  174.  
  175.                                     score += matriz[i][pos + 1];
  176.                                 }
  177.                             }
  178.  
  179.                         }
  180.                         else
  181.                         {
  182.                             if(j < 3)
  183.                             {
  184.                                 if(matriz[i][j + 1] == matriz[i][j])
  185.                                 {
  186.                                     matriz[i][j + 1] *= 2;
  187.                                     matriz[i][j] = 0;
  188.  
  189.                                     score += matriz[i][j + 1];
  190.                                 }
  191.                             }
  192.                         }
  193.                     }
  194.                 }
  195.             }
  196.         }
  197.         else if(dir == 'E' || dir == 'e')
  198.         {
  199.             for(i = 0; i < TAMANHO_MATRIZ; i++)
  200.             {
  201.                 for(j = 0; j < TAMANHO_MATRIZ; j++)
  202.                 {
  203.                     pos = checaColuna(i, -11);
  204.  
  205.                     if(matriz[i][j] > 0)
  206.                     {
  207.                         if(pos < j && pos > -1)
  208.                         {
  209.                             matriz[i][pos] = matriz[i][j];
  210.                             matriz[i][j] = 0;
  211.  
  212.                             if(pos > 0)
  213.                             {
  214.                                 if(matriz[i][pos - 1] == matriz[i][pos])
  215.                                 {
  216.                                     matriz[i][pos - 1] *= 2;
  217.                                     matriz[i][pos] = 0;
  218.  
  219.                                     score += matriz[i][pos - 1];
  220.                                 }
  221.                             }
  222.  
  223.                         }
  224.                         else
  225.                         {
  226.                             if(j > 0)
  227.                             {
  228.                                 if(matriz[i][j - 1] == matriz[i][j])
  229.                                 {
  230.                                     matriz[i][j - 1] *= 2;
  231.                                     matriz[i][j] = 0;
  232.  
  233.                                     score += matriz[i][j - 1];
  234.                                 }
  235.                             }
  236.                         }
  237.                     }
  238.                 }
  239.             }
  240.         }
  241.  
  242.         fim = checaVitoriaDerrota();
  243.  
  244.         if (fim == 0) {
  245.           do {
  246.             i = rand() % TAMANHO_MATRIZ;
  247.             j = rand() % TAMANHO_MATRIZ;
  248.           } while (matriz[i][j] != 0);
  249.  
  250.           matriz[i][j] = 2;
  251.  
  252.           imprimeMatriz();
  253.  
  254.           fflush(stdin);
  255.  
  256.           scanf("%c", & dir);
  257.         }
  258.       }
  259.     }
  260.  
  261.     void imprimeMatriz() {
  262.       int i, j;
  263.  
  264.       printf("\n\t\t\tSCORE:%d\t\t\n", score);
  265.  
  266.       for (i = 0; i < TAMANHO_MATRIZ; i++) {
  267.         for (j = 0; j < TAMANHO_MATRIZ; j++) {
  268.             if(matriz[i][j] == 0)
  269.                 printf("     .     ");
  270.             else
  271.                 printf("     %d     ", matriz[i][j]);
  272.         }
  273.         printf("\n\n");
  274.       }
  275.     }
  276.  
  277.     int checaVitoriaDerrota() {
  278.       int i, j, ret = 0, cont = 0;
  279.  
  280.       for (i = 0; i < TAMANHO_MATRIZ; i++) {
  281.         for (j = 0; j < TAMANHO_MATRIZ; j++) {
  282.           if (matriz[i][j] > 0) {
  283.             cont++;
  284.  
  285.             if (matriz[i][j] == 2048) {
  286.               ret = 1;
  287.               break;
  288.             }
  289.           }
  290.  
  291.         }
  292.       }
  293.  
  294.       if (cont == TAMANHO_MATRIZ * TAMANHO_MATRIZ)
  295.        ret = -1;
  296.  
  297.       return ret;
  298.     }
  299.  
  300.     int checaColuna(int linha, int dir) {
  301.       int i = 0, ret = -1;
  302.  
  303.       if (dir == 1) {
  304.         //direita
  305.         for (i = 0; i < TAMANHO_MATRIZ; i++) {
  306.           if (matriz[linha][i] == 0)
  307.             ret = i;
  308.         }
  309.       } else {
  310.         //esquerda
  311.         for (i = TAMANHO_MATRIZ - 1; i >= 0; i--) {
  312.           if (matriz[linha][i] == 0)
  313.             ret = i;
  314.         }
  315.       }
  316.  
  317.       return ret;
  318.     }
  319.  
  320.     int checaLinha(int coluna, int dir) {
  321.       int i, ret = -1;
  322.  
  323.       if (dir == 1) {
  324.         //'B'
  325.         for (i = 0; i < TAMANHO_MATRIZ; i++) {
  326.           if (matriz[i][coluna] == 0)
  327.             ret = i;
  328.         }
  329.       } else {
  330.         //'C'
  331.         for (i = TAMANHO_MATRIZ - 1; i >= 0; i--) {
  332.           if (matriz[i][coluna] == 0)
  333.             ret = i;
  334.         }
  335.       }
  336.  
  337.       return ret;
  338.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement