Advertisement
Guest User

Untitled

a guest
Jul 5th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 75.33 KB | None | 0 0
  1. /** TRABALHO FINAL ALGORITMOS E PROGRAMAÇÃO
  2. FELIPE LEIVAS - 262528
  3. OTAVIO JACOBI - 261569
  4. LAYOUT DA JANELA 65/40
  5. **/
  6. #define _WIN32_WINNT 0x0500  //para retirar o flickering
  7.  
  8. #include <conio2.h>
  9. #include <ctype.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <windows.h>
  14. #include <time.h>
  15.  
  16. #define UP 72
  17. #define DOWN 80
  18. #define LEFT 75
  19. #define RIGHT 77
  20.  
  21. #define MOVIMENTOS 50
  22. #define VIDAS_INICIAIS 3
  23. #define MAX_PONT 500
  24.  
  25. #define LARGURA 60
  26. #define ALTURA 30
  27.  
  28. #define FREE 0
  29. #define BUSY 1
  30. #define MOV_LEFT 2
  31. #define MOV_RIGHT 3
  32.  
  33. #define TRUE 1
  34. #define FALSE 0
  35.  
  36. typedef struct  TIPO_FASE
  37. {
  38.     char objeto;
  39.     int tamanho;
  40.     int espacamento;
  41.     float velocidade;
  42.     int linha_inicial;
  43.     int coluna_inicial;
  44. } Objeto;
  45.  
  46. typedef struct casa_sapo
  47. {
  48.     int win;
  49.  
  50. } CASA_SAPO;
  51.  
  52. typedef struct highscore
  53. {
  54.     char nome[260];
  55.     int score;
  56.  
  57. }HIGHSCORE;
  58.  
  59. void save_name_score(FILE*, HIGHSCORE*, int);
  60. void clear_line(int);
  61. void end_animation();
  62. void ganhou();
  63. void clear_frog(int , int);
  64. void tabela_colisao(int [][LARGURA]);
  65. void move_turtle (Objeto*, int*,int [][LARGURA], int, int);
  66. void move_trunk(Objeto*,  int [][LARGURA]);
  67. void move_car (Objeto*, int [][LARGURA]);
  68. void print_water();
  69. void frog_inicial(Objeto*);
  70. void you_died();
  71. int menuMain();
  72. void move_frog(Objeto*,char*, int*, int*);
  73. void highscore(FILE*);
  74. void gameMain(FILE*);
  75. void save_main(FILE*);
  76.  
  77. int main()
  78. {
  79.     FILE *high;
  80.  
  81.     while(1)    //loop do jogo
  82.     {
  83.         PlaySound("menu.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //musica do menu
  84.         switch(menuMain())  //menu inicial
  85.         {
  86.             case 1 :                      //caso escolha o primeiro, inicializa um novo jogo
  87.                 PlaySound(NULL, 0, 0);
  88.                 gameMain(high);
  89.                 break;
  90.             case 2:                      //caso escolha o segundo, inicializa o jogo salvo
  91.                 PlaySound(NULL, 0, 0);
  92.                 save_main(high);
  93.                 break;
  94.             case 3:                      //caso escolha o terceiro, mostra os highscores
  95.                 PlaySound(NULL, 0, 0);
  96.                 highscore(high);
  97.                 break;
  98.             case 4:                  //caso escolha o quarto, sai do jogo
  99.                 system("cls");
  100.                 clrscr();
  101.                 system("pause");
  102.                 return 0;
  103.                 break;
  104.         }
  105.     }
  106. }
  107.  
  108. /**Função principal do jogo**/
  109. void gameMain(FILE *high)
  110. {
  111.  
  112.     char cursor;//vai ser o caracter que verifica se o jogador aperto ESC
  113.     int movimentos=MOVIMENTOS,tartaruga_cima=0,i,frog_stats, afunda=0, dificuldade=0,ganho,score= MAX_PONT,matriz_colisao[ALTURA][LARGURA], life=VIDAS_INICIAIS;
  114.       /*quantidade de movimentos, estado da tartaruga, estado do sapo, dificuldade,        pontuação máxima, matriz de colisão,            quantidade de vidas*/
  115.  
  116.     FILE *salvo;     //arquivo fase.bin
  117.  
  118.     Objeto trunk[9]=   {{'T',4,4,-1,5,3} , {'T',3,3,-1,5,23}, {'T',4,4,-1,5,43} ,  // troncos
  119.         {'T',3,4,-1,9,3} , {'T',3,4,-1,9,17},  {'T',3,4,-1,9,37},
  120.         {'T',3,3,-1,13,3} , {'T',4,4,-1,13,15},{'T',4,4,-1,13,41}};
  121.  
  122.     Objeto car[13]=    {{'C',4,3,1,17,4} , {'C',4,3,1,17,22},{'C',4,3,1,17,39},     //carros
  123.         {'C',4,3,-1,19,4} , {'C',4,3,-1,19,22},{'C',4,3,-1,19,44},
  124.         {'C',4,3,1,21,4} , {'C',4,3,1,21,22},{'C',4,3,1,21,34},
  125.         {'C',4,3,-1,23,4} , {'C',4,3,-1,23,34},
  126.         {'C',4,3,1,25,4} , {'C',4,3,1,25,36}};
  127.  
  128.     Objeto turtle[9]=  {{'R', 2, 2, 1, 7, 3}  , {'R', 2, 4, 1, 7, 25} ,{'R', 2, 4, 1, 7, 35},{'R', 2, 6, 1, 7, 15},{'R', 2, 6, 1, 7, 45}, //tartarugas
  129.         {'R', 2, 2, 1, 11, 3}, {'R', 2, 2, 1, 11, 18}, {'R', 2, 2, 1, 11, 33}, {'R', 2, 2, 1, 11, 48}};
  130.  
  131.     Objeto frog= {'S',1,0,0,15,15};      //sapo
  132.  
  133.     CASA_SAPO casas[5]= {{0},{0},{0},{0},{0}};  //estados das casas do sapo (ocupadas ou vazias)
  134.  
  135.     HIGHSCORE jogador;
  136.  
  137.     PlaySound("song.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);   //inicia a música principal do jogo
  138.     srand(time(NULL));                                                  //inicializa a seed random das tartarugas
  139.  
  140.     do
  141.     {
  142.         system("cls"); //limpa a tela antes de começar
  143.         frog.coluna_inicial =LARGURA/2;
  144.         frog.linha_inicial = ALTURA-3;  //reseta a posição do sapo
  145.  
  146.         do
  147.         {
  148.             tabela_colisao(matriz_colisao);    //inicializa a matriz de colisão
  149.  
  150.             textcolor(YELLOW);  //cor amarela
  151.             gotoxy(1,1);
  152.             printf("    Movimentos restantes:|%d Score: %d|Vidas restantes: ",movimentos, score);  //printa os movimentos e o score na posição correta
  153.  
  154.             for(i=0; i<life+1; i++) //printa os corações equivalentes as vidas na posição correta
  155.             {
  156.                 textcolor(RED);
  157.                 gotoxy(59+i,1);
  158.                 printf("%c", 3);
  159.             }
  160.  
  161.             print_water(casas); //printa a agua e as casas corretamente
  162.  
  163.             //LockWindowUpdate(GetConsoleWindow());
  164.  
  165.             for(i=0; i<9; i++)
  166.                 move_trunk(& trunk[i],matriz_colisao);   //move os  troncos
  167.  
  168.             for(i=0; i<13; i++)
  169.                 move_car(&car[i],matriz_colisao);     // move os carros
  170.  
  171.             for(i=0; i<9; i++)
  172.                 move_turtle(& turtle[i], & tartaruga_cima, matriz_colisao, afunda, i); // move as tartarugas
  173.  
  174.             clear_line(15);    //limpa as linhas do meio pra não ficar sapo "duplicado"
  175.             clear_line(16);
  176.  
  177.             frog_inicial(&frog);  //printa o frog na posição inicial do frog
  178.  
  179.             //LockWindowUpdate(NULL);
  180.  
  181.             i=0;               //zera o contador i
  182.             frog_stats=0;      //reinicializa o estado do sapo
  183.  
  184.             while(i<10000-dificuldade)// faz o tempo para os carros se mecherem
  185.             {
  186.                 i++;           //aumenta o contador para cada loop
  187.                 if(kbhit())    //caso toque uma tela
  188.                     move_frog(&frog, &cursor, &movimentos, &score);  //move o frog para a posição correta, diminui a quantidade de movimentos e o score
  189.  
  190.                 if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial] ==BUSY) movimentos=0;               //colisão com carros e agua mata o sapo
  191.                 if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+1] ==BUSY) movimentos=0;
  192.                 if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial] ==BUSY) movimentos=0;
  193.                 if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==BUSY) movimentos=0;
  194.  
  195.                 if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+0] ==MOV_LEFT) frog_stats=MOV_LEFT;                //colisão com objeto andando pra a esquerda
  196.                 if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+1] ==MOV_LEFT) frog_stats=MOV_LEFT;                //faz o sapo assumir estado movendo para a esquerda
  197.                 if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+0] ==MOV_LEFT) frog_stats=MOV_LEFT;
  198.                 if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==MOV_LEFT) frog_stats=MOV_LEFT;
  199.  
  200.                 if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+0] ==MOV_RIGHT) frog_stats=MOV_RIGHT;               //colisão com objeto andando pra a direita
  201.                 if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+1] ==MOV_RIGHT) frog_stats=MOV_RIGHT;               //faz o sapo assumir estado movendo para a direita
  202.                 if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+0] ==MOV_RIGHT) frog_stats=MOV_RIGHT;
  203.                 if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==MOV_RIGHT) frog_stats=MOV_RIGHT;
  204.  
  205.  
  206.                 if ((frog.linha_inicial==3) && (frog.coluna_inicial==6 || frog.coluna_inicial==8 || frog.coluna_inicial==10))  //acerta estado para caso o sapo entre na casa 1
  207.                 {
  208.                     score += 50;                 //soma 50 pontos
  209.                     casas[0].win = TRUE;         //estado da casa 1 vai para verdadeiro (1)
  210.                     dificuldade+=500;            //aumenta a dificuldade
  211.                     movimentos=MOVIMENTOS;       //reseta os movimentos
  212.                     life=VIDAS_INICIAIS;         //reseta as vidas
  213.                     frog.coluna_inicial =LARGURA/2;//
  214.                     frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  215.                     frog_inicial(&frog);         //printa o frog na sua nova posição
  216.                     clear_line(ALTURA-3);        //
  217.                     clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  218.  
  219.                 }
  220.                 if((frog.linha_inicial==3) && (frog.coluna_inicial==18 || frog.coluna_inicial==20 || frog.coluna_inicial==22)) //acerta estado para caso o sapo entre na casa 2
  221.                 {
  222.                     score += 50;                 //soma 50 pontos
  223.                     casas[1].win = TRUE;         //estado da casa 2 vai para verdadeiro (1)
  224.                     dificuldade+=500;            //aumenta a dificuldade
  225.                     movimentos=MOVIMENTOS;       //reseta os movimentos
  226.                     life=VIDAS_INICIAIS;         //reseta as vidas
  227.                     frog.coluna_inicial =LARGURA/2;//
  228.                     frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  229.                     frog_inicial(&frog);         //printa o frog na sua nova posição
  230.                     clear_line(ALTURA-3);        //
  231.                     clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  232.  
  233.                 }
  234.                 if ((frog.linha_inicial==3) &&(frog.coluna_inicial==30 || frog.coluna_inicial==32 || frog.coluna_inicial==34)) //acerta estado para caso o sapo entre na casa 4
  235.                 {
  236.                     score += 50;                 //soma 50 pontos
  237.                     casas[2].win = TRUE;         //estado da casa 3 vai para verdadeiro (1)
  238.                     dificuldade+=500;            //aumenta a dificuldade
  239.                     movimentos=MOVIMENTOS;       //reseta os movimentos
  240.                     life=VIDAS_INICIAIS;         //reseta as vidas
  241.                     frog.coluna_inicial =LARGURA/2;//
  242.                     frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  243.                     frog_inicial(&frog);         //printa o frog na sua nova posição
  244.                     clear_line(ALTURA-3);        //
  245.                     clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  246.  
  247.                 }
  248.                 if((frog.linha_inicial==3) &&(frog.coluna_inicial==42 || frog.coluna_inicial==44 || frog.coluna_inicial==46)) //acerta estado para caso o sapo entre na casa 5
  249.                 {
  250.                     score += 50;                 //soma 50 pontos
  251.                     casas[3].win = TRUE;         //estado da casa 4 vai para verdadeiro (1)
  252.                     dificuldade+=500;            //aumenta a dificuldade
  253.                     movimentos=MOVIMENTOS;       //reseta os movimentos
  254.                     life=VIDAS_INICIAIS;         //reseta as vidas
  255.                     frog.coluna_inicial =LARGURA/2;//
  256.                     frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  257.                     frog_inicial(&frog);         //printa o frog na sua nova posição
  258.                     clear_line(ALTURA-3);        //
  259.                     clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  260.                 }
  261.                 if((frog.linha_inicial==3) &&(frog.coluna_inicial==54 || frog.coluna_inicial==56 || frog.coluna_inicial==58)) //acerta estado para caso o sapo entre na casa 4
  262.                 {
  263.                     score += 50;                 //soma 50 pontos
  264.                     casas[4].win = TRUE;         //estado da casa 5 vai para verdadeiro (1)
  265.                     dificuldade+=500;            //aumenta a dificuldade
  266.                     movimentos=MOVIMENTOS;       //reseta os movimentos
  267.                     life=VIDAS_INICIAIS;         //reseta as vidas
  268.                     frog.coluna_inicial =LARGURA/2;//
  269.                     frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  270.                     frog_inicial(&frog);         //printa o frog na sua nova posição
  271.                     clear_line(ALTURA-3);        //
  272.                     clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  273.                 }
  274.  
  275.             }
  276.  
  277.             if(frog_stats==MOV_LEFT)        //caso o estado seja MOV_LEFT
  278.                 frog.coluna_inicial-=2;     //move o sapo junto com o tronco para a esquerda
  279.             if(frog_stats==MOV_RIGHT)       //caso o estado seja MOV_RIGHT
  280.                 frog.coluna_inicial+=2;     //move o sapo junto com o tronco para a direita
  281.  
  282.             tartaruga_cima++;   //altera gradativamente o estado da tartaruga
  283.  
  284.             if(tartaruga_cima==25) //looping de tartaruga e ve qual que vai afundar
  285.             {
  286.                 tartaruga_cima=0;
  287.                 afunda = rand()%9;  //sorteia tartaruga random entre 1-9 para afunda
  288.             }
  289.  
  290.             if(casas[0].win==1 && casas[1].win==1 && casas[2].win==1 && casas[3].win==1 && casas[4].win==1)  //verifica o estado das casas, se todas estiverem sido "ocupadas" ganha o jogo
  291.             {
  292.  
  293.                 ganhou();  //função para ganhar o jogo
  294.                 ganho=1;   //altera o estado para não entrar em looping
  295.                 save_name_score(high, &jogador, score);
  296.             }
  297.             if(cursor=='f')  //se pedir para salvar
  298.             {
  299.                 salvo=fopen("fase.bin","wb");            //abre/cria arquivo para escrita
  300.                 if(!salvo)                               //se der problema para salvar
  301.                     printf("\aError ao abrir o aquivo"); //msg de erro
  302.                 else                                     //senão
  303.                 {
  304.                     for(i=0; i<9; i++)
  305.                     {
  306.                         if( fwrite(&trunk[i],sizeof(Objeto),1,salvo) !=1) //salva as posições dos troncos e msg de erro caso de erro
  307.                         {
  308.                             clrscr();
  309.                             printf("Erro ao salvar o arquivo");
  310.                             fclose(salvo);
  311.                         }
  312.  
  313.                     }
  314.                     for(i=0; i<13; i++)
  315.                     {
  316.                         if( fwrite(&car[i],sizeof(Objeto),1,salvo) !=1)  //salva as posições dos carros e msg de erro caso de erro
  317.                         {
  318.                             clrscr();
  319.                             printf("Erro ao salvar o arquivo");
  320.                             fclose(salvo);
  321.                         }
  322.  
  323.                     }
  324.                     for(i=0; i<9; i++)
  325.                     {
  326.                         if( fwrite(&turtle[i],sizeof(Objeto),1,salvo) !=1) //salva as posições da tartaruga e msg de erro caso de erro
  327.                         {
  328.                             clrscr();
  329.                             printf("Erro ao salvar o arquivo");
  330.                             fclose(salvo);
  331.                         }
  332.  
  333.                     }
  334.                     if(1 != fwrite(&frog,sizeof(Objeto),1,salvo))     //salva a posição do frog e msg de erro caso de erro
  335.                     {
  336.                         clrscr();
  337.                         printf("Erro ao salvar o arquivo");
  338.                         fclose(salvo);
  339.                     }
  340.                     if(!( fwrite(&movimentos,sizeof(int),1,salvo)))       //salva quantos movimentos restantes e msg de erro caso de erro
  341.                     {
  342.                         clrscr();
  343.                         printf("Erro ao salvar o arquivo");
  344.                         fclose(salvo);
  345.                     }
  346.                     if(1 != fwrite(&life,sizeof(int),1,salvo))            //salva quantas vidas e msg de erro caso de erro
  347.                     {
  348.                         clrscr();
  349.                         printf("Erro ao salvar o arquivo");
  350.                         fclose(salvo);
  351.                     }
  352.                     if(1 != fwrite(&ganho,sizeof(int),1,salvo))         //salva se já ganhou o jogo e msg de erro caso de erro
  353.                     {
  354.                         clrscr();
  355.                         printf("Erro ao salvar o arquivo");
  356.                         fclose(salvo);
  357.                     }
  358.                     if(1 != fwrite(&tartaruga_cima,sizeof(int),1,salvo)) //salva o estado da tartaruga e msg de erro caso de erro
  359.                     {
  360.                         clrscr();
  361.                         printf("Erro ao salvar o arquivo");
  362.                         fclose(salvo);
  363.                     }
  364.                     if(1 != fwrite(&dificuldade,sizeof(int),1,salvo))  //salva a dificuldade e e msg de erro caso de erro
  365.                     {
  366.                         clrscr();
  367.                         printf("Erro ao salvar o arquivo");
  368.                         fclose(salvo);
  369.                     }
  370.                     for(i=0;i<5;i++)
  371.                     {
  372.                         if(1 != fwrite(&casas[i],sizeof(CASA_SAPO),1,salvo))  //salva quais casas foram ocupadas e msg de erro caso de erro
  373.                         {
  374.                             clrscr();
  375.                             printf("Erro ao salvar o arquivo");
  376.                             fclose(salvo);
  377.                         }
  378.                      }
  379.                     if(1 != fwrite(&afunda,sizeof(int),1,salvo)) //salva qual tartaruga afundou e msg de erro caso de erro
  380.                     {
  381.                         clrscr();
  382.                         printf("Erro ao salvar o arquivo");
  383.                         fclose(salvo);
  384.                     }
  385.                     if(1 != fwrite(&score,sizeof(int),1,salvo)) //salva a pontuação e msg de erro caso de erro
  386.                     {
  387.                         clrscr();
  388.                         printf("Erro ao salvar o arquivo");
  389.                         fclose(salvo);
  390.                     }
  391.                 }
  392.  
  393.                 fclose(salvo);   //fecha o arquivo
  394.             }
  395.         cursor=tolower(cursor);  //caracter pego do teclado vai para minusculo
  396.  
  397.         }while(movimentos>0 && cursor!='r'&&ganho!=1 && cursor!='q');  //jogo segue enquanto movimentos maior que 0, cursor diferente r (reset posicao) e cursor diferente de q (fim do jogo)
  398.  
  399.         if(movimentos<=0) //caso tenha morrido
  400.         {
  401.             system("cls");  //limpa a tela
  402.             life--;         //diminui uma vida
  403.             you_died();     //tela de morreu
  404.             fflush(stdin);  //limpa buffer
  405.             movimentos=MOVIMENTOS; //reinicia a quantidade de movimentos
  406.         }
  407.  
  408.     }while(life>=0 && cursor!='q' && ganho!=1); //enquanto tiver vidas e cursor diferente de q(fim do jogo)
  409.  
  410.  
  411.     PlaySound(NULL, 0, 0); //para a musica do loop principal
  412. }
  413.  
  414. /**Move o sapo para a posição correta
  415. recebe a posição do sapo e move ele
  416. diminui 1 no numero de movimentos restantes e 1 na pontuação**/
  417. void move_frog(Objeto *frog,char *cursor, int *n_movimento, int *pontuacao)// recebe de parametros os endereços da linha_inicial e da coluna_inicial do sapo
  418. {
  419.     int ex, ey,movimentos;//eixo x e eixo y
  420.     char k;//recebe o comando
  421.  
  422.     textcolor(GREEN);           //cor verde
  423.     ex=frog->coluna_inicial;    //recebe o ponteiro referente a coluna inicial
  424.     ey=frog->linha_inicial;     //recebe o ponteiro referente a linha inicial
  425.     movimentos=*n_movimento;    //recebe o ponteiro referente ao numero de movimentos
  426.  
  427.     k=getch();                 //para receber uma seta do teclado
  428.     if(k==0)
  429.         k=getch();
  430.  
  431.     switch(k)                 //menu para printar a animação correta do frog e move-lo
  432.     {
  433.     case UP:
  434.  
  435.         if(ey>=4)             //caso para cima(e não esteja batendo nas laterais da tela)
  436.         {
  437.             clear_frog(ex,ey);  //limpa o frog antigo
  438.             ey-=2;              //move o frog
  439.             gotoxy(ex,ey);   printf("@@");  //printa a animação de movimento
  440.             gotoxy(ex,ey+1); printf("00");
  441.             *pontuacao = *pontuacao -1;     //diminui a pontuação
  442.             movimentos--;                   //diminui o numero de movimentos
  443.         }
  444.         break;
  445.  
  446.     case DOWN:
  447.  
  448.         if(ey<= ALTURA-4)  //caso para baixo(e não esteja batendo nas laterais da tela)
  449.         {
  450.             clear_frog(ex,ey);  //limpa o frog antigo
  451.             ey+=2;              //move o frog
  452.             gotoxy(ex,ey);   printf("00");  //printa a animação de movimento
  453.             gotoxy(ex,ey+1); printf("@@");
  454.             *pontuacao = *pontuacao -1;     //diminui a pontuação
  455.             movimentos--;
  456.         }
  457.         break;
  458.  
  459.     case LEFT:
  460.  
  461.         if(ex>4)   //caso para a esquerda(e não esteja batendo nas laterais da tela)
  462.         {
  463.             clear_frog(ex,ey);  //limpa o frog antigo
  464.             ex-=2;              //move o frog
  465.             gotoxy(ex,ey);   printf("@0");  //printa a animação de movimento
  466.             gotoxy(ex,ey+1); printf("@0");
  467.             *pontuacao = *pontuacao -1;     //diminui a pontuação
  468.             movimentos--;
  469.         }
  470.         break;
  471.  
  472.     case RIGHT:
  473.  
  474.         if(ex<= LARGURA-2) //caso para a direita (e não esteja batendo nas laterais da tela)
  475.         {
  476.             clear_frog(ex,ey);  //limpa o frog antigo
  477.             ex+=2;              //move o frog
  478.             gotoxy(ex,ey);   printf("0@");  //printa a animação de movimento
  479.             gotoxy(ex,ey+1); printf("0@");
  480.             *pontuacao = *pontuacao -1;     //diminui a pontuação
  481.             movimentos--;
  482.         }
  483.         break;
  484.     }
  485.  
  486.     *n_movimento=movimentos;     //atualiza o numero de movimentos
  487.  
  488.     frog->coluna_inicial=ex;    //atualiza o valor da coluna inicial do sapo
  489.     frog->linha_inicial=ey;     //atualiza o valor da linha inicial do sapo
  490.     *cursor=k;                  //devolve o que o usuario digito para a main
  491.  
  492.     textcolor(WHITE);
  493. }
  494.  
  495. /**Menu principal do jogo
  496. mostra as opções de inicio e retorna qual foi escolhida**/
  497. int menuMain()
  498. {
  499.     int ex=22,ey=15, escolha=1;// são as  cordenadas da setinha
  500.     char cursor;//controla a setinha
  501.  
  502.     clrscr();   //limpa a tela
  503.  
  504.     textcolor(GREEN);  //cor verde
  505.  
  506.     gotoxy(2, 5);  printf(" _______ _______ _______ _______ _______ _______ ______        "); //printa o titulo principal do jogo
  507.     gotoxy(2, 6);  printf("(  ____ (  ____ (  ___  (  ____ (  ____ (  ____ (  ____ )      ");
  508.     gotoxy(2, 7);  printf("| (    \\| (    )| (   ) | (    \\| (    \\| (    \\| (    )|  ");
  509.     gotoxy(2, 8);  printf("| (__   | (____)| |   | | |     | |     | (__   | (____)|      ");
  510.     gotoxy(2, 9);  printf("|  __)  |     __| |   | | | ____| | ____|  __)  |     __)      ");
  511.     gotoxy(2, 10); printf("| (     | (\\ (  | |   | | | \\_  | | \\_  | (     | (\\ (    ");
  512.     gotoxy(2, 11); printf("| )     | ) \\ \\_| (___) | (___) | (___) | (____/| ) \\ \\__ ");
  513.     gotoxy(2, 12); printf("|/      |/   \\__(_______(_______(_______(_______|/   \\__/   ");
  514.  
  515.     gotoxy(24,15); printf("Novo Jogo");               //printa as opçõess
  516.     gotoxy(24,20); printf("Continuar jogo salvo");
  517.     gotoxy(24,25); printf("Highscores");
  518.     gotoxy(24,30); printf("Sair do jogo");
  519.  
  520.     gotoxy(ex,ey);      //printa a seta para escolher
  521.     printf("%c", 26);
  522.     gotoxy(LARGURA,ALTURA+5);
  523.  
  524.     do
  525.     {
  526.         cursor=getch();      //para pegar a seta
  527.         if(cursor==0)
  528.             cursor=getch();
  529.  
  530.         if(cursor== UP && ey>15)  //caso clique para cima, move a seta para cima e apaga a anterior(não deixa passar das opções pedidas)
  531.         {
  532.             gotoxy(ex,ey);
  533.             printf(" ");
  534.             ey-=5;
  535.             gotoxy(ex,ey);
  536.             printf("%c", 26);
  537.             gotoxy(LARGURA,ALTURA+5);
  538.         }
  539.  
  540.         if(cursor== DOWN && ey<30)    //caso clique para baixo, move a seta para baixo e apaga a anterior(não deixa passar das opções pedidas)
  541.         {
  542.             gotoxy(ex,ey);
  543.             printf(" ");
  544.             ey+=5;
  545.             gotoxy(ex,ey);
  546.             printf("%c", 26);
  547.             gotoxy(LARGURA,ALTURA+5);
  548.  
  549.         }
  550.     }while (cursor!=13); //enquanto não apertar enter, espera pelo caracter
  551.  
  552.     if(ey==15) escolha=1;  //coloca o retorno certo dependendo da opção escohida
  553.     if(ey==20) escolha=2;
  554.     if(ey==25) escolha=3;
  555.     if(ey==30) escolha=4;
  556.  
  557.     textcolor(WHITE);
  558.  
  559.     return escolha;    //retorna a opção escolhida
  560. }
  561.  
  562. /**Printa a tela de morte **/
  563. void you_died()
  564. {
  565.     clrscr();      //limpa a tela
  566.     textcolor(RED);
  567.     gotoxy(1,8);  printf("##    ##  #######  ##     ##    ########  #### ######## ######## "); //printa "YOU DIED"
  568.     gotoxy(1,9);  printf(" ##  ##  ##     ## ##     ##    ##     ##  ##  ##       ##     ##");
  569.     gotoxy(1,10); printf("  ####   ##     ## ##     ##    ##     ##  ##  ##       ##     ##");
  570.     gotoxy(1,11); printf("   ##    ##     ## ##     ##    ##     ##  ##  ######   ##     ##");
  571.     gotoxy(1,12); printf("   ##    ##     ## ##     ##    ##     ##  ##  ##       ##     ##");
  572.     gotoxy(1,13); printf("   ##    ##     ## ##     ##    ##     ##  ##  ##       ##     ##");
  573.     gotoxy(1,14); printf("   ##     #######   #######     ########  #### ######## ######## ");
  574.  
  575.     Sleep(2000); //espera 2 segundos
  576.     fflush(stdin);
  577.     textcolor(WHITE);
  578. }
  579.  
  580. /**Printa o frog na sua posição inicial(posição atual)**/
  581. void frog_inicial(Objeto *frog)
  582. {
  583.     textcolor(GREEN);
  584.  
  585.     int x=frog->coluna_inicial,y=frog->linha_inicial; //seta as variaveis para os valores dos ponteiros
  586.  
  587.     gotoxy(x,y);    printf("@@");   //vai para a posição inicial do sapo e printa ele
  588.     gotoxy(x,y + 1);printf("00");
  589.  
  590.     textcolor(WHITE);
  591. }
  592.  
  593. /**Printa a água e as casas nas suas posições e estados corretos**/
  594. void print_water(CASA_SAPO casa[])
  595. {
  596.     int i;
  597.  
  598.     textcolor(BROWN);
  599.  
  600.     gotoxy(4,3); printf("  |    |      |    |      |    |      |    |      |    |  ");         //printa as casas marrom
  601.     gotoxy(4,4); printf("__|    |______|    |______|    |______|    |______|    |__");
  602.  
  603.     textcolor(BLUE);
  604.  
  605.     gotoxy(7,3);  printf("~~~~");        //printa a agua das casas
  606.     gotoxy(19,3); printf("~~~~");
  607.     gotoxy(31,3); printf("~~~~");
  608.     gotoxy(43,3); printf("~~~~");
  609.     gotoxy(55,3); printf("~~~~");
  610.  
  611.     gotoxy(7,4);  printf("~~~~");
  612.     gotoxy(19,4); printf("~~~~");
  613.     gotoxy(31,4); printf("~~~~");
  614.     gotoxy(43,4); printf("~~~~");
  615.     gotoxy(55,4); printf("~~~~");
  616.  
  617.     for(i=5; i<15; i++)                 //printa todo o resto da agua da casa
  618.     {
  619.         gotoxy(2,i);
  620.         printf("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  621.     }
  622.  
  623.     textcolor(YELLOW);
  624.  
  625.     if(casa[0].win==1)                 //verifica o estado da casa 1 e printa um sapo dentro se o frog já chegou la
  626.     {
  627.         gotoxy(8,3); printf("@@");
  628.         gotoxy(8,4); printf("00");
  629.     }
  630.     if(casa[1].win==1)                //verifica o estado da casa 2 e printa um sapo dentro se o frog já chegou la
  631.     {
  632.         gotoxy(20,3);printf("@@");
  633.         gotoxy(20,4);printf("00");
  634.  
  635.     }
  636.     if(casa[2].win==1)                //verifica o estado da casa 3 e printa um sapo dentro se o frog já chegou la
  637.     {
  638.         gotoxy(32,3);printf("@@");
  639.         gotoxy(32,4);printf("00");
  640.  
  641.     }
  642.     if(casa[3].win==1)               //verifica o estado da casa 4 e printa um sapo dentro se o frog já chegou la
  643.     {
  644.         gotoxy(44,3);printf("@@");
  645.         gotoxy(44,4);printf("00");
  646.  
  647.     }
  648.     if(casa[4].win==1)              //verifica o estado da casa 5 e printa um sapo dentro se o frog já chegou la
  649.     {
  650.         gotoxy(56,3);printf("@@");
  651.         gotoxy(56,4);printf("00");
  652.     }
  653.  
  654.     textcolor(WHITE);
  655. }
  656.  
  657. /**Move um carro para a posição correta e printa ele
  658. atualiza a tabela de colisão para onde tem carro**/
  659. void move_car (Objeto *car, int colisao[][LARGURA])
  660. {
  661.     int x=car->coluna_inicial,y=car->linha_inicial, i;  //pega os valores dos ponteiros referentes a posição do carro
  662.     float speed= car->velocidade;                       //pega o valor do ponteiro referente a velocidade do carro
  663.  
  664.     gotoxy(x%(LARGURA-2)+4,y);   printf("        ");   //apaga o carro anterior
  665.     gotoxy(x%(LARGURA-2)+4,y+1); printf("        ");
  666.  
  667.     x+=2*speed;    //incrementa a nova posição segundo a velocidade
  668.  
  669.     if(x<3 && speed<0)           x = LARGURA; //faz a passagem do carro de um lado pro outro
  670.     if(x>=(LARGURA) && speed>0)  x=2;         //faz a passagem do carro no sentido inverso
  671.  
  672.     if(speed<0)                               //printa o carro no sentido direita -> esquerda
  673.     {
  674.         gotoxy(x%(LARGURA-2)+4,y);   printf(" ");                 ///PRINTA O CARRO POR PARTES, utiliza a operação % para fazer o wrap
  675.         gotoxy(x%(LARGURA-2)+4,y+1); printf("/");                 //printa no resto da divisão pelo (tamanho da tela-2)+4 para printar o carro na posição correta
  676.  
  677.         gotoxy((x+1)%(LARGURA-2)+4,y);  printf("_");
  678.         gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("_");
  679.  
  680.         gotoxy((x+2)%(LARGURA-2)+4,y);  printf("_");
  681.         gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("o");
  682.  
  683.         gotoxy((x+3)%(LARGURA-2)+4,y);  printf("/");
  684.         gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("_");
  685.  
  686.         gotoxy((x+4)%(LARGURA-2)+4,y);  printf("=");
  687.         gotoxy((x+4)%(LARGURA-2)+4,y+1);printf("_");
  688.  
  689.         gotoxy((x+5)%(LARGURA-2)+4,y);  printf("|");
  690.         gotoxy((x+5)%(LARGURA-2)+4,y+1);printf("o");
  691.  
  692.         gotoxy((x+6)%(LARGURA-2)+4,y);  printf("_");
  693.         gotoxy((x+6)%(LARGURA-2)+4,y+1);printf("_");
  694.  
  695.         gotoxy((x+7)%(LARGURA-2)+4,y);  printf(" ");
  696.         gotoxy((x+7)%(LARGURA-2)+4,y+1);printf("\\");
  697.  
  698.         gotoxy((x+8)%(LARGURA-2)+4,y+1);printf("  ");
  699.         gotoxy((x+8)%(LARGURA-2)+4,y);  printf("  ");
  700.  
  701.         for(i=-1; i<=7; i++)                           //atualiza a tabela de colisão para onde há carro
  702.         {
  703.             colisao[y][(x+i)%(LARGURA-2)+4]=BUSY;
  704.             colisao[y+1][(x+i)%(LARGURA-2)+4]=BUSY;
  705.         }
  706.     }
  707.  
  708.     if(speed>0)
  709.     {
  710.         gotoxy((x+7)%(LARGURA-2)+4,y);  printf(" ");       ///PRINTA O CARRO POR PARTES, utiliza a operação % para fazer o wrap
  711.         gotoxy((x+7)%(LARGURA-2)+4,y+1);printf("\\");      //printa no resto da divisão pelo (tamanho da tela-2)+4 para printar o carro na posição correta
  712.  
  713.         gotoxy((x+6)%(LARGURA-2)+4,y);  printf("_");
  714.         gotoxy((x+6)%(LARGURA-2)+4,y+1);printf("_");
  715.  
  716.         gotoxy((x+5)%(LARGURA-2)+4,y);  printf("_");
  717.         gotoxy((x+5)%(LARGURA-2)+4,y+1);printf("o");
  718.  
  719.         gotoxy((x+4)%(LARGURA-2)+4,y);  printf("\\");
  720.         gotoxy((x+4)%(LARGURA-2)+4,y+1);printf("_");
  721.  
  722.         gotoxy((x+3)%(LARGURA-2)+4,y);  printf("=");
  723.         gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("_");
  724.  
  725.         gotoxy((x+2)%(LARGURA-2)+4,y);  printf("|");
  726.         gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("o");
  727.  
  728.         gotoxy((x+1)%(LARGURA-2)+4,y);  printf("_");
  729.         gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("_");
  730.  
  731.         gotoxy((x)%(LARGURA-2)+4,y);  printf(" ");
  732.         gotoxy((x)%(LARGURA-2)+4,y+1);printf("/");
  733.  
  734.         for(i=1; i<=8; i++)                            //atualiza a tabela de colisão para onde há carro
  735.         {
  736.             colisao[y][(x+i)%(LARGURA-2)+4]=BUSY;
  737.             colisao[y+1][(x+i)%(LARGURA-2)+4]=BUSY;
  738.         }
  739.     }
  740.  
  741.     car->coluna_inicial= x; // atualiza o endereço do x na estrutura carro
  742.     car->linha_inicial= y; // atualiza o endereço do y na estrutura carro
  743. }
  744.  
  745. /**Move um tronco para a posição correta e printa ele
  746. autaliza a tabela de colisão para onde tem tronco**/
  747. void move_trunk(Objeto *trunk, int colisao[][LARGURA])
  748. {
  749.  
  750.     int x = trunk->coluna_inicial, y=trunk->linha_inicial,tam=trunk->tamanho,i; //pega os valores dos ponteiros referentes a posição do tronco
  751.     float speed= trunk->velocidade;  //pega o valor do ponteiro referente a velocidade do tronco
  752.  
  753.     textcolor(BLUE);
  754.     gotoxy(x,y);
  755.     for(i=0; i<(tam*2); i++)        //apaga o tronco anterior
  756.     {
  757.         gotoxy((x+i)%(LARGURA-2)+4,y);  printf("~");
  758.         gotoxy((x+i)%(LARGURA-2)+4,y+1);printf("~");
  759.     }
  760.  
  761.     x+=2*speed; //atualiza a nova posição do tronco a partir da velocidade
  762.  
  763.     if(speed > 0 && x>LARGURA)       x=4;           //faz a mudança de posição de um lado pro outro
  764.     if(speed < 0 && x<= 0)           x= LARGURA-2;  //faz a mudença de posição inversa
  765.  
  766.     textcolor(BROWN);
  767.  
  768.     for(i=0; i<(2*tam); i++)                       //printa o tronco do tamanho requisitado no local correto
  769.     {
  770.         gotoxy((x+i)%(LARGURA-2)+4,y);  printf("#"); ///utiliza o operador % para fazer o wrap corretamente
  771.         gotoxy((x+i)%(LARGURA-2)+4,y+1);printf("#");
  772.     }
  773.  
  774.     if(speed<0)                             //preenche a tebela de colisão com o tronco indo para a esquerda
  775.     {
  776.         for(i=0; i<(tam*2); i++)
  777.         {
  778.             colisao[y][(x+i)%(LARGURA-2)+4]=MOV_LEFT;
  779.             colisao[y+1][(x+i)%(LARGURA-2)+4]=MOV_LEFT;
  780.         }
  781.     }
  782.  
  783.     if(speed>0)                            //preenche a tabela de colisão com o tronco indo para a direita
  784.     {
  785.         for(i=0; i<(tam*2); i++)
  786.         {
  787.             colisao[y][(x+i)%(LARGURA-2)+4]=MOV_RIGHT;
  788.             colisao[y+1][(x+i)%(LARGURA-2)+4]=MOV_RIGHT;
  789.         }
  790.     }
  791.  
  792.     trunk->coluna_inicial= x;      //atualiza a posição dos ponteiros
  793.     trunk->linha_inicial= y;
  794.  
  795.     textcolor(WHITE);
  796.  
  797. }
  798.  
  799. /**Move um tronco para a posição correta e printa ele
  800. autaliza a tabela de colisão para onde tem tronco**/
  801. void move_turtle (Objeto *turtle, int *cont,int colisao[][LARGURA], int afunda, int atual)
  802. {
  803.     int x = turtle->coluna_inicial, y = turtle->linha_inicial,tam = turtle->tamanho,i,cima= *cont;  //pega os valores dos ponteiros referentes a posição e o estado da tartaruga
  804.     float speed = turtle->velocidade; //pega o valor do ponteiro referente a velocidade da tartaruga
  805.  
  806.     textcolor(BLUE);
  807.     for(i=0; i<(tam*2); i++)         //apaga a tartaruga anterior
  808.     {
  809.         gotoxy((x+i)%(LARGURA-2)+4,y);  printf("~");
  810.         gotoxy((x+i)%(LARGURA-2)+4,y+1);printf("~");
  811.     }
  812.  
  813.     x+=2*speed;     //atualiza a nova posição da tartaruga
  814.  
  815.     if(speed > 0 && x>LARGURA)       x=4;          //faz a mudança de posição de um lado pro outro
  816.     if(speed < 0 && x<= 0)           x= LARGURA-2; //faz a mudança de posição no sentido inverso
  817.  
  818.     textcolor(CYAN);
  819.  
  820.  
  821.     gotoxy((x)%(LARGURA-2)+4,y);    printf("/");       //printa a tartaruga
  822.     gotoxy((x)%(LARGURA-2)+4,y+1);  printf("\\");      ///UTILIZA DO OPERADOR % para fazer o wrap da tartaruga corretamente
  823.  
  824.     gotoxy((x+1)%(LARGURA-2)+4,y);  printf("\\");
  825.     gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("/");
  826.  
  827.     gotoxy((x+2)%(LARGURA-2)+4,y);  printf("/");
  828.     gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("\\");
  829.  
  830.     gotoxy((x+3)%(LARGURA-2)+4,y);  printf("\\");
  831.     gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("/");
  832.  
  833.  
  834.  
  835.     if(cima>= 15 && cima<20 && afunda==atual)     //printa a tartaruga indo afundar, (caso ela tenha sido escolhda somente)
  836.     {
  837.         gotoxy((x)%(LARGURA-2)+4,y); printf("\\");  ///UTILIZA DO OPERADOR % para fazer o wrap da tartaruga corretamente
  838.         gotoxy((x)%(LARGURA-2)+4,y+1);printf("/");
  839.  
  840.         gotoxy((x+1)%(LARGURA-2)+4,y); printf("/");
  841.         gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("\\");
  842.  
  843.         gotoxy((x+2)%(LARGURA-2)+4,y); printf("\\");
  844.         gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("/");
  845.  
  846.         gotoxy((x+3)%(LARGURA-2)+4,y); printf("/");
  847.         gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("\\");
  848.  
  849.     }
  850.     else
  851.         if (cima>= 20 && cima<=25 && afunda==atual) //printa agua no lugar (pois ela esta submergida)
  852.         {
  853.             textcolor(BLUE);
  854.             gotoxy((x)%(LARGURA-2)+4,y);printf("~");   ///UTILIZA DO OPERADOR % para fazer o wrap da tartaruga corretamente
  855.             gotoxy((x)%(LARGURA-2)+4,y+1);printf("~");
  856.  
  857.             gotoxy((x+1)%(LARGURA-2)+4,y);printf("~");
  858.             gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("~");
  859.  
  860.             gotoxy((x+2)%(LARGURA-2)+4,y);printf("~");
  861.             gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("~");
  862.  
  863.             gotoxy((x+3)%(LARGURA-2)+4,y);printf("~");
  864.             gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("~");
  865.         }
  866.  
  867.     if(speed<0 && afunda!=atual) //preenche corretamente a tabela de colisão
  868.     {
  869.         for(i=0; i<4; i++)
  870.         {
  871.             colisao[y][(x+i)%(LARGURA-2)+4]=MOV_LEFT;
  872.             colisao[y+1][(x+i)%(LARGURA-2)+4]=MOV_LEFT;
  873.         }
  874.     }
  875.     else
  876.         if (speed<0 && cima>20 && afunda==atual) //preenche corretamente a tabela de colisão
  877.         {
  878.             colisao[y][(x+i)%(LARGURA-2)+4]=BUSY;
  879.             colisao[y+1][(x+i)%(LARGURA-2)+4]=BUSY;
  880.         }
  881.  
  882.  
  883.     if(speed>0 && afunda!=atual) //preenche corretamente a tabela de colisão
  884.     {
  885.         for(i=0; i<4; i++)
  886.         {
  887.             colisao[y][(x+i)%(LARGURA-2)+4]=MOV_RIGHT;
  888.             colisao[y+1][(x+i)%(LARGURA-2)+4]=MOV_RIGHT;
  889.         }
  890.     }
  891.     else
  892.         if (speed>0 && cima>20 && afunda==atual) //preenche corretamente a tabela de colisão
  893.         {
  894.             colisao[y][(x+i)%(LARGURA-2)+4]=BUSY;
  895.             colisao[y+1][(x+i)%(LARGURA-2)+4]=BUSY;
  896.         }
  897.  
  898.     turtle->coluna_inicial= x; //passa os novos valores da posição da tartaruga pro ponteiro
  899.     turtle->linha_inicial= y;
  900.  
  901.     textcolor(WHITE);
  902. }
  903.  
  904. /**Monta a tabela inicial de colisão
  905. baseado nos lugares que tem agua ou dos que não tem nada**/
  906. void tabela_colisao(int colTable[][LARGURA])
  907. {
  908.     int i, j;
  909.  
  910.     for(j=0; j<ALTURA; j++)            //preenche toda a matriz de colisão
  911.         for(i=0; i<LARGURA; i++)
  912.         {
  913.             if(j<ALTURA/2 - 1)         //preenche com BUSY para onde tem agua
  914.                 colTable[j][i]=BUSY;
  915.             else                       //e FREE onde não tem nada
  916.                 colTable[j][i]=FREE;
  917.         }
  918. }
  919.  
  920. ///Limpa um frog em uma posição x,y
  921. void clear_frog(int ex, int ey)
  922. {
  923.     gotoxy(ex,ey);
  924.     printf("  ");
  925.     gotoxy(ex,ey+1);
  926.     printf("  ");
  927. }
  928.  
  929. ///Limpa uma linha
  930. void clear_line(int x)
  931. {
  932.     gotoxy(1,x);
  933.     printf("                                                                   ");
  934. }
  935.  
  936. ///Animação de vitória
  937. void ganhou()
  938. {
  939.     int i;
  940.  
  941.     clrscr();
  942.     textcolor(YELLOW);
  943.     PlaySound(NULL, 0, 0);
  944.     PlaySound("Ending_1", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
  945.  
  946.     srand(time(NULL));
  947.  
  948.     for(i=0; i<1000; i++)                     //printa simbolos de "$" em posições aleatórias
  949.     {
  950.         gotoxy(1 + (rand() % LARGURA ), 1 + (rand() % ALTURA));
  951.         printf("$");
  952.         Sleep(3);
  953.     }
  954.  
  955.     clrscr();  //limpa a tela
  956.  
  957.     gotoxy(2,10); printf(" __      __                                       __            ");   //printa a tela de vitória
  958.     gotoxy(2,11); printf("/  \\    /  |                                     /  |           ");
  959.     gotoxy(2,12); printf("$$  \\  /$$/______   __    __        __   __   __ $$/  _______   ");
  960.     gotoxy(2,13); printf(" $$  \\/$$//      \\ /  |  /  |      /  | /  | /  |/  |/       \\  ");
  961.     gotoxy(2,14); printf("  $$  $$//$$$$$$  |$$ |  $$ |      $$ | $$ | $$ |$$ |$$$$$$$  | ");
  962.     gotoxy(2,15); printf("   $$$$/ $$ |  $$ |$$ |  $$ |      $$ | $$ | $$ |$$ |$$ |  $$ | ");
  963.     gotoxy(2,16); printf("    $$ | $$ \\__$$ |$$ \\__$$ |      $$ \\_$$ \\_$$ |$$ |$$ |  $$ | ");
  964.     gotoxy(2,17); printf("    $$ | $$    $$/ $$    $$/       $$   $$   $$/ $$ |$$ |  $$ | ");
  965.     gotoxy(2,18); printf("    $$/   $$$$$$/   $$$$$$/         $$$$$/$$$$/  $$/ $$/   $$/  ");
  966.  
  967.     for(i=0; i<1000; i++)                     //printa simbolos de "$" em posições aleatórias
  968.     {
  969.         gotoxy(1 + (rand() % LARGURA), 1 + (rand() % 9));             printf("$");
  970.         gotoxy(1 + (rand() % LARGURA), 20+ (rand() % (ALTURA - 19))); printf("$");
  971.         Sleep(4);
  972.     }
  973.  
  974.     Sleep(2000);
  975.     clrscr();
  976.     textcolor(GREEN);
  977.     PlaySound(NULL, 0, 0);
  978.     PlaySound("Ending_2", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
  979.  
  980.  
  981.     for(i=0; i>-47; i--)             //printa a animação de vitória
  982.     {
  983.         if(10+i>1)              {gotoxy(10,10+i);printf("         ____  __.---""---.__  ____             ");}
  984.         if(11+i>1)              {gotoxy(10,11+i);printf("        /####\\/              \\/####\\         ");}
  985.         if(12+i>1)              {gotoxy(10,12+i);printf("       (   /\\ )              ( /\\   )         ");}
  986.         if(13+i>1)              {gotoxy(10,13+i);printf("        \\____/                \\____/          ");}
  987.         if(14+i>1)              {gotoxy(10,14+i);printf("      __/                          \\__         ");}
  988.         if(15+i>1)              {gotoxy(10,15+i);printf("   .-'    .                      .    '-.       ");}
  989.         if(16+i>1)              {gotoxy(10,16+i);printf("   |  |   \\.._                _../   |  |      ");}
  990.         if(17+i>1)              {gotoxy(10,17+i);printf("    \\  \\    \\.'-.__________.-'./    /  /     ");}
  991.         if(18+i>1)              {gotoxy(10,18+i);printf("      \\  \\   '--.________.--'    /  /         ");}
  992.         if(19+i>1)              {gotoxy(10,19+i);printf("    ___\\  \\_                    _/  /___      ");}
  993.         if(20+i>1)              {gotoxy(10,20+i);printf("  ./    )))))                  (((((    \\.     ");}
  994.         if(21+i>1)              {gotoxy(10,21+i);printf("  \\                                      /     ");}
  995.         if(22+i>1)              {gotoxy(10,22+i);printf("   \\           \\_          _/           /     ");}
  996.         if(23+i>1)              {gotoxy(10,23+i);printf("     \\   \\____/''-.____.-''\\____/    /       ");}
  997.         if(24+i>1)              {gotoxy(10,24+i);printf("      \\    \\                  /    /          ");}
  998.         if(25+i>1)              {gotoxy(10,25+i);printf("        \\.  .|                |.  ./           ");}
  999.         if(26+i>1)              {gotoxy(10,26+i);printf("      .' / |  \\              /  | \\  '.       ");}
  1000.         if(27+i>1)              {gotoxy(10,27+i);printf("   .'  /   |   \\            /   |   \\   '.    ");}
  1001.         if(28+i>1)              {gotoxy(10,28+i);printf("  /.-./.--.|.--.\\          /.--.|.--.\\.-.|    ");}
  1002.         if(29+i>1)              {gotoxy(10,29+i);printf("                                                ");}
  1003.         if(32+i>1)              {gotoxy(10,32+i);printf("                 ---CREDITOS---                 ");}
  1004.         if(33+i>1)              {gotoxy(10,33+i);printf("                                                ");}
  1005.         if(34+i>1)              {gotoxy(10,34+i);printf("                  FELIPE LEIVAS                 ");}
  1006.         if(35+i>1)              {gotoxy(10,35+i);printf("                                                ");}
  1007.         if(36+i>1)              {gotoxy(10,36+i);printf("                  OTAVIO JACOBI                 ");}
  1008.         if(37+i>1)              {gotoxy(10,37+i);printf("                                                ");}
  1009.         if(38+i>1)              {gotoxy(10,38+i);printf("                 ---MUSICAS---                  ");}
  1010.         if(39+i>1)              {gotoxy(10,39+i);printf("                                                ");}
  1011.         if(40+i>1 && 40+i<40)   {gotoxy(10,40+i);printf("              Windfall - The FatRat             ");}
  1012.         if(41+i>1 && 41+i<40)   {gotoxy(10,41+i);printf("                                                ");}
  1013.         if(42+i>1 && 42+i<40)   {gotoxy(10,42+i);printf("                   SAMBA SHOW                   ");}
  1014.         if(43+i>1 && 43+i<40)   {gotoxy(10,43+i);printf("                                                ");}
  1015.         if(44+i>1 && 44+i<40)   {gotoxy(10,44+i);printf("     Here comes the money - Naughty  by Nature  ");}
  1016.         if(45+i>1 && 45+i<40)   {gotoxy(10,45+i);printf("                                                ");}
  1017.         if(46+i>1 && 46+i<40)   {gotoxy(10,46+i);printf("           Frog's theme - Chrone Trigger        ");}
  1018.         if(47+i>1 && 47+i<40)   {gotoxy(10,47+i);printf("                                                ");}
  1019.  
  1020.  
  1021.         if(kbhit())
  1022.             break;
  1023.  
  1024.         Sleep(500);
  1025.     }
  1026.  
  1027. }
  1028.  
  1029. /**Mesma função main só que com as opções para carregar o arquivo**/
  1030. void save_main(FILE *high)
  1031. {
  1032.     ///mesmo cabeçalho da main()
  1033.     int life=VIDAS_INICIAIS;// vidas do jogador
  1034.     char cursor;//vai ser o caracter que verifica se o jogador aperto ESC
  1035.     int movimentos=MOVIMENTOS,tartaruga_cima=0,i,frog_stats, afunda=0, dificuldade=0,ganho,score,loaded=0,carregou=0;
  1036.     int matriz_colisao[ALTURA][LARGURA];
  1037.  
  1038.     FILE *salvo;
  1039.  
  1040.     Objeto trunk[9];
  1041.     Objeto car[13];
  1042.     Objeto turtle[9];
  1043.  
  1044.     HIGHSCORE jogador;
  1045.  
  1046.     Objeto frog;
  1047.  
  1048.     CASA_SAPO casas[5]= {{0},{0},{0},{0},{0}};
  1049.     score = MAX_PONT;
  1050.  
  1051.     PlaySound("song.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
  1052.     srand(time(NULL));
  1053.  
  1054.     do
  1055.     {
  1056.         system("cls");
  1057.         frog.coluna_inicial =LARGURA/2;//
  1058.         frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  1059.         if(loaded!=0)
  1060.             frog_inicial(&frog);
  1061.  
  1062.         print_water(casas);   //printa a agua e as casas na posição correta
  1063.  
  1064.         if(loaded==0)
  1065.         {
  1066.             salvo=fopen("fase.bin","rb");   //abre o fase.bin para leitura e mostra msg de erro caso de erro
  1067.             if(!salvo)
  1068.             {
  1069.                 clrscr();
  1070.                 printf("\aError ao abrir o aquivo");
  1071.                 getch();
  1072.                 life=-5;
  1073.             }
  1074.                 else
  1075.                 {
  1076.                     for(i=0; i<9; i++)   //le a posição dos troncos e mostra msg de erro caso de erro
  1077.                     {
  1078.                         if( fread(&trunk[i],sizeof(Objeto),1,salvo) !=1)
  1079.                         {
  1080.                             clrscr();
  1081.                             printf("Erro ao salvar o arquivo");
  1082.                             fclose(salvo);
  1083.                         }
  1084.  
  1085.                     }
  1086.                     for(i=0; i<13; i++) //le a posição dos carros e mostra msg de erro caso de erro
  1087.                     {
  1088.                         if( fread(&car[i],sizeof(Objeto),1,salvo) !=1)
  1089.                         {
  1090.                             clrscr();
  1091.                             printf("Erro ao salvar o arquivo");
  1092.                             fclose(salvo);
  1093.                         }
  1094.  
  1095.                     }
  1096.                     for(i=0; i<9; i++) //lê a posição das tartarugas e mostra msg de erro caso de erro
  1097.                     {
  1098.                         if( fread(&turtle[i],sizeof(Objeto),1,salvo) !=1)
  1099.                         {
  1100.                             clrscr();
  1101.                             printf("Erro ao salvar o arquivo");
  1102.                             fclose(salvo);
  1103.                         }
  1104.  
  1105.                     }
  1106.                     if(1 != fread(&frog,sizeof(Objeto),1,salvo)) //lê a posição do frog e mostra msg de erro caso de erro
  1107.                     {
  1108.                         clrscr();
  1109.                         printf("Erro ao salvar o arquivo");
  1110.                         fclose(salvo);
  1111.                     }
  1112.                     if(1 != fread(&movimentos,sizeof(int),1,salvo)) //lê a quantidade de movimentos restantes e mostra msg de erro caso de erro
  1113.                     {
  1114.                         clrscr();
  1115.                         printf("Erro ao salvar o arquivo");
  1116.                         fclose(salvo);
  1117.                     }
  1118.                     if(1 != fread(&life,sizeof(int),1,salvo)) //lê quantas vidas restantes e mostra msg de erro caso de erro
  1119.                     {
  1120.                         clrscr();
  1121.                         printf("Erro ao salvar o arquivo");
  1122.                         fclose(salvo);
  1123.                     }
  1124.                     if(1 != fread(&ganho,sizeof(int),1,salvo)) //lê o estado e mostra msg de erro caso de erro
  1125.                     {
  1126.                         clrscr();
  1127.                         printf("Erro ao salvar o arquivo");
  1128.                         fclose(salvo);
  1129.                     }
  1130.                     if(1 != fread(&tartaruga_cima,sizeof(int),1,salvo)) //lê o estado da tartaruga e mostra msg de erro caso de erro
  1131.                     {
  1132.                         clrscr();
  1133.                         printf("Erro ao salvar o arquivo");
  1134.                         fclose(salvo);
  1135.                     }
  1136.                     if(1 != fread(&dificuldade,sizeof(int),1,salvo))  //lê a dificuldade e mostra msg de erro caso de erro
  1137.                     {
  1138.                         clrscr();
  1139.                         printf("Erro ao salvar o arquivo");
  1140.                         fclose(salvo);
  1141.                     }
  1142.                     for(i=0;i<5;i++)
  1143.                     {
  1144.                         if(1 != fread(&casas[i],sizeof(CASA_SAPO),1,salvo))  //lê os estados das casas e mostra msg de erro caso de erro
  1145.                         {
  1146.                             clrscr();
  1147.                             printf("Erro ao salvar o arquivo");
  1148.                             fclose(salvo);
  1149.                         }
  1150.                     }
  1151.                     if(1 != fread(&afunda,sizeof(int),1,salvo))  //lê o estado da tartaruga 2 e mostra msg de erro caso de erro
  1152.                     {
  1153.                         clrscr();
  1154.                         printf("Erro ao salvar o arquivo");
  1155.                         fclose(salvo);
  1156.                     }
  1157.                     if(1 != fread(&score,sizeof(int),1,salvo)) //lê o score e mostra msg de erro caso de erro
  1158.                     {
  1159.                         clrscr();
  1160.                         printf("Erro ao salvar o arquivo");
  1161.                         fclose(salvo);
  1162.                     }
  1163.                 carregou=TRUE;  //altera o estado para "carregado"
  1164.                 }
  1165.                 loaded=TRUE;
  1166.                 fclose(salvo);
  1167.             }
  1168.  
  1169.             if(carregou!=FALSE) //se carregou o arquivo
  1170.             {
  1171.                 do   ///igual o main do jogo
  1172.                 {
  1173.                     tabela_colisao(matriz_colisao);   //preenche a tabela de colisão
  1174.  
  1175.                     textcolor(YELLOW);
  1176.                     gotoxy(1,1);
  1177.                     printf("    Movimentos restantes:|%d Score: %d|Vidas restantes: ",movimentos, score); //printa as informações
  1178.  
  1179.                     for(i=0; i<life+1; i++) //printa as vidas
  1180.                     {
  1181.                         textcolor(RED);
  1182.                         gotoxy(59+i,1);
  1183.                         printf("%c", 3);
  1184.                     }
  1185.  
  1186.                     print_water(casas);
  1187.  
  1188.                     //LockWindowUpdate(GetConsoleWindow());
  1189.  
  1190.                     for(i=0; i<9; i++)
  1191.                         move_trunk(& trunk[i],matriz_colisao);//move os  tronco do arranjo
  1192.  
  1193.                     for(i=0; i<13; i++)
  1194.                         move_car(&car[i],matriz_colisao); // move os carros
  1195.  
  1196.                     for(i=0; i<9; i++)
  1197.                         move_turtle(& turtle[i], & tartaruga_cima, matriz_colisao, afunda, i); // move as tartarugas
  1198.  
  1199.                     clear_line(15);  //limpa a linha pra não haver duplicação do sapo
  1200.                     clear_line(16);
  1201.                     frog_inicial(&frog); //printa o frog a partir da sua posição inicial
  1202.  
  1203.                     //LockWindowUpdate(NULL);
  1204.  
  1205.                     i=0;  //reseta o i para o loop
  1206.                     frog_stats=0; //reseta o status do sapo
  1207.  
  1208.                     while(i<10000-dificuldade)// faz o tempo para os carros se mecherem
  1209.                     {
  1210.                         i++;           //aumenta o contador para cada loop
  1211.                         if(kbhit())    //caso toque uma tela
  1212.                             move_frog(&frog, &cursor, &movimentos, &score);  //move o frog para a posição correta, diminui a quantidade de movimentos e o score
  1213.  
  1214.                         if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial] ==BUSY) movimentos=0;               //colisão com carros e agua mata o sapo
  1215.                         if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+1] ==BUSY) movimentos=0;
  1216.                         if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial] ==BUSY) movimentos=0;
  1217.                         if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==BUSY) movimentos=0;
  1218.  
  1219.                         if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+0] ==MOV_LEFT) frog_stats=MOV_LEFT;                //colisão com objeto andando pra a esquerda
  1220.                         if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+1] ==MOV_LEFT) frog_stats=MOV_LEFT;                //faz o sapo assumir estado movendo para a esquerda
  1221.                         if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+0] ==MOV_LEFT) frog_stats=MOV_LEFT;
  1222.                         if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==MOV_LEFT) frog_stats=MOV_LEFT;
  1223.  
  1224.                         if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+0] ==MOV_RIGHT) frog_stats=MOV_RIGHT;               //colisão com objeto andando pra a direita
  1225.                         if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+1] ==MOV_RIGHT) frog_stats=MOV_RIGHT;               //faz o sapo assumir estado movendo para a direita
  1226.                         if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+0] ==MOV_RIGHT) frog_stats=MOV_RIGHT;
  1227.                         if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==MOV_RIGHT) frog_stats=MOV_RIGHT;
  1228.  
  1229.  
  1230.                         if ((frog.linha_inicial==3) && (frog.coluna_inicial==6 || frog.coluna_inicial==8 || frog.coluna_inicial==10))  //acerta estado para caso o sapo entre na casa 1
  1231.                         {
  1232.                             score += 50;                 //soma 50 pontos
  1233.                             casas[0].win = TRUE;         //estado da casa 1 vai para verdadeiro (1)
  1234.                             dificuldade+=500;            //aumenta a dificuldade
  1235.                             movimentos=MOVIMENTOS;       //reseta os movimentos
  1236.                             life=VIDAS_INICIAIS;         //reseta as vidas
  1237.                             frog.coluna_inicial =LARGURA/2;//
  1238.                             frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  1239.                             frog_inicial(&frog);         //printa o frog na sua nova posição
  1240.                             clear_line(ALTURA-3);        //
  1241.                             clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  1242.  
  1243.                         }
  1244.                         if((frog.linha_inicial==3) && (frog.coluna_inicial==18 || frog.coluna_inicial==20 || frog.coluna_inicial==22)) //acerta estado para caso o sapo entre na casa 2
  1245.                         {
  1246.                             score += 50;                 //soma 50 pontos
  1247.                             casas[1].win = TRUE;         //estado da casa 2 vai para verdadeiro (1)
  1248.                             dificuldade+=500;            //aumenta a dificuldade
  1249.                             movimentos=MOVIMENTOS;       //reseta os movimentos
  1250.                             life=VIDAS_INICIAIS;         //reseta as vidas
  1251.                             frog.coluna_inicial =LARGURA/2;//
  1252.                             frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  1253.                             frog_inicial(&frog);         //printa o frog na sua nova posição
  1254.                             clear_line(ALTURA-3);        //
  1255.                             clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  1256.  
  1257.                         }
  1258.                         if ((frog.linha_inicial==3) &&(frog.coluna_inicial==30 || frog.coluna_inicial==32 || frog.coluna_inicial==34)) //acerta estado para caso o sapo entre na casa 4
  1259.                         {
  1260.                             score += 50;                 //soma 50 pontos
  1261.                             casas[2].win = TRUE;         //estado da casa 3 vai para verdadeiro (1)
  1262.                             dificuldade+=500;            //aumenta a dificuldade
  1263.                             movimentos=MOVIMENTOS;       //reseta os movimentos
  1264.                             life=VIDAS_INICIAIS;         //reseta as vidas
  1265.                             frog.coluna_inicial =LARGURA/2;//
  1266.                             frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  1267.                             frog_inicial(&frog);         //printa o frog na sua nova posição
  1268.                             clear_line(ALTURA-3);        //
  1269.                             clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  1270.  
  1271.                         }
  1272.                         if((frog.linha_inicial==3) &&(frog.coluna_inicial==42 || frog.coluna_inicial==44 || frog.coluna_inicial==46)) //acerta estado para caso o sapo entre na casa 5
  1273.                         {
  1274.                             score += 50;                 //soma 50 pontos
  1275.                             casas[3].win = TRUE;         //estado da casa 4 vai para verdadeiro (1)
  1276.                             dificuldade+=500;            //aumenta a dificuldade
  1277.                             movimentos=MOVIMENTOS;       //reseta os movimentos
  1278.                             life=VIDAS_INICIAIS;         //reseta as vidas
  1279.                             frog.coluna_inicial =LARGURA/2;//
  1280.                             frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  1281.                             frog_inicial(&frog);         //printa o frog na sua nova posição
  1282.                             clear_line(ALTURA-3);        //
  1283.                             clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  1284.                         }
  1285.                         if((frog.linha_inicial==3) &&(frog.coluna_inicial==54 || frog.coluna_inicial==56 || frog.coluna_inicial==58)) //acerta estado para caso o sapo entre na casa 4
  1286.                         {
  1287.                             score += 50;                 //soma 50 pontos
  1288.                             casas[4].win = TRUE;         //estado da casa 5 vai para verdadeiro (1)
  1289.                             dificuldade+=500;            //aumenta a dificuldade
  1290.                             movimentos=MOVIMENTOS;       //reseta os movimentos
  1291.                             life=VIDAS_INICIAIS;         //reseta as vidas
  1292.                             frog.coluna_inicial =LARGURA/2;//
  1293.                             frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
  1294.                             frog_inicial(&frog);         //printa o frog na sua nova posição
  1295.                             clear_line(ALTURA-3);        //
  1296.                             clear_line(ALTURA-2);        //limpa as linhas de baixo (para não haver duplicação do sapo)
  1297.                         }
  1298.  
  1299.                     }
  1300.  
  1301.                     if(frog_stats==MOV_LEFT)        //caso o estado seja MOV_LEFT
  1302.                         frog.coluna_inicial-=2;     //move o sapo junto com o tronco para a esquerda
  1303.                     if(frog_stats==MOV_RIGHT)       //caso o estado seja MOV_RIGHT
  1304.                         frog.coluna_inicial+=2;     //move o sapo junto com o tronco para a direita
  1305.  
  1306.                     tartaruga_cima++;   //altera gradativamente o estado da tartaruga
  1307.  
  1308.                     if(tartaruga_cima==25) //looping de tartaruga e ve qual que vai afundar
  1309.                     {
  1310.                         tartaruga_cima=0;
  1311.                         afunda = rand()%9;  //sorteia tartaruga random entre 1-9 para afunda
  1312.                     }
  1313.  
  1314.                     if(casas[0].win==1 && casas[1].win==1 && casas[2].win==1 && casas[3].win==1 && casas[4].win==1)  //verifica o estado das casas, se todas estiverem sido "ocupadas" ganha o jogo
  1315.                     {
  1316.                         ganhou();  //função para ganhar o jogo
  1317.                         ganho=1;   //altera o estado para não entrar em looping
  1318.                         save_name_score(high, &jogador, score);
  1319.                     }
  1320.                     if(cursor=='f')  //se pedir para salvar
  1321.                     {
  1322.                         salvo=fopen("fase.bin","wb");            //abre/cria arquivo para escrita
  1323.                         if(!salvo)                               //se der problema para salvar
  1324.                             printf("\aError ao abrir o aquivo"); //msg de erro
  1325.                         else                                     //senão
  1326.                         {
  1327.                             for(i=0; i<9; i++)
  1328.                             {
  1329.                                 if( fwrite(&trunk[i],sizeof(Objeto),1,salvo) !=1) //salva as posições dos troncos e msg de erro caso de erro
  1330.                                 {
  1331.                                     clrscr();
  1332.                                     printf("Erro ao salvar o arquivo");
  1333.                                     fclose(salvo);
  1334.                                 }
  1335.  
  1336.                             }
  1337.                             for(i=0; i<13; i++)
  1338.                             {
  1339.                                 if( fwrite(&car[i],sizeof(Objeto),1,salvo) !=1)  //salva as posições dos carros e msg de erro caso de erro
  1340.                                 {
  1341.                                     clrscr();
  1342.                                     printf("Erro ao salvar o arquivo");
  1343.                                     fclose(salvo);
  1344.                                 }
  1345.  
  1346.                             }
  1347.                             for(i=0; i<9; i++)
  1348.                             {
  1349.                                 if( fwrite(&turtle[i],sizeof(Objeto),1,salvo) !=1) //salva as posições da tartaruga e msg de erro caso de erro
  1350.                                 {
  1351.                                     clrscr();
  1352.                                     printf("Erro ao salvar o arquivo");
  1353.                                     fclose(salvo);
  1354.                                 }
  1355.  
  1356.                             }
  1357.                             if(1 != fwrite(&frog,sizeof(Objeto),1,salvo))     //salva a posição do frog e msg de erro caso de erro
  1358.                             {
  1359.                                 clrscr();
  1360.                                 printf("Erro ao salvar o arquivo");
  1361.                                 fclose(salvo);
  1362.                             }
  1363.                             if(!( fwrite(&movimentos,sizeof(int),1,salvo)))       //salva quantos movimentos restantes e msg de erro caso de erro
  1364.                             {
  1365.                                 clrscr();
  1366.                                 printf("Erro ao salvar o arquivo");
  1367.                                 fclose(salvo);
  1368.                             }
  1369.                             if(1 != fwrite(&life,sizeof(int),1,salvo))            //salva quantas vidas e msg de erro caso de erro
  1370.                             {
  1371.                                 clrscr();
  1372.                                 printf("Erro ao salvar o arquivo");
  1373.                                 fclose(salvo);
  1374.                             }
  1375.                             if(1 != fwrite(&ganho,sizeof(int),1,salvo))         //salva se já ganhou o jogo e msg de erro caso de erro
  1376.                             {
  1377.                                 clrscr();
  1378.                                 printf("Erro ao salvar o arquivo");
  1379.                                 fclose(salvo);
  1380.                             }
  1381.                             if(1 != fwrite(&tartaruga_cima,sizeof(int),1,salvo)) //salva o estado da tartaruga e msg de erro caso de erro
  1382.                             {
  1383.                                 clrscr();
  1384.                                 printf("Erro ao salvar o arquivo");
  1385.                                 fclose(salvo);
  1386.                             }
  1387.                             if(1 != fwrite(&dificuldade,sizeof(int),1,salvo))  //salva a dificuldade e e msg de erro caso de erro
  1388.                             {
  1389.                                 clrscr();
  1390.                                 printf("Erro ao salvar o arquivo");
  1391.                                 fclose(salvo);
  1392.                             }
  1393.                             for(i=0;i<5;i++)
  1394.                             {
  1395.                                 if(1 != fwrite(&casas[i],sizeof(CASA_SAPO),1,salvo))  //salva quais casas foram ocupadas e msg de erro caso de erro
  1396.                                 {
  1397.                                     clrscr();
  1398.                                     printf("Erro ao salvar o arquivo");
  1399.                                     fclose(salvo);
  1400.                                 }
  1401.                              }
  1402.                             if(1 != fwrite(&afunda,sizeof(int),1,salvo)) //salva qual tartaruga afundou e msg de erro caso de erro
  1403.                             {
  1404.                                 clrscr();
  1405.                                 printf("Erro ao salvar o arquivo");
  1406.                                 fclose(salvo);
  1407.                             }
  1408.                             if(1 != fwrite(&score,sizeof(int),1,salvo)) //salva a pontuação e msg de erro caso de erro
  1409.                             {
  1410.                                 clrscr();
  1411.                                 printf("Erro ao salvar o arquivo");
  1412.                                 fclose(salvo);
  1413.                             }
  1414.                         }
  1415.  
  1416.                         fclose(salvo);   //fecha o arquivo
  1417.                     }
  1418.  
  1419.                     cursor=tolower(cursor);  //caracter pego do teclado vai para minusculo
  1420.  
  1421.                 }while(movimentos>0 && cursor!='r'&&ganho!=1 && cursor!='q');  //jogo segue enquanto movimentos maior que 0, cursor diferente r (reset posicao) e cursor diferente de q (fim do jogo)
  1422.  
  1423.                 if(movimentos<=0) //caso tenha morrido
  1424.                 {
  1425.                     system("cls");  //limpa a tela
  1426.                     life--;         //diminui uma vida
  1427.                     you_died();     //tela de morreu
  1428.                     fflush(stdin);  //limpa buffer
  1429.                     movimentos=MOVIMENTOS; //reinicia a quantidade de movimentos
  1430.                 }
  1431.             }
  1432.  
  1433.     }while(life>=0 && cursor!='q' && ganho!=1); //enquanto tiver vidas e cursor diferente de q(fim do jogo)
  1434.  
  1435.     PlaySound(NULL, 0, 0);
  1436.  
  1437. }
  1438.  
  1439. /**Salva a pontuação no arquivo
  1440. .txt de highscores**/
  1441. void save_name_score(FILE *high, HIGHSCORE *jogador, int score)
  1442. {
  1443.     clrscr();
  1444.     textcolor(YELLOW);                                                             //printa a tela
  1445.     gotoxy(9,4); printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
  1446.     gotoxy(9,5); printf("$                                                $");
  1447.     gotoxy(9,6); printf("$                                                $");
  1448.     gotoxy(9,7); printf("$                                                $");
  1449.     gotoxy(9,8); printf("$                                                $");
  1450.     gotoxy(9,9); printf("$                                                $");
  1451.     gotoxy(9,10);printf("$                                                $");
  1452.     gotoxy(9,11);printf("$                                                $");
  1453.     gotoxy(9,12);printf("$                                                $");
  1454.     gotoxy(9,13);printf("$                                                $");
  1455.     gotoxy(9,14);printf("$                                                $");
  1456.     gotoxy(9,15);printf("$                                                $");
  1457.     gotoxy(9,16);printf("$                                                $");
  1458.     gotoxy(9,17);printf("$                                                $");
  1459.     gotoxy(9,18);printf("$                                                $");
  1460.     gotoxy(9,19);printf("$                                                $");
  1461.     gotoxy(9,20);printf("$                                                $");
  1462.     gotoxy(9,21);printf("$                                                $");
  1463.     gotoxy(9,22);printf("$                                                $");
  1464.     gotoxy(9,23);printf("$                                                $");
  1465.     gotoxy(9,24);printf("$                                                $");
  1466.     gotoxy(9,25);printf("$                                                $");
  1467.     gotoxy(9,26);printf("$                                                $");
  1468.     gotoxy(9,27);printf("$                                                $");
  1469.     gotoxy(9,28);printf("$                                                $");
  1470.     gotoxy(9,29);printf("$                                                $");
  1471.     gotoxy(9,30);printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
  1472.     textcolor(GREEN);
  1473.  
  1474.     gotoxy(15,6); printf("Parabens, VOCE VENCEU!!!");
  1475.     gotoxy(15,7); printf("Sua Pontuacao foi de %d pontos!!", score);
  1476.  
  1477.     gotoxy(10,10);printf("         ____  __.---""---.__  ____             ");
  1478.     gotoxy(10,11);printf("        /####\\/              \\/####\\         ");
  1479.     gotoxy(10,12);printf("       (   /\\ )              ( /\\   )         ");
  1480.     gotoxy(10,13);printf("        \\____/                \\____/          ");
  1481.     gotoxy(10,14);printf("      __/                          \\__         ");
  1482.     gotoxy(10,15);printf("   .-'                                '-.       ");
  1483.     gotoxy(10,16);printf("   |                                    |       ");
  1484.     gotoxy(10,17);printf("    \\  \\                           /  /       ");
  1485.     gotoxy(10,18);printf("      \\  \\                      /  /          ");
  1486.     gotoxy(10,19);printf("    ___\\  \\_                    _/  /___      ");
  1487.     gotoxy(10,20);printf("  ./    )))))                  (((((    \\.     ");
  1488.     gotoxy(10,21);printf("  \\                                      /     ");
  1489.     gotoxy(10,22);printf("   \\           \\_          _/           /     ");
  1490.     gotoxy(10,23);printf("     \\   \\____/''-.____.-''\\____/    /       ");
  1491.     gotoxy(10,24);printf("      \\    \\                  /    /          ");
  1492.     gotoxy(10,25);printf("        \\.  .|                |.  ./           ");
  1493.     gotoxy(10,26);printf("      .' / |  \\              /  | \\  '.       ");
  1494.     gotoxy(10,27);printf("   .'  /   |   \\            /   |   \\   '.    ");
  1495.     gotoxy(10,28);printf("  /.-./.--.|.--.\\          /.--.|.--.\\.-.|    ");
  1496.     fflush(stdin);
  1497.     gotoxy(14,16); printf("Digite seu nome: ");                                //coloca o nome do jogador no buffer
  1498.     scanf("%s", jogador->nome);
  1499.     jogador->score = score;
  1500.  
  1501.     if ((high = fopen ("highscores.txt", "a+"))==NULL)           //abre/cria o arquivo para adicionar linha no final
  1502.         printf("Erro ao abrir o arquivo");
  1503.         else
  1504.            {
  1505.                //putc('\n', high);
  1506.                fprintf(high, "%s %d\n", jogador->nome, jogador->score);     //salva no .txt
  1507.                fclose(high);
  1508.            }
  1509. }
  1510. /**Ordena o highscores.txt**/
  1511. void ordena_score()
  1512. {
  1513.     char nome[255], auxs[30];          //variaveis auxiliares
  1514.     FILE *score;                       //ponteiro do arquivo
  1515.     HIGHSCORE scores[255];             //variavel do tipo HIGHSCORE para buffer
  1516.     int i=0,j=0,c=0,auxi;              //int auxiliares
  1517.  
  1518.     score=fopen("highscores.txt","r+");   //abre o arquivo praa leitura
  1519.  
  1520.  
  1521.     if(!score)                    //msg caso de erro ao abrir
  1522.         printf("Erro ao ordenar");
  1523.     else
  1524.     {
  1525.  
  1526.         while(!feof(score))                            //enquanto não chega no fim do arquivo
  1527.         {
  1528.             fgets(nome,255,score);                     //pega a string do primeiro da posição
  1529.             strcpy(scores[i].nome,strtok(nome," "));   //separa em tokens
  1530.             scores[i].score =atoi(strtok(NULL," "));   //e passa para inteiro
  1531.             i++;                                    //para contar o numero strings
  1532.  
  1533.         }
  1534.  
  1535.         for(c=i-1;c>=1;c--)    //bubble sort
  1536.         {
  1537.            for(j=0;j<c;j++)
  1538.            {
  1539.                if (scores[j].score<scores[j+1].score)
  1540.                {
  1541.                    auxi = scores[j].score;                //inverte os numeros
  1542.                    scores[j].score=scores[j+1].score;
  1543.                    scores[j+1].score=auxi;
  1544.  
  1545.                    strcpy(auxs, scores[j].nome);           //inverte as strings
  1546.                    strcpy(scores[j].nome, scores[j+1].nome);
  1547.                    strcpy(scores[j+1].nome, auxs);
  1548.  
  1549.                }
  1550.            }
  1551.         }
  1552.         rewind(score);  //recomeça para salvar
  1553.         i--;         //porque o i excede em 1
  1554.         for(j=0;j<i;j++) //salva os arquivos
  1555.             fprintf(score,"%s %d\n",scores[j].nome, scores[j].score);
  1556.  
  1557.         fclose(score); //fecha arquivo
  1558.     }
  1559.  
  1560. }
  1561.  
  1562. /**Carrega e mostra os 5 arquivos do topo do .txt**/
  1563. void highscore(FILE *high) //printa os highscores
  1564. {
  1565.     char buffer[255];  //buffer temporário
  1566.     int achou=0;       //caso ache o arquivo
  1567.  
  1568.     ordena_score();       //ordena o arquivo
  1569.  
  1570.     PlaySound(NULL, 0, 0);
  1571.     PlaySound("Ending_1", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
  1572.  
  1573.     clrscr();
  1574.     textcolor(YELLOW);                                                             //printa a tela
  1575.     gotoxy(9,4); printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
  1576.     gotoxy(9,5); printf("$                                                $");
  1577.     gotoxy(9,6); printf("$                  HIGHSCORES                    $");
  1578.     gotoxy(9,7); printf("$                                                $");
  1579.     gotoxy(9,8); printf("$                                                $");
  1580.     gotoxy(9,9); printf("$                                                $");
  1581.     gotoxy(9,10);printf("$                                                $");
  1582.     gotoxy(9,11);printf("$                                                $");
  1583.     gotoxy(9,12);printf("$                                                $");
  1584.     gotoxy(9,13);printf("$                                                $");
  1585.     gotoxy(9,14);printf("$                                                $");
  1586.     gotoxy(9,15);printf("$                                                $");
  1587.     gotoxy(9,16);printf("$                                                $");
  1588.     gotoxy(9,17);printf("$                                                $");
  1589.     gotoxy(9,18);printf("$                                                $");
  1590.     gotoxy(9,19);printf("$                                                $");
  1591.     gotoxy(9,20);printf("$                                                $");
  1592.     gotoxy(9,21);printf("$                                                $");
  1593.     gotoxy(9,22);printf("$                                                $");
  1594.     gotoxy(9,23);printf("$                                                $");
  1595.     gotoxy(9,24);printf("$                                                $");
  1596.     gotoxy(9,25);printf("$                                                $");
  1597.     gotoxy(9,26);printf("$                                                $");
  1598.     gotoxy(9,27);printf("$                                                $");
  1599.     gotoxy(9,28);printf("$                                                $");
  1600.     gotoxy(9,29);printf("$                                                $");
  1601.     gotoxy(9,30);printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
  1602.  
  1603.     if ((high = fopen ("highscores.txt", "r"))==NULL)         //abre o arquivo para leitura1
  1604.     {
  1605.             gotoxy(16,16);printf("Erro ao abrir o arquivo"); //msg de erro caso haja erro
  1606.     } else
  1607.         {
  1608.             while(!feof(high))       //enquanto não tiver no final do arquivo
  1609.             {
  1610.                 fgets(buffer,255,high);   //le o arquivo
  1611.                 gotoxy(24,10+achou);      //printa na posição correta
  1612.  
  1613.                 if(achou>=0 && achou<3)                     //limita a 5 o número de mostrados no highscore
  1614.                     printf("Usuario:%s", buffer);
  1615.  
  1616.                 achou++;
  1617.             }
  1618.             fclose(high); //fecha o arquivo
  1619.         }
  1620.     Sleep(10000);
  1621.     PlaySound(NULL, 0, 0);
  1622. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement