//Snake - Jogo implementado com funcionalidades em C//VERSAO TESTES PARA SER EXECUTADA NO CONSOLE//Jogo Snake#include #include "stdlib.h." //Define o valor da constante RAND_MAX -> rand() produz um valor entre 0 e RAND_MAX#include #include //______________________________________________________________________________//DECLARACAO DAS VARIAVEIS GLOBAISunsigned int matriz[8][8]; //tabuleirounsigned int *zeros[64],*snake[64],*cresce[64]; //vetores de ponteiros que indicara as casas vaziasunsigned int i,j,k,score,cont,contazeros,lugar,size,headline,headcol; //variaveis de operacao da matriz//______________________________________________________________________________//DECLARACAO DE FUNCOES//ENCONTRA ESPACO VAZIO E GERA NOVO PONTOvoid gerafruta(void) //Procura espacos vazios na matriz{ contazeros=0; for (i=0;i<8 br="" i=""> { for(j=0;j<8 br="" j=""> { if (matriz[i][j]==0) //Encontra os espacos vazios na matriz { zeros[contazeros] = &matriz[i][j]; contazeros++; } } } if (contazeros>0) { lugar = rand()%contazeros; //gera um valor aleatorio (0 a contazeros-1) *zeros[lugar] = 2; //zeros[lugar] = endereco da matriz onde foi criada a nova fruta }/*Na funcao acima, foi criado um vetor de ponteiros.No vetor zeros[] sao armazenados os enderecos de memoria dos zeros da matrizA funcao rand() gera um numero entre zero e RAND_MAX (definido na biblioteca stdlib.h,com o valor de 0x3fffffff no caso desse programa) e o operador % devolve o resto da divisao (para um valor x temos x%3 = 0, 1 ou 2)A variavel lugar gera um numero aleatorio dentre as posicoes do vetor de zerosPor fim o LED correspondente ao espaco da matriz e ligado*/}//FUNCAO IMPRIME MATRIZvoid imprime(void){ system("cls"); //Limpa a tela for (i=0;i<8 br="" i=""> { for(j=0;j<8 br="" j=""> { printf(" %d ",matriz[i][j]); } printf("\n\n"); }}//FUNCAO UPvoid up(void){ if (headline==0) {} //se a cobra estiver na borda superior da gameover - a condicao de baixo nao entrou junto no if pois se a headline ja fosse zero ficaria matriz[-1] e daria erro else if (matriz[headline-1][headcol]==1 && snake[0]!=&matriz[headline-1][headcol]) {} //se o proximo destino colidir com corpo (menos a cauda) da cobra -> gameover else if (matriz[headline-1][headcol]==1 && snake[0]==&matriz[headline-1][headcol] && snake[0]==cresce[0] && cont>0) {} //caso particular em que a cobra ira crescer, assim ocorre colisao com a cauda -> gameover else if (snake[size-2]==&matriz[headline-1][headcol]) {} //se a cobra tentar retornar sobre si mesmo a jogada sera invalida - Se (proximo local = pescoco da cobra) -> jogada invalida else { headline--; //desloca uma linha para cima if (snake[0]==cresce[0] && cont>0) //QUANDO A COBRA DEVE CRESCER - quando a fruta engolida estiver no ultimo segmento da cobra e o contador de frutas engolidas for maior que 0 (caso contrario cresceria passando novamente pelo mesmo local mesmo que sem fruta) { size++; cont--; for (i=0;i { cresce[i]=cresce[i+1]; //desloca para a esquerda o vetor de crescimento - para o caso de mais de uma fruta engolida e nao digerida } } else //QUANDO A COBRA NAO PRECISA CRESCER { *snake[0] = 0; //apaga o ultimo ponto da cobra for (i=0;i { snake[i] = snake[i+1]; //movimenta a cobra *snake[i] = 1; } } snake[size-1] = &matriz[headline][headcol]; //snake[size-1] recebe o novo endereco da cabeca da cobra *snake[size-1] = 1; //escreve 1 no endereco if (snake[size-1]==zeros[lugar]) //SE A COBRA ENGOLIR UMA NOVA FRUTA - se o endereco da fruta e da cabeca da cobra forem o mesmo { score++; cresce[cont]=zeros[lugar]; //vetor cresce recebe o endereco da fruta engolida cont++; //novo espaco para guardar mais um endereco