void normaliza(pixel *linha, int largura, int fluxoDesejado) { /* Normaliza a linha para ter o fluxo desejado */ int i = 0; float fluxoObtido = 0; float novaVel, vel; for (i = 0; i < largura; i++) /* O fluxo obtido é a soma de todas as velocidades */ if (tipo(& linha[i] ) != TERRA) fluxoObtido += velocidade(&linha[i]); for (i = 0; i < largura; i++) { /* Transforma a linha numa que tenha o fluxo desejado */ if (tipo(&linha[i]) != TERRA){ vel = velocidade(&linha[i]); novaVel = 1.0*vel*fluxoDesejado/fluxoObtido; setaVelocidade(&linha[i], novaVel); } } }
int main () { display tela; display_create(&tela, 52, 25); char direcao = 77; int posicao[2] = {tela.width/2, tela.height/2 + 1}; int inimigos[23*48 - 1][2]; int n_inimigos = 0; int vel = 150; menu(&tela); criar_cobra(&tela); while (1) { display_clear(&tela); criar_inimigo(&tela, inimigos, &n_inimigos); int i; for (i = 0; i < n_inimigos; i++) display_put_raw(&tela, inimigos[i][0], inimigos[i][1], 'X'); criar_bordas(&tela); display_paint(&tela, posicao[0], posicao[1]); while (kbhit()){ char aux = getch(); if (aux == CIMA || aux == BAIXO || aux == ESQUERDA || aux == DIREITA) direcao = aux; } switch (direcao) { case CIMA: posicao[1]++; break; case BAIXO: posicao[1]--; break; case ESQUERDA: posicao[0]--; break; case DIREITA: posicao[0]++; break; } velocidade(&vel); placar(&tela, n_inimigos); verificar_morte(&tela, posicao); display_show(&tela); Sleep(vel); } return 0; }
void suavizaVelocidades (pixel *linha, int largura) { int i = 0; int tamanhoDaMargemEsquerda = margemEsquerda(linha); int tamanhoDaMargemDireita = margemDireita(linha, largura); float velocidadeAnterior = 0; for (i = tamanhoDaMargemEsquerda; i < largura - tamanhoDaMargemDireita; i++) { if (velocidade(&linha[i]) != 0) { float velocidadeNova = (velocidadeAnterior + velocidade(&linha[i]) + velocidade(&linha[i+1]))/3; velocidadeAnterior = velocidade(&linha[i]); setaVelocidade(&linha[i], velocidadeNova); } else { velocidadeAnterior = 0; } } }
int testaCorrecao(pixel *linha, int fluxoDesejado, int largura){ /*verifica se para uma dada linha o fluxo obtido eh igual ao fluxo desejado*/ int i; float fluxo = 0; for(i = 0; i < largura; i++) fluxo += velocidade( &linha[i] ); if( abs( fluxoDesejado - fluxo) == 0 ) /*compensa erro de aproxiacao de float*/ return 1; return 0; }
int calculaVariacoes(pixel **grade, int largura, int altura, int fluxoDesejado, float *velMin, float *velMedia, float *velMax, int *margEsqMin, float *margEsqMedia, int* margEsqMax, int *margDirMin, float *margDirMedia, int *margDirMax){ int i, j; int pixelsDeAgua = 0; float velMed = 0; float velAux = 0; int margDirAux = 0; int margEsqAux = 0; int linhasComFluxoCorreto = 0; for(i = 0; i < altura; i++){ margEsqAux = margemEsquerda(grade[i]); margDirAux = margemDireita(grade[i], largura); if (margEsqAux > *margEsqMax) *margEsqMax = margEsqAux; if (margEsqAux < *margEsqMin) *margEsqMin = margEsqAux; if (margDirAux > *margDirMax) *margDirMax = margDirAux; if (margDirAux < *margDirMin) *margDirMin = margDirAux; *margEsqMedia += 1.0* margEsqAux/altura; *margDirMedia += 1.0* margDirAux/altura; linhasComFluxoCorreto += testaCorrecao( grade[i], fluxoDesejado, largura ); for(j = 0; j < largura; j++){ velAux = velocidade(&grade[i][j]); if (velAux > *velMax) *velMax = velAux; if (velAux < *velMin) *velMin = velAux; if (tipo(&grade[i][j]) == AGUA) { velMed += velAux; pixelsDeAgua++; } } velMed /= pixelsDeAgua; *velMedia += velMed; } return linhasComFluxoCorreto; }
void velocidadeProximaLinha (pixel *linha, pixel *linhaAnterior, int fluxoDesejado, int largura) { int i = 0; int tamanhoDaMargemEsquerda = margemEsquerda(linha); int tamanhoDaMargemDireita = margemDireita(linha, largura); for (i = tamanhoDaMargemEsquerda; i < largura-tamanhoDaMargemDireita; i++) { if (tipo(&linha[i-1]) == TERRA || tipo(&linha[i]) == TERRA || tipo(&linha[i+1]) == TERRA) { setaVelocidade(&linha[i], 0); } else { float velocidadeAnterior = velocidade(&linhaAnterior[i]); float aleatorio = realRandomico(0.9, 1.1); float velocidadeNova = velocidadeAnterior*aleatorio; if (velocidadeNova == 0) { velocidadeNova = aleatorio*fluxoDesejado/(largura*8); } setaVelocidade(&linha[i], velocidadeNova); } } }