Advertisement
Jvsierra

Snake Ascii Version in C

Jul 4th, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <conio.h>
  5. #include <stdbool.h>
  6. #include <unistd.h>
  7. #include "meuconio.h"
  8.  
  9. #define TF 13
  10. #define C 72
  11. #define B 80
  12. #define D 77
  13. #define E 75
  14.  
  15. typedef struct cobra
  16. {
  17.     //variável que indicará se a cobra está "viva" (jogo acontecendo) ou morta (jogador perdeu)
  18.     bool viva;
  19.     //posicoes da cobra na matriz
  20.     int posicoesLinha[TF * TF];
  21.     int posicoesColuna[TF * TF];
  22.     //Variáveis que indicam o numero de \"partes" da cobra
  23.     int tlPosicoes;
  24.     //Variável que indica para qual direção a cobra está se movendo (1 - Cima 2 - Direita 3 - Baixo 4 - Esquerda)
  25.     int direcao;
  26.     int sentido[TF * TF];
  27. } Cobra;
  28.  
  29. unsigned int microseconds = 800000;
  30.  
  31. int matrizJogo[TF][TF], matrizAux[TF][TF], linhaComida, colunaComida;
  32. Cobra cobra;
  33.  
  34. void inicializaCobra();
  35. void inicializaMatriz();
  36. void imprimeMatriz();
  37. void gameLoop();
  38. void geraComidaCobra();
  39. void moveCobra();
  40. void imprimeLinhaTracos();
  41. void aumentaCobra();
  42. void atualizaMatriz();
  43. void imprimeInformacoes();
  44.  
  45. bool colide(int direcao);
  46. bool checaVitoria();
  47. bool colideComida(int direcao);
  48. bool colideCobra(int direcao);
  49. bool movimentoValido(int direcaoAtual, int direcaoAlvo);
  50.  
  51. int main()
  52. {
  53.     srand(time(NULL));
  54.  
  55.     gameLoop();
  56.  
  57.     getch();
  58. }
  59.  
  60. void inicializaCobra()
  61. {
  62.     cobra.viva = true;
  63.     cobra.tlPosicoes = 0;
  64.     cobra.posicoesLinha[0] = rand() % TF;
  65.     cobra.posicoesColuna[0] = rand() % TF;
  66. }
  67.  
  68. void inicializaMatriz()
  69. {
  70.     int i, j, direcao;
  71.  
  72.     //Preenche a matriz com zeros (que indicam posições vazias)
  73.     for(i = 0; i < TF; i++)
  74.     {
  75.         for(j = 0; j < TF; j++)
  76.         {
  77.             matrizJogo[i][j] = 0;
  78.             matrizAux[i][j] = 0;
  79.         }
  80.     }
  81.  
  82.     do
  83.     {
  84.         direcao = rand() % 4 + 1;
  85.     }while(colide(direcao) == true);
  86.  
  87.     cobra.direcao = direcao;
  88.  
  89.     cobra.sentido[cobra.tlPosicoes] = direcao;
  90.  
  91.     cobra.tlPosicoes++;
  92.  
  93.     geraComidaCobra();
  94. }
  95.  
  96. void gameLoop()
  97. {
  98.     int dirInt;
  99.     char dir;
  100.  
  101.     inicializaCobra();
  102.     inicializaMatriz();
  103.     imprimeMatriz();
  104.  
  105.     while(!checaVitoria() && cobra.viva == true)
  106.     {
  107.         MOVE_COBRA_AUTO: while(!kbhit() && cobra.viva == true)
  108.         {
  109.             if(colide(cobra.direcao))
  110.                 cobra.viva = false;
  111.             else if(colideCobra(cobra.direcao))
  112.                 cobra.viva = false;
  113.             else if(colideComida(cobra.direcao))
  114.             {
  115.                 aumentaCobra();
  116.                 geraComidaCobra();
  117.             }
  118.  
  119.             if(cobra.viva == true)
  120.                 moveCobra();
  121.  
  122.             imprimeMatriz();
  123.  
  124.             imprimeInformacoes();
  125.  
  126.             usleep(microseconds);
  127.         }
  128.  
  129.         if(cobra.viva == true)
  130.         {
  131.             dir = getch();
  132.  
  133.             if(dir == -32)
  134.             {
  135.                 dir = getch();
  136.  
  137.                 if(dir == C) dirInt = 1;
  138.                 else if(dir == D) dirInt = 2;
  139.                 else if(dir == B) dirInt = 3;
  140.                 else if(dir == E) dirInt = 4;
  141.  
  142.  
  143.                 if(dirInt != cobra.direcao && movimentoValido(cobra.direcao, dirInt))
  144.                 {
  145.                     cobra.direcao = dirInt;
  146.  
  147.                     if(colide(cobra.direcao))
  148.                         cobra.viva = false;
  149.                     else if(colideCobra(cobra.direcao))
  150.                         cobra.viva = false;
  151.                     else if(colideComida(cobra.direcao))
  152.                     {
  153.                         aumentaCobra();
  154.                         geraComidaCobra();
  155.                     }
  156.  
  157.                     if(cobra.viva == true)
  158.                         moveCobra();
  159.  
  160.                     imprimeMatriz();
  161.  
  162.                     imprimeInformacoes();
  163.  
  164.                     usleep(microseconds);
  165.                 }
  166.             }
  167.             else
  168.                 goto MOVE_COBRA_AUTO;
  169.         }
  170.     }
  171.  
  172.     if(cobra.viva == false)
  173.         printf("Voce perdeu!\n");
  174. }
  175.  
  176. void imprimeMatriz()
  177. {
  178.     int i, j;
  179.  
  180.     clrscr();
  181.  
  182.     imprimeLinhaTracos();
  183.  
  184.     for(i = 0; i < TF; i++)
  185.     {
  186.         for(j = 0; j < TF; j++)
  187.         {
  188.             textbackground(2);
  189.  
  190.             if(i == linhaComida && j == colunaComida)
  191.             {
  192.                 textcolor(0);
  193.                 if(matrizJogo[i][j] == 1)
  194.                     printf("*");
  195.                 else
  196.                     printf(".");
  197.             }
  198.             else
  199.             {
  200.                 if(matrizJogo[i][j] == 0)
  201.                     printf(" ");
  202.                 else if(matrizJogo[i][j] == 1)
  203.                 {
  204.                     textcolor(4);
  205.  
  206.                     if(matrizAux[i][j] == 1)
  207.                         printf("^");
  208.                     else if(matrizAux[i][j] == 2)
  209.                         printf(">");
  210.                     else if(matrizAux[i][j] == 3)
  211.                         printf("|");
  212.                     else
  213.                         printf("<");
  214.                 }
  215.             }
  216.  
  217.             textcolor(15);
  218.  
  219.             printf("|");
  220.  
  221.             textbackground(0);
  222.         }
  223.  
  224.         printf("\n");
  225.     }
  226.  
  227.     imprimeLinhaTracos();
  228. }
  229.  
  230. void geraComidaCobra()
  231. {
  232.     do
  233.     {
  234.         linhaComida = rand() % TF;
  235.         colunaComida = rand() % TF;
  236.     }while(matrizJogo[linhaComida][colunaComida] == 1);
  237. }
  238.  
  239. void imprimeLinhaTracos()
  240. {
  241.     int i;
  242.  
  243.     for(i = 1; i <= TF + 2; i++)
  244.         printf("--");
  245.  
  246.     printf("\n");
  247. }
  248.  
  249.  
  250. void moveCobra()
  251. {
  252.     int i, proximaLinha, proximaColuna;
  253.  
  254.     if(cobra.direcao == 1)
  255.     {
  256.         proximaLinha = cobra.posicoesLinha[0] - 1;
  257.         proximaColuna = cobra.posicoesColuna[0];
  258.     }
  259.     else if(cobra.direcao == 2)
  260.     {
  261.         proximaLinha = cobra.posicoesLinha[0];
  262.         proximaColuna = cobra.posicoesColuna[0] + 1;
  263.     }
  264.     else if(cobra.direcao == 3)
  265.     {
  266.         proximaLinha = cobra.posicoesLinha[0] + 1;
  267.         proximaColuna = cobra.posicoesColuna[0];
  268.     }
  269.     else if(cobra.direcao == 4)
  270.     {
  271.         proximaLinha = cobra.posicoesLinha[0];
  272.         proximaColuna = cobra.posicoesColuna[0] - 1;
  273.     }
  274.  
  275.     for(i = cobra.tlPosicoes; i > 0; i--)
  276.     {
  277.         matrizJogo[cobra.posicoesLinha[i]][cobra.posicoesColuna[i]] = 0;
  278.  
  279.         cobra.posicoesLinha[i] = cobra.posicoesLinha[i - 1];
  280.         cobra.posicoesColuna[i] = cobra.posicoesColuna[i - 1];
  281.  
  282.         cobra.sentido[i] = cobra.sentido[i - 1];
  283.     }
  284.  
  285.     matrizJogo[cobra.posicoesLinha[0]][cobra.posicoesColuna[0]] = 0;
  286.  
  287.     cobra.posicoesLinha[0] = proximaLinha;
  288.     cobra.posicoesColuna[0] = proximaColuna;
  289.     cobra.sentido[0] = cobra.direcao;
  290.  
  291.     matrizAux[proximaLinha][proximaColuna] = cobra.direcao;
  292.  
  293.     atualizaMatriz();
  294. }
  295.  
  296. void aumentaCobra()
  297. {
  298.     cobra.posicoesLinha[cobra.tlPosicoes] = cobra.posicoesLinha[cobra.tlPosicoes - 1] - 1;
  299.     cobra.posicoesColuna[cobra.tlPosicoes] = cobra.posicoesColuna[cobra.tlPosicoes - 1];
  300.  
  301.     cobra.sentido[cobra.tlPosicoes] = cobra.direcao;
  302.  
  303.     cobra.tlPosicoes = cobra.tlPosicoes + 1;
  304. }
  305.  
  306. bool colide(int direcao)
  307. {
  308.     if(direcao == 1)
  309.      {
  310.          if(cobra.posicoesLinha[0] == 0)
  311.             return true;
  312.  
  313.      }
  314.     else if(direcao == 2)
  315.     {
  316.         if(cobra.posicoesColuna[0] == TF - 1)
  317.             return true;
  318.     }
  319.     else if(direcao == 3)
  320.     {
  321.         if(cobra.posicoesLinha[0] == TF - 1)
  322.             return true;
  323.     }
  324.     else if(direcao == 4)
  325.     {
  326.         if(cobra.posicoesColuna[0] == 0)
  327.             return true;
  328.     }
  329.     return false;
  330. }
  331.  
  332. bool checaVitoria()
  333. {
  334.     int cont = 0, i, j;
  335.  
  336.     for(i = 0; i < TF; i++)
  337.         for(j = 0; j < TF; j++)
  338.             if(matrizJogo[i][j] == 1)
  339.                 cont++;
  340.  
  341.     if(cont == TF * TF)
  342.         return true;
  343.     else
  344.         return false;
  345. }
  346.  
  347. void atualizaMatriz()
  348. {
  349.     int i;
  350.  
  351.     for(i = 0; i < cobra.tlPosicoes; i++)
  352.     {
  353.         matrizJogo[cobra.posicoesLinha[i]][cobra.posicoesColuna[i]] = 1;
  354.         matrizAux[cobra.posicoesLinha[i]][cobra.posicoesColuna[i]] = cobra.sentido[i];
  355.     }
  356. }
  357.  
  358. bool colideComida(int direcao)
  359. {
  360.     if(direcao == 1)
  361.      {
  362.         if( (cobra.posicoesLinha[0] - 1 == linhaComida) && (cobra.posicoesColuna[0] == colunaComida))
  363.             return true;
  364.      }
  365.     else if(direcao == 2)
  366.     {
  367.         if( (cobra.posicoesLinha[0] == linhaComida) && (cobra.posicoesColuna[0] + 1 == colunaComida) )
  368.             return true;
  369.     }
  370.     else if(direcao == 3)
  371.     {
  372.         if( ( cobra.posicoesLinha[0] + 1 == linhaComida ) && ( cobra.posicoesColuna[0] == colunaComida) )
  373.             return true;
  374.     }
  375.     else if(direcao == 4)
  376.     {
  377.         if( (cobra.posicoesLinha[0] == linhaComida) && (cobra.posicoesColuna[0] - 1 == colunaComida))
  378.             return true;
  379.     }
  380.     return false;
  381. }
  382.  
  383. void imprimeInformacoes()
  384. {
  385.     printf("Linha: %d\n", cobra.posicoesLinha[0]);
  386.     printf("Coluna: %d\n", cobra.posicoesColuna[0]);
  387.     printf("Comida = (%d, %d)\n", linhaComida, colunaComida);
  388. }
  389.  
  390. bool colideCobra(int direcao)
  391. {
  392.     if(direcao == 1)
  393.     {
  394.         if(matrizJogo[cobra.posicoesLinha[0] - 1][cobra.posicoesColuna[0]] == 1)
  395.             return true;
  396.     }
  397.     else if(direcao == 2)
  398.     {
  399.         if(matrizJogo[cobra.posicoesLinha[0]][cobra.posicoesColuna[0] + 1] == 1)
  400.            return true;
  401.     }
  402.     else if(direcao == 3)
  403.     {
  404.         if(matrizJogo[cobra.posicoesLinha[0] + 1][cobra.posicoesColuna[0]])
  405.            return true;
  406.     }
  407.     else if(direcao == 4)
  408.     {
  409.         if(matrizJogo[cobra.posicoesLinha[0]][cobra.posicoesColuna[0] - 1])
  410.            return true;
  411.     }
  412.  
  413.     return false;
  414. }
  415.  
  416. bool movimentoValido(int direcaoAtual, int direcaoAlvo)
  417. {
  418.     if(cobra.tlPosicoes > 1)
  419.     {
  420.         if(direcaoAtual == 1 && direcaoAlvo == 3)
  421.             return false;
  422.         else if(direcaoAtual == 2 && direcaoAlvo == 4)
  423.             return false;
  424.         else if(direcaoAtual == 3 && direcaoAlvo == 1)
  425.             return false;
  426.         else if(direcaoAtual == 4 && direcaoAlvo == 2)
  427.             return false;
  428.     }
  429.  
  430.     return true;
  431. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement