Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <conio.h>
- #include <stdbool.h>
- #include <unistd.h>
- #include "meuconio.h"
- #define TF 13
- #define C 72
- #define B 80
- #define D 77
- #define E 75
- typedef struct cobra
- {
- //variável que indicará se a cobra está "viva" (jogo acontecendo) ou morta (jogador perdeu)
- bool viva;
- //posicoes da cobra na matriz
- int posicoesLinha[TF * TF];
- int posicoesColuna[TF * TF];
- //Variáveis que indicam o numero de \"partes" da cobra
- int tlPosicoes;
- //Variável que indica para qual direção a cobra está se movendo (1 - Cima 2 - Direita 3 - Baixo 4 - Esquerda)
- int direcao;
- int sentido[TF * TF];
- } Cobra;
- unsigned int microseconds = 800000;
- int matrizJogo[TF][TF], matrizAux[TF][TF], linhaComida, colunaComida;
- Cobra cobra;
- void inicializaCobra();
- void inicializaMatriz();
- void imprimeMatriz();
- void gameLoop();
- void geraComidaCobra();
- void moveCobra();
- void imprimeLinhaTracos();
- void aumentaCobra();
- void atualizaMatriz();
- void imprimeInformacoes();
- bool colide(int direcao);
- bool checaVitoria();
- bool colideComida(int direcao);
- bool colideCobra(int direcao);
- bool movimentoValido(int direcaoAtual, int direcaoAlvo);
- int main()
- {
- srand(time(NULL));
- gameLoop();
- getch();
- }
- void inicializaCobra()
- {
- cobra.viva = true;
- cobra.tlPosicoes = 0;
- cobra.posicoesLinha[0] = rand() % TF;
- cobra.posicoesColuna[0] = rand() % TF;
- }
- void inicializaMatriz()
- {
- int i, j, direcao;
- //Preenche a matriz com zeros (que indicam posições vazias)
- for(i = 0; i < TF; i++)
- {
- for(j = 0; j < TF; j++)
- {
- matrizJogo[i][j] = 0;
- matrizAux[i][j] = 0;
- }
- }
- do
- {
- direcao = rand() % 4 + 1;
- }while(colide(direcao) == true);
- cobra.direcao = direcao;
- cobra.sentido[cobra.tlPosicoes] = direcao;
- cobra.tlPosicoes++;
- geraComidaCobra();
- }
- void gameLoop()
- {
- int dirInt;
- char dir;
- inicializaCobra();
- inicializaMatriz();
- imprimeMatriz();
- while(!checaVitoria() && cobra.viva == true)
- {
- MOVE_COBRA_AUTO: while(!kbhit() && cobra.viva == true)
- {
- if(colide(cobra.direcao))
- cobra.viva = false;
- else if(colideCobra(cobra.direcao))
- cobra.viva = false;
- else if(colideComida(cobra.direcao))
- {
- aumentaCobra();
- geraComidaCobra();
- }
- if(cobra.viva == true)
- moveCobra();
- imprimeMatriz();
- imprimeInformacoes();
- usleep(microseconds);
- }
- if(cobra.viva == true)
- {
- dir = getch();
- if(dir == -32)
- {
- dir = getch();
- if(dir == C) dirInt = 1;
- else if(dir == D) dirInt = 2;
- else if(dir == B) dirInt = 3;
- else if(dir == E) dirInt = 4;
- if(dirInt != cobra.direcao && movimentoValido(cobra.direcao, dirInt))
- {
- cobra.direcao = dirInt;
- if(colide(cobra.direcao))
- cobra.viva = false;
- else if(colideCobra(cobra.direcao))
- cobra.viva = false;
- else if(colideComida(cobra.direcao))
- {
- aumentaCobra();
- geraComidaCobra();
- }
- if(cobra.viva == true)
- moveCobra();
- imprimeMatriz();
- imprimeInformacoes();
- usleep(microseconds);
- }
- }
- else
- goto MOVE_COBRA_AUTO;
- }
- }
- if(cobra.viva == false)
- printf("Voce perdeu!\n");
- }
- void imprimeMatriz()
- {
- int i, j;
- clrscr();
- imprimeLinhaTracos();
- for(i = 0; i < TF; i++)
- {
- for(j = 0; j < TF; j++)
- {
- textbackground(2);
- if(i == linhaComida && j == colunaComida)
- {
- textcolor(0);
- if(matrizJogo[i][j] == 1)
- printf("*");
- else
- printf(".");
- }
- else
- {
- if(matrizJogo[i][j] == 0)
- printf(" ");
- else if(matrizJogo[i][j] == 1)
- {
- textcolor(4);
- if(matrizAux[i][j] == 1)
- printf("^");
- else if(matrizAux[i][j] == 2)
- printf(">");
- else if(matrizAux[i][j] == 3)
- printf("|");
- else
- printf("<");
- }
- }
- textcolor(15);
- printf("|");
- textbackground(0);
- }
- printf("\n");
- }
- imprimeLinhaTracos();
- }
- void geraComidaCobra()
- {
- do
- {
- linhaComida = rand() % TF;
- colunaComida = rand() % TF;
- }while(matrizJogo[linhaComida][colunaComida] == 1);
- }
- void imprimeLinhaTracos()
- {
- int i;
- for(i = 1; i <= TF + 2; i++)
- printf("--");
- printf("\n");
- }
- void moveCobra()
- {
- int i, proximaLinha, proximaColuna;
- if(cobra.direcao == 1)
- {
- proximaLinha = cobra.posicoesLinha[0] - 1;
- proximaColuna = cobra.posicoesColuna[0];
- }
- else if(cobra.direcao == 2)
- {
- proximaLinha = cobra.posicoesLinha[0];
- proximaColuna = cobra.posicoesColuna[0] + 1;
- }
- else if(cobra.direcao == 3)
- {
- proximaLinha = cobra.posicoesLinha[0] + 1;
- proximaColuna = cobra.posicoesColuna[0];
- }
- else if(cobra.direcao == 4)
- {
- proximaLinha = cobra.posicoesLinha[0];
- proximaColuna = cobra.posicoesColuna[0] - 1;
- }
- for(i = cobra.tlPosicoes; i > 0; i--)
- {
- matrizJogo[cobra.posicoesLinha[i]][cobra.posicoesColuna[i]] = 0;
- cobra.posicoesLinha[i] = cobra.posicoesLinha[i - 1];
- cobra.posicoesColuna[i] = cobra.posicoesColuna[i - 1];
- cobra.sentido[i] = cobra.sentido[i - 1];
- }
- matrizJogo[cobra.posicoesLinha[0]][cobra.posicoesColuna[0]] = 0;
- cobra.posicoesLinha[0] = proximaLinha;
- cobra.posicoesColuna[0] = proximaColuna;
- cobra.sentido[0] = cobra.direcao;
- matrizAux[proximaLinha][proximaColuna] = cobra.direcao;
- atualizaMatriz();
- }
- void aumentaCobra()
- {
- cobra.posicoesLinha[cobra.tlPosicoes] = cobra.posicoesLinha[cobra.tlPosicoes - 1] - 1;
- cobra.posicoesColuna[cobra.tlPosicoes] = cobra.posicoesColuna[cobra.tlPosicoes - 1];
- cobra.sentido[cobra.tlPosicoes] = cobra.direcao;
- cobra.tlPosicoes = cobra.tlPosicoes + 1;
- }
- bool colide(int direcao)
- {
- if(direcao == 1)
- {
- if(cobra.posicoesLinha[0] == 0)
- return true;
- }
- else if(direcao == 2)
- {
- if(cobra.posicoesColuna[0] == TF - 1)
- return true;
- }
- else if(direcao == 3)
- {
- if(cobra.posicoesLinha[0] == TF - 1)
- return true;
- }
- else if(direcao == 4)
- {
- if(cobra.posicoesColuna[0] == 0)
- return true;
- }
- return false;
- }
- bool checaVitoria()
- {
- int cont = 0, i, j;
- for(i = 0; i < TF; i++)
- for(j = 0; j < TF; j++)
- if(matrizJogo[i][j] == 1)
- cont++;
- if(cont == TF * TF)
- return true;
- else
- return false;
- }
- void atualizaMatriz()
- {
- int i;
- for(i = 0; i < cobra.tlPosicoes; i++)
- {
- matrizJogo[cobra.posicoesLinha[i]][cobra.posicoesColuna[i]] = 1;
- matrizAux[cobra.posicoesLinha[i]][cobra.posicoesColuna[i]] = cobra.sentido[i];
- }
- }
- bool colideComida(int direcao)
- {
- if(direcao == 1)
- {
- if( (cobra.posicoesLinha[0] - 1 == linhaComida) && (cobra.posicoesColuna[0] == colunaComida))
- return true;
- }
- else if(direcao == 2)
- {
- if( (cobra.posicoesLinha[0] == linhaComida) && (cobra.posicoesColuna[0] + 1 == colunaComida) )
- return true;
- }
- else if(direcao == 3)
- {
- if( ( cobra.posicoesLinha[0] + 1 == linhaComida ) && ( cobra.posicoesColuna[0] == colunaComida) )
- return true;
- }
- else if(direcao == 4)
- {
- if( (cobra.posicoesLinha[0] == linhaComida) && (cobra.posicoesColuna[0] - 1 == colunaComida))
- return true;
- }
- return false;
- }
- void imprimeInformacoes()
- {
- printf("Linha: %d\n", cobra.posicoesLinha[0]);
- printf("Coluna: %d\n", cobra.posicoesColuna[0]);
- printf("Comida = (%d, %d)\n", linhaComida, colunaComida);
- }
- bool colideCobra(int direcao)
- {
- if(direcao == 1)
- {
- if(matrizJogo[cobra.posicoesLinha[0] - 1][cobra.posicoesColuna[0]] == 1)
- return true;
- }
- else if(direcao == 2)
- {
- if(matrizJogo[cobra.posicoesLinha[0]][cobra.posicoesColuna[0] + 1] == 1)
- return true;
- }
- else if(direcao == 3)
- {
- if(matrizJogo[cobra.posicoesLinha[0] + 1][cobra.posicoesColuna[0]])
- return true;
- }
- else if(direcao == 4)
- {
- if(matrizJogo[cobra.posicoesLinha[0]][cobra.posicoesColuna[0] - 1])
- return true;
- }
- return false;
- }
- bool movimentoValido(int direcaoAtual, int direcaoAlvo)
- {
- if(cobra.tlPosicoes > 1)
- {
- if(direcaoAtual == 1 && direcaoAlvo == 3)
- return false;
- else if(direcaoAtual == 2 && direcaoAlvo == 4)
- return false;
- else if(direcaoAtual == 3 && direcaoAlvo == 1)
- return false;
- else if(direcaoAtual == 4 && direcaoAlvo == 2)
- return false;
- }
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement