//SNAKE PARA MSP430 - VERSAO FINAL //MODELO programado em C esta publicado no post anterior//Videos explicativos nos links abaixo//Parte 1//Parte 2//Parte 3 //JOGO SNAKE#include #include #include //Define o valor da constante RAND_MAX -> rand() produz um valor entre 0 e RAND_MAX#include //Permite o uso da funcao rand()#include //______________________________________________________________________________//DECLARACAO DAS VARIAVEIS GLOBAISunsigned int matriz[8][8]; //tabuleirounsigned int *zeros[16],*snake[36],*cresce[3]; //vetores de ponteirosunsigned int i,j,scorep,cont,movimento,level;unsigned int contazeros,size,lugar,headline,headcol; //variaveis de operacao//______________________________________________________________________________//DECLARACAO DE FUNCOES//ENCONTRA ESPACO VAZIO E GERA NOVO PONTOvoid gerafruta(void) //Procura espacos vazios na matriz{ contazeros=0; lugar = rand()%4; //gera um valor aleatorio para procura em 1 dos 4 quadrantes if (lugar==2) //1o quadrante { for (i=0;i<4 br="" i=""> { for(j=0;j<4 br="" j=""> { if (matriz[i][j]==0) //Encontra os espacos vazios na matriz { zeros[contazeros] = &matriz[i][j]; contazeros++; } } } } else if (lugar==3 || contazeros==0) //2o quadrante { for (i=0;i<4 br="" i=""> { for(j=4;j<8 br="" j=""> { if (matriz[i][j]==0) //Encontra os espacos vazios na matriz { zeros[contazeros] = &matriz[i][j]; contazeros++; } } } } else if (lugar==1 || contazeros==0) //3o quadrante { for (i=4;i<8 br="" i=""> { for(j=0;j<4 br="" j=""> { if (matriz[i][j]==0) //Encontra os espacos vazios na matriz { zeros[contazeros] = &matriz[i][j]; contazeros++; } } } } else if (lugar==0 || contazeros==0) //4o quadrante { for (i=4;i<8 br="" i=""> { for(j=4;j<8 br="" j=""> { if (matriz[i][j]==0) //Encontra os espacos vazios na matriz { zeros[contazeros] = &matriz[i][j]; contazeros++; } } } } 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 ligadoTendo ocorrido problemas de falta de memoria para armazenar vetores de 64 posicoeso vetor de zeros foi reduzido para 16 posicoes, e faz referencia a um dos quatro quadrantesescolhidos aleatoriamente para busca de um espaco vazio que sera preenchido pela nova fruta*/}void reinicia(void){ //INICIALIZA MATRIZ VETORES E VARIAVEIS i=0;j=0;scorep=0;cont=0;contazeros=0;lugar=0;size=0;headline=0;headcol=0;movimento=0; for (i=0;i<36 br="" i="" snake=""> for (i=0;i<16 br="" i="" zeros=""> for (i=0;i<3 br="" cresce="" i=""> for (i=0;i<8 br="" i="" inicializa="" matriz=""> { for (j=0;j<8 br="" j=""> { matriz[i][j]=0; } } //SITUACAO INICIAL DO JOGO matriz[5][1] = 1; snake[0] = &matriz[5][1]; matriz[5][2] = 1; snake[1] = &matriz[5][2]; matriz[5][3] = 1; snake[2] = &matriz[5][3]; headline=5; headcol=3; size=3; gerafruta(); P1OUT |= 0x80; //Pino MR1 (Master reset 1) do CI 74LS90, controla o reset do contador - 1=Reset 0=Count P1OUT &= ~0x80; P1OUT |= 0x20; //Controla o pino BL do CI 4511, acende o display de LED de 7 segmentos}void score(void){ P1OUT |= 0x40; P1OUT &= ~0x40; scorep++;}//______________________________________________________________________________void acende(void)//Funcao de clock do shift register{ P2OUT &= ~0x01; //DATA = 0(LIGA) P2OUT |= 0x02; //CLOCK ALTO P2OUT &= ~0x02; //CLOCK BAIXO//COLUNAS VERDES ->