if (headcol==7){game_over();reinicia();return;} //se a cobra estiver na borda inferior da gameover else if (matriz[headline][headcol+1]==1 && snake[0]!=&matriz[headline][headcol+1]){game_over();reinicia();return;} //se o proximo destino colidir com corpo (menos a cauda) da cobra -> gameover else if (matriz[headline][headcol+1]==1 && snake[0]==&matriz[headline][headcol+1] && snake[0]==cresce[0] && cont>0){game_over();reinicia();return;} //caso particular em que a cobra ira crescer, assim ocorre colisao com a cauda -> gameover //else if (snake[size-2]==&matriz[headline][headcol+1]){} //se a cobra tentar retornar sobre si mesmo a jogada sera invalida - Se (proximo local = pescoco da cobra) -> jogada invalida else { headcol++; //desloca uma coluna para direita if (snake[0]==cresce[0] && cont>0) //QUANDO A COBRA DEVE CRESCER - quando a fruta engolida estiver no ultimo segmento da cobra { 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 { if(cont==3) {score();score();} else { score(); cresce[cont]=zeros[lugar]; //vetor cresce recebe o endereco da fruta engolida cont++; //novo espaco para guardar mais um endereco de fruta engolida } gerafruta(); } }}//______________________________________________________________________________void setup_MSP(void)//SETUP DO uC{ WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset BCSCTL1 = CALBC1_1MHZ; //ajusta o DCO para 1MHz DCOCTL = CALDCO_1MHZ; //ajusta o DCO para 1MHz P1SEL = 0x00; P1SEL2 = 0x00; P1REN = 0x00; //Desabilita o resistor P1DIR = 0xFF; //Definicao de pinos OUT (bit=1 -> output) P1OUT = 0xFF; P2SEL = 0x00; P2SEL2 = 0x00; P2REN = 0x00; //Desabilita o resistor P2DIR = 0xFF; //Definicao de pinos OUT (bit=1 -> output) P2OUT = 0xFF; //BOTOES P2DIR &= ~(BIT3+BIT4+BIT5+BIT6); //4 botoes -> INPUT P2REN |= (BIT3+BIT4+BIT5+BIT6); //Habilita os resistores P2OUT &= ~(BIT3+BIT4+BIT5+BIT6); //0=Pull-down / 1=Pull-up P2IE = (BIT3+BIT4+BIT5+BIT6); //habilita a interrupcao dos pinos P2.3 P2.4 P2.5 P2.6 P2IES = 0; //Interrupcao na 0=borda_subida / 1=borda_descida P2IFG = 0; //zera a flag de interrupcao// P1IE = 0x0F; //habilita a interrupcao dos pinos P1.0 P1.1 P1.2 P1.3// P1IFG = 0; //zera a flag de interrupcao}//______________________________________________________________________________void setup_TIMER(void)//Setup do timer{ TA0CTL = TASSEL_2 + ID_3 + MC_0; //TASSEL (timer_A clock source select) seleciona a fonte do timer, 2=0x10 que indica SMCLK //ID (input divider) 0=0x00(/1) > 1=0x01(/2) > 2=0x10(/4) > 3=0x11(/8) -->QUANTO MAIOR O NUMERO MAIS DEMORA PARA CHEGAR NO VALOR MAXIMO (PISCA MAIS LENTO) //MC (mode control) 0=0x00(stop) > 1=0x01(up) > 2=0x10(continuous) > 3=0x11(up/down) //UP(periodo diferente de 0xFFFF) conta ate o valor armazenado no registrador TACCR0 //e seta a flag CCIFG no registrador TACCTL0 quando atinge o valor de comparacao no registrador TACCR0 //e seta a flag TAIFG no registrador TACTL quando o timer passa do valor armazenado no registrador TACCR0 para 0 //CONTINUOUS seta flag TAIFG no registrador TACTL quando zera a contagem //UP/DOWN