Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /** TRABALHO FINAL ALGORITMOS E PROGRAMAÇÃO
- FELIPE LEIVAS - 262528
- OTAVIO JACOBI - 261569
- LAYOUT DA JANELA 65/40
- **/
- #define _WIN32_WINNT 0x0500 //para retirar o flickering
- #include <conio2.h>
- #include <ctype.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <windows.h>
- #include <time.h>
- #define UP 72
- #define DOWN 80
- #define LEFT 75
- #define RIGHT 77
- #define MOVIMENTOS 50
- #define VIDAS_INICIAIS 3
- #define MAX_PONT 500
- #define LARGURA 60
- #define ALTURA 30
- #define FREE 0
- #define BUSY 1
- #define MOV_LEFT 2
- #define MOV_RIGHT 3
- #define TRUE 1
- #define FALSE 0
- typedef struct TIPO_FASE
- {
- char objeto;
- int tamanho;
- int espacamento;
- float velocidade;
- int linha_inicial;
- int coluna_inicial;
- } Objeto;
- typedef struct casa_sapo
- {
- int win;
- } CASA_SAPO;
- typedef struct highscore
- {
- char nome[260];
- int score;
- }HIGHSCORE;
- void save_name_score(FILE*, HIGHSCORE*, int);
- void clear_line(int);
- void end_animation();
- void ganhou();
- void clear_frog(int , int);
- void tabela_colisao(int [][LARGURA]);
- void move_turtle (Objeto*, int*,int [][LARGURA], int, int);
- void move_trunk(Objeto*, int [][LARGURA]);
- void move_car (Objeto*, int [][LARGURA]);
- void print_water();
- void frog_inicial(Objeto*);
- void you_died();
- int menuMain();
- void move_frog(Objeto*,char*, int*, int*);
- void highscore(FILE*);
- void gameMain(FILE*);
- void save_main(FILE*);
- int main()
- {
- FILE *high;
- while(1) //loop do jogo
- {
- PlaySound("menu.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //musica do menu
- switch(menuMain()) //menu inicial
- {
- case 1 : //caso escolha o primeiro, inicializa um novo jogo
- PlaySound(NULL, 0, 0);
- gameMain(high);
- break;
- case 2: //caso escolha o segundo, inicializa o jogo salvo
- PlaySound(NULL, 0, 0);
- save_main(high);
- break;
- case 3: //caso escolha o terceiro, mostra os highscores
- PlaySound(NULL, 0, 0);
- highscore(high);
- break;
- case 4: //caso escolha o quarto, sai do jogo
- system("cls");
- clrscr();
- system("pause");
- return 0;
- break;
- }
- }
- }
- /**Função principal do jogo**/
- void gameMain(FILE *high)
- {
- char cursor;//vai ser o caracter que verifica se o jogador aperto ESC
- int movimentos=MOVIMENTOS,tartaruga_cima=0,i,frog_stats, afunda=0, dificuldade=0,ganho,score= MAX_PONT,matriz_colisao[ALTURA][LARGURA], life=VIDAS_INICIAIS;
- /*quantidade de movimentos, estado da tartaruga, estado do sapo, dificuldade, pontuação máxima, matriz de colisão, quantidade de vidas*/
- FILE *salvo; //arquivo fase.bin
- Objeto trunk[9]= {{'T',4,4,-1,5,3} , {'T',3,3,-1,5,23}, {'T',4,4,-1,5,43} , // troncos
- {'T',3,4,-1,9,3} , {'T',3,4,-1,9,17}, {'T',3,4,-1,9,37},
- {'T',3,3,-1,13,3} , {'T',4,4,-1,13,15},{'T',4,4,-1,13,41}};
- Objeto car[13]= {{'C',4,3,1,17,4} , {'C',4,3,1,17,22},{'C',4,3,1,17,39}, //carros
- {'C',4,3,-1,19,4} , {'C',4,3,-1,19,22},{'C',4,3,-1,19,44},
- {'C',4,3,1,21,4} , {'C',4,3,1,21,22},{'C',4,3,1,21,34},
- {'C',4,3,-1,23,4} , {'C',4,3,-1,23,34},
- {'C',4,3,1,25,4} , {'C',4,3,1,25,36}};
- 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
- {'R', 2, 2, 1, 11, 3}, {'R', 2, 2, 1, 11, 18}, {'R', 2, 2, 1, 11, 33}, {'R', 2, 2, 1, 11, 48}};
- Objeto frog= {'S',1,0,0,15,15}; //sapo
- CASA_SAPO casas[5]= {{0},{0},{0},{0},{0}}; //estados das casas do sapo (ocupadas ou vazias)
- HIGHSCORE jogador;
- PlaySound("song.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //inicia a música principal do jogo
- srand(time(NULL)); //inicializa a seed random das tartarugas
- do
- {
- system("cls"); //limpa a tela antes de começar
- frog.coluna_inicial =LARGURA/2;
- frog.linha_inicial = ALTURA-3; //reseta a posição do sapo
- do
- {
- tabela_colisao(matriz_colisao); //inicializa a matriz de colisão
- textcolor(YELLOW); //cor amarela
- gotoxy(1,1);
- printf(" Movimentos restantes:|%d Score: %d|Vidas restantes: ",movimentos, score); //printa os movimentos e o score na posição correta
- for(i=0; i<life+1; i++) //printa os corações equivalentes as vidas na posição correta
- {
- textcolor(RED);
- gotoxy(59+i,1);
- printf("%c", 3);
- }
- print_water(casas); //printa a agua e as casas corretamente
- //LockWindowUpdate(GetConsoleWindow());
- for(i=0; i<9; i++)
- move_trunk(& trunk[i],matriz_colisao); //move os troncos
- for(i=0; i<13; i++)
- move_car(&car[i],matriz_colisao); // move os carros
- for(i=0; i<9; i++)
- move_turtle(& turtle[i], & tartaruga_cima, matriz_colisao, afunda, i); // move as tartarugas
- clear_line(15); //limpa as linhas do meio pra não ficar sapo "duplicado"
- clear_line(16);
- frog_inicial(&frog); //printa o frog na posição inicial do frog
- //LockWindowUpdate(NULL);
- i=0; //zera o contador i
- frog_stats=0; //reinicializa o estado do sapo
- while(i<10000-dificuldade)// faz o tempo para os carros se mecherem
- {
- i++; //aumenta o contador para cada loop
- if(kbhit()) //caso toque uma tela
- move_frog(&frog, &cursor, &movimentos, &score); //move o frog para a posição correta, diminui a quantidade de movimentos e o score
- if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial] ==BUSY) movimentos=0; //colisão com carros e agua mata o sapo
- if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+1] ==BUSY) movimentos=0;
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial] ==BUSY) movimentos=0;
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==BUSY) movimentos=0;
- if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+0] ==MOV_LEFT) frog_stats=MOV_LEFT; //colisão com objeto andando pra a esquerda
- 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
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+0] ==MOV_LEFT) frog_stats=MOV_LEFT;
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==MOV_LEFT) frog_stats=MOV_LEFT;
- if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+0] ==MOV_RIGHT) frog_stats=MOV_RIGHT; //colisão com objeto andando pra a direita
- 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
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+0] ==MOV_RIGHT) frog_stats=MOV_RIGHT;
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==MOV_RIGHT) frog_stats=MOV_RIGHT;
- 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
- {
- score += 50; //soma 50 pontos
- casas[0].win = TRUE; //estado da casa 1 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- 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
- {
- score += 50; //soma 50 pontos
- casas[1].win = TRUE; //estado da casa 2 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- 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
- {
- score += 50; //soma 50 pontos
- casas[2].win = TRUE; //estado da casa 3 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- 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
- {
- score += 50; //soma 50 pontos
- casas[3].win = TRUE; //estado da casa 4 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- 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
- {
- score += 50; //soma 50 pontos
- casas[4].win = TRUE; //estado da casa 5 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- }
- if(frog_stats==MOV_LEFT) //caso o estado seja MOV_LEFT
- frog.coluna_inicial-=2; //move o sapo junto com o tronco para a esquerda
- if(frog_stats==MOV_RIGHT) //caso o estado seja MOV_RIGHT
- frog.coluna_inicial+=2; //move o sapo junto com o tronco para a direita
- tartaruga_cima++; //altera gradativamente o estado da tartaruga
- if(tartaruga_cima==25) //looping de tartaruga e ve qual que vai afundar
- {
- tartaruga_cima=0;
- afunda = rand()%9; //sorteia tartaruga random entre 1-9 para afunda
- }
- 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
- {
- ganhou(); //função para ganhar o jogo
- ganho=1; //altera o estado para não entrar em looping
- save_name_score(high, &jogador, score);
- }
- if(cursor=='f') //se pedir para salvar
- {
- salvo=fopen("fase.bin","wb"); //abre/cria arquivo para escrita
- if(!salvo) //se der problema para salvar
- printf("\aError ao abrir o aquivo"); //msg de erro
- else //senão
- {
- for(i=0; i<9; i++)
- {
- if( fwrite(&trunk[i],sizeof(Objeto),1,salvo) !=1) //salva as posições dos troncos e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- for(i=0; i<13; i++)
- {
- if( fwrite(&car[i],sizeof(Objeto),1,salvo) !=1) //salva as posições dos carros e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- for(i=0; i<9; i++)
- {
- if( fwrite(&turtle[i],sizeof(Objeto),1,salvo) !=1) //salva as posições da tartaruga e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- if(1 != fwrite(&frog,sizeof(Objeto),1,salvo)) //salva a posição do frog e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(!( fwrite(&movimentos,sizeof(int),1,salvo))) //salva quantos movimentos restantes e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&life,sizeof(int),1,salvo)) //salva quantas vidas e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&ganho,sizeof(int),1,salvo)) //salva se já ganhou o jogo e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&tartaruga_cima,sizeof(int),1,salvo)) //salva o estado da tartaruga e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&dificuldade,sizeof(int),1,salvo)) //salva a dificuldade e e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- for(i=0;i<5;i++)
- {
- if(1 != fwrite(&casas[i],sizeof(CASA_SAPO),1,salvo)) //salva quais casas foram ocupadas e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- if(1 != fwrite(&afunda,sizeof(int),1,salvo)) //salva qual tartaruga afundou e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&score,sizeof(int),1,salvo)) //salva a pontuação e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- fclose(salvo); //fecha o arquivo
- }
- cursor=tolower(cursor); //caracter pego do teclado vai para minusculo
- }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)
- if(movimentos<=0) //caso tenha morrido
- {
- system("cls"); //limpa a tela
- life--; //diminui uma vida
- you_died(); //tela de morreu
- fflush(stdin); //limpa buffer
- movimentos=MOVIMENTOS; //reinicia a quantidade de movimentos
- }
- }while(life>=0 && cursor!='q' && ganho!=1); //enquanto tiver vidas e cursor diferente de q(fim do jogo)
- PlaySound(NULL, 0, 0); //para a musica do loop principal
- }
- /**Move o sapo para a posição correta
- recebe a posição do sapo e move ele
- diminui 1 no numero de movimentos restantes e 1 na pontuação**/
- 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
- {
- int ex, ey,movimentos;//eixo x e eixo y
- char k;//recebe o comando
- textcolor(GREEN); //cor verde
- ex=frog->coluna_inicial; //recebe o ponteiro referente a coluna inicial
- ey=frog->linha_inicial; //recebe o ponteiro referente a linha inicial
- movimentos=*n_movimento; //recebe o ponteiro referente ao numero de movimentos
- k=getch(); //para receber uma seta do teclado
- if(k==0)
- k=getch();
- switch(k) //menu para printar a animação correta do frog e move-lo
- {
- case UP:
- if(ey>=4) //caso para cima(e não esteja batendo nas laterais da tela)
- {
- clear_frog(ex,ey); //limpa o frog antigo
- ey-=2; //move o frog
- gotoxy(ex,ey); printf("@@"); //printa a animação de movimento
- gotoxy(ex,ey+1); printf("00");
- *pontuacao = *pontuacao -1; //diminui a pontuação
- movimentos--; //diminui o numero de movimentos
- }
- break;
- case DOWN:
- if(ey<= ALTURA-4) //caso para baixo(e não esteja batendo nas laterais da tela)
- {
- clear_frog(ex,ey); //limpa o frog antigo
- ey+=2; //move o frog
- gotoxy(ex,ey); printf("00"); //printa a animação de movimento
- gotoxy(ex,ey+1); printf("@@");
- *pontuacao = *pontuacao -1; //diminui a pontuação
- movimentos--;
- }
- break;
- case LEFT:
- if(ex>4) //caso para a esquerda(e não esteja batendo nas laterais da tela)
- {
- clear_frog(ex,ey); //limpa o frog antigo
- ex-=2; //move o frog
- gotoxy(ex,ey); printf("@0"); //printa a animação de movimento
- gotoxy(ex,ey+1); printf("@0");
- *pontuacao = *pontuacao -1; //diminui a pontuação
- movimentos--;
- }
- break;
- case RIGHT:
- if(ex<= LARGURA-2) //caso para a direita (e não esteja batendo nas laterais da tela)
- {
- clear_frog(ex,ey); //limpa o frog antigo
- ex+=2; //move o frog
- gotoxy(ex,ey); printf("0@"); //printa a animação de movimento
- gotoxy(ex,ey+1); printf("0@");
- *pontuacao = *pontuacao -1; //diminui a pontuação
- movimentos--;
- }
- break;
- }
- *n_movimento=movimentos; //atualiza o numero de movimentos
- frog->coluna_inicial=ex; //atualiza o valor da coluna inicial do sapo
- frog->linha_inicial=ey; //atualiza o valor da linha inicial do sapo
- *cursor=k; //devolve o que o usuario digito para a main
- textcolor(WHITE);
- }
- /**Menu principal do jogo
- mostra as opções de inicio e retorna qual foi escolhida**/
- int menuMain()
- {
- int ex=22,ey=15, escolha=1;// são as cordenadas da setinha
- char cursor;//controla a setinha
- clrscr(); //limpa a tela
- textcolor(GREEN); //cor verde
- gotoxy(2, 5); printf(" _______ _______ _______ _______ _______ _______ ______ "); //printa o titulo principal do jogo
- gotoxy(2, 6); printf("( ____ ( ____ ( ___ ( ____ ( ____ ( ____ ( ____ ) ");
- gotoxy(2, 7); printf("| ( \\| ( )| ( ) | ( \\| ( \\| ( \\| ( )| ");
- gotoxy(2, 8); printf("| (__ | (____)| | | | | | | | (__ | (____)| ");
- gotoxy(2, 9); printf("| __) | __| | | | | ____| | ____| __) | __) ");
- gotoxy(2, 10); printf("| ( | (\\ ( | | | | | \\_ | | \\_ | ( | (\\ ( ");
- gotoxy(2, 11); printf("| ) | ) \\ \\_| (___) | (___) | (___) | (____/| ) \\ \\__ ");
- gotoxy(2, 12); printf("|/ |/ \\__(_______(_______(_______(_______|/ \\__/ ");
- gotoxy(24,15); printf("Novo Jogo"); //printa as opçõess
- gotoxy(24,20); printf("Continuar jogo salvo");
- gotoxy(24,25); printf("Highscores");
- gotoxy(24,30); printf("Sair do jogo");
- gotoxy(ex,ey); //printa a seta para escolher
- printf("%c", 26);
- gotoxy(LARGURA,ALTURA+5);
- do
- {
- cursor=getch(); //para pegar a seta
- if(cursor==0)
- cursor=getch();
- 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)
- {
- gotoxy(ex,ey);
- printf(" ");
- ey-=5;
- gotoxy(ex,ey);
- printf("%c", 26);
- gotoxy(LARGURA,ALTURA+5);
- }
- 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)
- {
- gotoxy(ex,ey);
- printf(" ");
- ey+=5;
- gotoxy(ex,ey);
- printf("%c", 26);
- gotoxy(LARGURA,ALTURA+5);
- }
- }while (cursor!=13); //enquanto não apertar enter, espera pelo caracter
- if(ey==15) escolha=1; //coloca o retorno certo dependendo da opção escohida
- if(ey==20) escolha=2;
- if(ey==25) escolha=3;
- if(ey==30) escolha=4;
- textcolor(WHITE);
- return escolha; //retorna a opção escolhida
- }
- /**Printa a tela de morte **/
- void you_died()
- {
- clrscr(); //limpa a tela
- textcolor(RED);
- gotoxy(1,8); printf("## ## ####### ## ## ######## #### ######## ######## "); //printa "YOU DIED"
- gotoxy(1,9); printf(" ## ## ## ## ## ## ## ## ## ## ## ##");
- gotoxy(1,10); printf(" #### ## ## ## ## ## ## ## ## ## ##");
- gotoxy(1,11); printf(" ## ## ## ## ## ## ## ## ###### ## ##");
- gotoxy(1,12); printf(" ## ## ## ## ## ## ## ## ## ## ##");
- gotoxy(1,13); printf(" ## ## ## ## ## ## ## ## ## ## ##");
- gotoxy(1,14); printf(" ## ####### ####### ######## #### ######## ######## ");
- Sleep(2000); //espera 2 segundos
- fflush(stdin);
- textcolor(WHITE);
- }
- /**Printa o frog na sua posição inicial(posição atual)**/
- void frog_inicial(Objeto *frog)
- {
- textcolor(GREEN);
- int x=frog->coluna_inicial,y=frog->linha_inicial; //seta as variaveis para os valores dos ponteiros
- gotoxy(x,y); printf("@@"); //vai para a posição inicial do sapo e printa ele
- gotoxy(x,y + 1);printf("00");
- textcolor(WHITE);
- }
- /**Printa a água e as casas nas suas posições e estados corretos**/
- void print_water(CASA_SAPO casa[])
- {
- int i;
- textcolor(BROWN);
- gotoxy(4,3); printf(" | | | | | | | | | | "); //printa as casas marrom
- gotoxy(4,4); printf("__| |______| |______| |______| |______| |__");
- textcolor(BLUE);
- gotoxy(7,3); printf("~~~~"); //printa a agua das casas
- gotoxy(19,3); printf("~~~~");
- gotoxy(31,3); printf("~~~~");
- gotoxy(43,3); printf("~~~~");
- gotoxy(55,3); printf("~~~~");
- gotoxy(7,4); printf("~~~~");
- gotoxy(19,4); printf("~~~~");
- gotoxy(31,4); printf("~~~~");
- gotoxy(43,4); printf("~~~~");
- gotoxy(55,4); printf("~~~~");
- for(i=5; i<15; i++) //printa todo o resto da agua da casa
- {
- gotoxy(2,i);
- printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
- }
- textcolor(YELLOW);
- if(casa[0].win==1) //verifica o estado da casa 1 e printa um sapo dentro se o frog já chegou la
- {
- gotoxy(8,3); printf("@@");
- gotoxy(8,4); printf("00");
- }
- if(casa[1].win==1) //verifica o estado da casa 2 e printa um sapo dentro se o frog já chegou la
- {
- gotoxy(20,3);printf("@@");
- gotoxy(20,4);printf("00");
- }
- if(casa[2].win==1) //verifica o estado da casa 3 e printa um sapo dentro se o frog já chegou la
- {
- gotoxy(32,3);printf("@@");
- gotoxy(32,4);printf("00");
- }
- if(casa[3].win==1) //verifica o estado da casa 4 e printa um sapo dentro se o frog já chegou la
- {
- gotoxy(44,3);printf("@@");
- gotoxy(44,4);printf("00");
- }
- if(casa[4].win==1) //verifica o estado da casa 5 e printa um sapo dentro se o frog já chegou la
- {
- gotoxy(56,3);printf("@@");
- gotoxy(56,4);printf("00");
- }
- textcolor(WHITE);
- }
- /**Move um carro para a posição correta e printa ele
- atualiza a tabela de colisão para onde tem carro**/
- void move_car (Objeto *car, int colisao[][LARGURA])
- {
- int x=car->coluna_inicial,y=car->linha_inicial, i; //pega os valores dos ponteiros referentes a posição do carro
- float speed= car->velocidade; //pega o valor do ponteiro referente a velocidade do carro
- gotoxy(x%(LARGURA-2)+4,y); printf(" "); //apaga o carro anterior
- gotoxy(x%(LARGURA-2)+4,y+1); printf(" ");
- x+=2*speed; //incrementa a nova posição segundo a velocidade
- if(x<3 && speed<0) x = LARGURA; //faz a passagem do carro de um lado pro outro
- if(x>=(LARGURA) && speed>0) x=2; //faz a passagem do carro no sentido inverso
- if(speed<0) //printa o carro no sentido direita -> esquerda
- {
- gotoxy(x%(LARGURA-2)+4,y); printf(" "); ///PRINTA O CARRO POR PARTES, utiliza a operação % para fazer o wrap
- 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
- gotoxy((x+1)%(LARGURA-2)+4,y); printf("_");
- gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("_");
- gotoxy((x+2)%(LARGURA-2)+4,y); printf("_");
- gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("o");
- gotoxy((x+3)%(LARGURA-2)+4,y); printf("/");
- gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("_");
- gotoxy((x+4)%(LARGURA-2)+4,y); printf("=");
- gotoxy((x+4)%(LARGURA-2)+4,y+1);printf("_");
- gotoxy((x+5)%(LARGURA-2)+4,y); printf("|");
- gotoxy((x+5)%(LARGURA-2)+4,y+1);printf("o");
- gotoxy((x+6)%(LARGURA-2)+4,y); printf("_");
- gotoxy((x+6)%(LARGURA-2)+4,y+1);printf("_");
- gotoxy((x+7)%(LARGURA-2)+4,y); printf(" ");
- gotoxy((x+7)%(LARGURA-2)+4,y+1);printf("\\");
- gotoxy((x+8)%(LARGURA-2)+4,y+1);printf(" ");
- gotoxy((x+8)%(LARGURA-2)+4,y); printf(" ");
- for(i=-1; i<=7; i++) //atualiza a tabela de colisão para onde há carro
- {
- colisao[y][(x+i)%(LARGURA-2)+4]=BUSY;
- colisao[y+1][(x+i)%(LARGURA-2)+4]=BUSY;
- }
- }
- if(speed>0)
- {
- gotoxy((x+7)%(LARGURA-2)+4,y); printf(" "); ///PRINTA O CARRO POR PARTES, utiliza a operação % para fazer o wrap
- 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
- gotoxy((x+6)%(LARGURA-2)+4,y); printf("_");
- gotoxy((x+6)%(LARGURA-2)+4,y+1);printf("_");
- gotoxy((x+5)%(LARGURA-2)+4,y); printf("_");
- gotoxy((x+5)%(LARGURA-2)+4,y+1);printf("o");
- gotoxy((x+4)%(LARGURA-2)+4,y); printf("\\");
- gotoxy((x+4)%(LARGURA-2)+4,y+1);printf("_");
- gotoxy((x+3)%(LARGURA-2)+4,y); printf("=");
- gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("_");
- gotoxy((x+2)%(LARGURA-2)+4,y); printf("|");
- gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("o");
- gotoxy((x+1)%(LARGURA-2)+4,y); printf("_");
- gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("_");
- gotoxy((x)%(LARGURA-2)+4,y); printf(" ");
- gotoxy((x)%(LARGURA-2)+4,y+1);printf("/");
- for(i=1; i<=8; i++) //atualiza a tabela de colisão para onde há carro
- {
- colisao[y][(x+i)%(LARGURA-2)+4]=BUSY;
- colisao[y+1][(x+i)%(LARGURA-2)+4]=BUSY;
- }
- }
- car->coluna_inicial= x; // atualiza o endereço do x na estrutura carro
- car->linha_inicial= y; // atualiza o endereço do y na estrutura carro
- }
- /**Move um tronco para a posição correta e printa ele
- autaliza a tabela de colisão para onde tem tronco**/
- void move_trunk(Objeto *trunk, int colisao[][LARGURA])
- {
- int x = trunk->coluna_inicial, y=trunk->linha_inicial,tam=trunk->tamanho,i; //pega os valores dos ponteiros referentes a posição do tronco
- float speed= trunk->velocidade; //pega o valor do ponteiro referente a velocidade do tronco
- textcolor(BLUE);
- gotoxy(x,y);
- for(i=0; i<(tam*2); i++) //apaga o tronco anterior
- {
- gotoxy((x+i)%(LARGURA-2)+4,y); printf("~");
- gotoxy((x+i)%(LARGURA-2)+4,y+1);printf("~");
- }
- x+=2*speed; //atualiza a nova posição do tronco a partir da velocidade
- if(speed > 0 && x>LARGURA) x=4; //faz a mudança de posição de um lado pro outro
- if(speed < 0 && x<= 0) x= LARGURA-2; //faz a mudença de posição inversa
- textcolor(BROWN);
- for(i=0; i<(2*tam); i++) //printa o tronco do tamanho requisitado no local correto
- {
- gotoxy((x+i)%(LARGURA-2)+4,y); printf("#"); ///utiliza o operador % para fazer o wrap corretamente
- gotoxy((x+i)%(LARGURA-2)+4,y+1);printf("#");
- }
- if(speed<0) //preenche a tebela de colisão com o tronco indo para a esquerda
- {
- for(i=0; i<(tam*2); i++)
- {
- colisao[y][(x+i)%(LARGURA-2)+4]=MOV_LEFT;
- colisao[y+1][(x+i)%(LARGURA-2)+4]=MOV_LEFT;
- }
- }
- if(speed>0) //preenche a tabela de colisão com o tronco indo para a direita
- {
- for(i=0; i<(tam*2); i++)
- {
- colisao[y][(x+i)%(LARGURA-2)+4]=MOV_RIGHT;
- colisao[y+1][(x+i)%(LARGURA-2)+4]=MOV_RIGHT;
- }
- }
- trunk->coluna_inicial= x; //atualiza a posição dos ponteiros
- trunk->linha_inicial= y;
- textcolor(WHITE);
- }
- /**Move um tronco para a posição correta e printa ele
- autaliza a tabela de colisão para onde tem tronco**/
- void move_turtle (Objeto *turtle, int *cont,int colisao[][LARGURA], int afunda, int atual)
- {
- 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
- float speed = turtle->velocidade; //pega o valor do ponteiro referente a velocidade da tartaruga
- textcolor(BLUE);
- for(i=0; i<(tam*2); i++) //apaga a tartaruga anterior
- {
- gotoxy((x+i)%(LARGURA-2)+4,y); printf("~");
- gotoxy((x+i)%(LARGURA-2)+4,y+1);printf("~");
- }
- x+=2*speed; //atualiza a nova posição da tartaruga
- if(speed > 0 && x>LARGURA) x=4; //faz a mudança de posição de um lado pro outro
- if(speed < 0 && x<= 0) x= LARGURA-2; //faz a mudança de posição no sentido inverso
- textcolor(CYAN);
- gotoxy((x)%(LARGURA-2)+4,y); printf("/"); //printa a tartaruga
- gotoxy((x)%(LARGURA-2)+4,y+1); printf("\\"); ///UTILIZA DO OPERADOR % para fazer o wrap da tartaruga corretamente
- gotoxy((x+1)%(LARGURA-2)+4,y); printf("\\");
- gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("/");
- gotoxy((x+2)%(LARGURA-2)+4,y); printf("/");
- gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("\\");
- gotoxy((x+3)%(LARGURA-2)+4,y); printf("\\");
- gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("/");
- if(cima>= 15 && cima<20 && afunda==atual) //printa a tartaruga indo afundar, (caso ela tenha sido escolhda somente)
- {
- gotoxy((x)%(LARGURA-2)+4,y); printf("\\"); ///UTILIZA DO OPERADOR % para fazer o wrap da tartaruga corretamente
- gotoxy((x)%(LARGURA-2)+4,y+1);printf("/");
- gotoxy((x+1)%(LARGURA-2)+4,y); printf("/");
- gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("\\");
- gotoxy((x+2)%(LARGURA-2)+4,y); printf("\\");
- gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("/");
- gotoxy((x+3)%(LARGURA-2)+4,y); printf("/");
- gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("\\");
- }
- else
- if (cima>= 20 && cima<=25 && afunda==atual) //printa agua no lugar (pois ela esta submergida)
- {
- textcolor(BLUE);
- gotoxy((x)%(LARGURA-2)+4,y);printf("~"); ///UTILIZA DO OPERADOR % para fazer o wrap da tartaruga corretamente
- gotoxy((x)%(LARGURA-2)+4,y+1);printf("~");
- gotoxy((x+1)%(LARGURA-2)+4,y);printf("~");
- gotoxy((x+1)%(LARGURA-2)+4,y+1);printf("~");
- gotoxy((x+2)%(LARGURA-2)+4,y);printf("~");
- gotoxy((x+2)%(LARGURA-2)+4,y+1);printf("~");
- gotoxy((x+3)%(LARGURA-2)+4,y);printf("~");
- gotoxy((x+3)%(LARGURA-2)+4,y+1);printf("~");
- }
- if(speed<0 && afunda!=atual) //preenche corretamente a tabela de colisão
- {
- for(i=0; i<4; i++)
- {
- colisao[y][(x+i)%(LARGURA-2)+4]=MOV_LEFT;
- colisao[y+1][(x+i)%(LARGURA-2)+4]=MOV_LEFT;
- }
- }
- else
- if (speed<0 && cima>20 && afunda==atual) //preenche corretamente a tabela de colisão
- {
- colisao[y][(x+i)%(LARGURA-2)+4]=BUSY;
- colisao[y+1][(x+i)%(LARGURA-2)+4]=BUSY;
- }
- if(speed>0 && afunda!=atual) //preenche corretamente a tabela de colisão
- {
- for(i=0; i<4; i++)
- {
- colisao[y][(x+i)%(LARGURA-2)+4]=MOV_RIGHT;
- colisao[y+1][(x+i)%(LARGURA-2)+4]=MOV_RIGHT;
- }
- }
- else
- if (speed>0 && cima>20 && afunda==atual) //preenche corretamente a tabela de colisão
- {
- colisao[y][(x+i)%(LARGURA-2)+4]=BUSY;
- colisao[y+1][(x+i)%(LARGURA-2)+4]=BUSY;
- }
- turtle->coluna_inicial= x; //passa os novos valores da posição da tartaruga pro ponteiro
- turtle->linha_inicial= y;
- textcolor(WHITE);
- }
- /**Monta a tabela inicial de colisão
- baseado nos lugares que tem agua ou dos que não tem nada**/
- void tabela_colisao(int colTable[][LARGURA])
- {
- int i, j;
- for(j=0; j<ALTURA; j++) //preenche toda a matriz de colisão
- for(i=0; i<LARGURA; i++)
- {
- if(j<ALTURA/2 - 1) //preenche com BUSY para onde tem agua
- colTable[j][i]=BUSY;
- else //e FREE onde não tem nada
- colTable[j][i]=FREE;
- }
- }
- ///Limpa um frog em uma posição x,y
- void clear_frog(int ex, int ey)
- {
- gotoxy(ex,ey);
- printf(" ");
- gotoxy(ex,ey+1);
- printf(" ");
- }
- ///Limpa uma linha
- void clear_line(int x)
- {
- gotoxy(1,x);
- printf(" ");
- }
- ///Animação de vitória
- void ganhou()
- {
- int i;
- clrscr();
- textcolor(YELLOW);
- PlaySound(NULL, 0, 0);
- PlaySound("Ending_1", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
- srand(time(NULL));
- for(i=0; i<1000; i++) //printa simbolos de "$" em posições aleatórias
- {
- gotoxy(1 + (rand() % LARGURA ), 1 + (rand() % ALTURA));
- printf("$");
- Sleep(3);
- }
- clrscr(); //limpa a tela
- gotoxy(2,10); printf(" __ __ __ "); //printa a tela de vitória
- gotoxy(2,11); printf("/ \\ / | / | ");
- gotoxy(2,12); printf("$$ \\ /$$/______ __ __ __ __ __ $$/ _______ ");
- gotoxy(2,13); printf(" $$ \\/$$// \\ / | / | / | / | / |/ |/ \\ ");
- gotoxy(2,14); printf(" $$ $$//$$$$$$ |$$ | $$ | $$ | $$ | $$ |$$ |$$$$$$$ | ");
- gotoxy(2,15); printf(" $$$$/ $$ | $$ |$$ | $$ | $$ | $$ | $$ |$$ |$$ | $$ | ");
- gotoxy(2,16); printf(" $$ | $$ \\__$$ |$$ \\__$$ | $$ \\_$$ \\_$$ |$$ |$$ | $$ | ");
- gotoxy(2,17); printf(" $$ | $$ $$/ $$ $$/ $$ $$ $$/ $$ |$$ | $$ | ");
- gotoxy(2,18); printf(" $$/ $$$$$$/ $$$$$$/ $$$$$/$$$$/ $$/ $$/ $$/ ");
- for(i=0; i<1000; i++) //printa simbolos de "$" em posições aleatórias
- {
- gotoxy(1 + (rand() % LARGURA), 1 + (rand() % 9)); printf("$");
- gotoxy(1 + (rand() % LARGURA), 20+ (rand() % (ALTURA - 19))); printf("$");
- Sleep(4);
- }
- Sleep(2000);
- clrscr();
- textcolor(GREEN);
- PlaySound(NULL, 0, 0);
- PlaySound("Ending_2", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
- for(i=0; i>-47; i--) //printa a animação de vitória
- {
- if(10+i>1) {gotoxy(10,10+i);printf(" ____ __.---""---.__ ____ ");}
- if(11+i>1) {gotoxy(10,11+i);printf(" /####\\/ \\/####\\ ");}
- if(12+i>1) {gotoxy(10,12+i);printf(" ( /\\ ) ( /\\ ) ");}
- if(13+i>1) {gotoxy(10,13+i);printf(" \\____/ \\____/ ");}
- if(14+i>1) {gotoxy(10,14+i);printf(" __/ \\__ ");}
- if(15+i>1) {gotoxy(10,15+i);printf(" .-' . . '-. ");}
- if(16+i>1) {gotoxy(10,16+i);printf(" | | \\.._ _../ | | ");}
- if(17+i>1) {gotoxy(10,17+i);printf(" \\ \\ \\.'-.__________.-'./ / / ");}
- if(18+i>1) {gotoxy(10,18+i);printf(" \\ \\ '--.________.--' / / ");}
- if(19+i>1) {gotoxy(10,19+i);printf(" ___\\ \\_ _/ /___ ");}
- if(20+i>1) {gotoxy(10,20+i);printf(" ./ ))))) ((((( \\. ");}
- if(21+i>1) {gotoxy(10,21+i);printf(" \\ / ");}
- if(22+i>1) {gotoxy(10,22+i);printf(" \\ \\_ _/ / ");}
- if(23+i>1) {gotoxy(10,23+i);printf(" \\ \\____/''-.____.-''\\____/ / ");}
- if(24+i>1) {gotoxy(10,24+i);printf(" \\ \\ / / ");}
- if(25+i>1) {gotoxy(10,25+i);printf(" \\. .| |. ./ ");}
- if(26+i>1) {gotoxy(10,26+i);printf(" .' / | \\ / | \\ '. ");}
- if(27+i>1) {gotoxy(10,27+i);printf(" .' / | \\ / | \\ '. ");}
- if(28+i>1) {gotoxy(10,28+i);printf(" /.-./.--.|.--.\\ /.--.|.--.\\.-.| ");}
- if(29+i>1) {gotoxy(10,29+i);printf(" ");}
- if(32+i>1) {gotoxy(10,32+i);printf(" ---CREDITOS--- ");}
- if(33+i>1) {gotoxy(10,33+i);printf(" ");}
- if(34+i>1) {gotoxy(10,34+i);printf(" FELIPE LEIVAS ");}
- if(35+i>1) {gotoxy(10,35+i);printf(" ");}
- if(36+i>1) {gotoxy(10,36+i);printf(" OTAVIO JACOBI ");}
- if(37+i>1) {gotoxy(10,37+i);printf(" ");}
- if(38+i>1) {gotoxy(10,38+i);printf(" ---MUSICAS--- ");}
- if(39+i>1) {gotoxy(10,39+i);printf(" ");}
- if(40+i>1 && 40+i<40) {gotoxy(10,40+i);printf(" Windfall - The FatRat ");}
- if(41+i>1 && 41+i<40) {gotoxy(10,41+i);printf(" ");}
- if(42+i>1 && 42+i<40) {gotoxy(10,42+i);printf(" SAMBA SHOW ");}
- if(43+i>1 && 43+i<40) {gotoxy(10,43+i);printf(" ");}
- if(44+i>1 && 44+i<40) {gotoxy(10,44+i);printf(" Here comes the money - Naughty by Nature ");}
- if(45+i>1 && 45+i<40) {gotoxy(10,45+i);printf(" ");}
- if(46+i>1 && 46+i<40) {gotoxy(10,46+i);printf(" Frog's theme - Chrone Trigger ");}
- if(47+i>1 && 47+i<40) {gotoxy(10,47+i);printf(" ");}
- if(kbhit())
- break;
- Sleep(500);
- }
- }
- /**Mesma função main só que com as opções para carregar o arquivo**/
- void save_main(FILE *high)
- {
- ///mesmo cabeçalho da main()
- int life=VIDAS_INICIAIS;// vidas do jogador
- char cursor;//vai ser o caracter que verifica se o jogador aperto ESC
- int movimentos=MOVIMENTOS,tartaruga_cima=0,i,frog_stats, afunda=0, dificuldade=0,ganho,score,loaded=0,carregou=0;
- int matriz_colisao[ALTURA][LARGURA];
- FILE *salvo;
- Objeto trunk[9];
- Objeto car[13];
- Objeto turtle[9];
- HIGHSCORE jogador;
- Objeto frog;
- CASA_SAPO casas[5]= {{0},{0},{0},{0},{0}};
- score = MAX_PONT;
- PlaySound("song.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
- srand(time(NULL));
- do
- {
- system("cls");
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- if(loaded!=0)
- frog_inicial(&frog);
- print_water(casas); //printa a agua e as casas na posição correta
- if(loaded==0)
- {
- salvo=fopen("fase.bin","rb"); //abre o fase.bin para leitura e mostra msg de erro caso de erro
- if(!salvo)
- {
- clrscr();
- printf("\aError ao abrir o aquivo");
- getch();
- life=-5;
- }
- else
- {
- for(i=0; i<9; i++) //le a posição dos troncos e mostra msg de erro caso de erro
- {
- if( fread(&trunk[i],sizeof(Objeto),1,salvo) !=1)
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- for(i=0; i<13; i++) //le a posição dos carros e mostra msg de erro caso de erro
- {
- if( fread(&car[i],sizeof(Objeto),1,salvo) !=1)
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- for(i=0; i<9; i++) //lê a posição das tartarugas e mostra msg de erro caso de erro
- {
- if( fread(&turtle[i],sizeof(Objeto),1,salvo) !=1)
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- if(1 != fread(&frog,sizeof(Objeto),1,salvo)) //lê a posição do frog e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fread(&movimentos,sizeof(int),1,salvo)) //lê a quantidade de movimentos restantes e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fread(&life,sizeof(int),1,salvo)) //lê quantas vidas restantes e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fread(&ganho,sizeof(int),1,salvo)) //lê o estado e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fread(&tartaruga_cima,sizeof(int),1,salvo)) //lê o estado da tartaruga e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fread(&dificuldade,sizeof(int),1,salvo)) //lê a dificuldade e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- for(i=0;i<5;i++)
- {
- if(1 != fread(&casas[i],sizeof(CASA_SAPO),1,salvo)) //lê os estados das casas e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- if(1 != fread(&afunda,sizeof(int),1,salvo)) //lê o estado da tartaruga 2 e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fread(&score,sizeof(int),1,salvo)) //lê o score e mostra msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- carregou=TRUE; //altera o estado para "carregado"
- }
- loaded=TRUE;
- fclose(salvo);
- }
- if(carregou!=FALSE) //se carregou o arquivo
- {
- do ///igual o main do jogo
- {
- tabela_colisao(matriz_colisao); //preenche a tabela de colisão
- textcolor(YELLOW);
- gotoxy(1,1);
- printf(" Movimentos restantes:|%d Score: %d|Vidas restantes: ",movimentos, score); //printa as informações
- for(i=0; i<life+1; i++) //printa as vidas
- {
- textcolor(RED);
- gotoxy(59+i,1);
- printf("%c", 3);
- }
- print_water(casas);
- //LockWindowUpdate(GetConsoleWindow());
- for(i=0; i<9; i++)
- move_trunk(& trunk[i],matriz_colisao);//move os tronco do arranjo
- for(i=0; i<13; i++)
- move_car(&car[i],matriz_colisao); // move os carros
- for(i=0; i<9; i++)
- move_turtle(& turtle[i], & tartaruga_cima, matriz_colisao, afunda, i); // move as tartarugas
- clear_line(15); //limpa a linha pra não haver duplicação do sapo
- clear_line(16);
- frog_inicial(&frog); //printa o frog a partir da sua posição inicial
- //LockWindowUpdate(NULL);
- i=0; //reseta o i para o loop
- frog_stats=0; //reseta o status do sapo
- while(i<10000-dificuldade)// faz o tempo para os carros se mecherem
- {
- i++; //aumenta o contador para cada loop
- if(kbhit()) //caso toque uma tela
- move_frog(&frog, &cursor, &movimentos, &score); //move o frog para a posição correta, diminui a quantidade de movimentos e o score
- if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial] ==BUSY) movimentos=0; //colisão com carros e agua mata o sapo
- if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+1] ==BUSY) movimentos=0;
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial] ==BUSY) movimentos=0;
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==BUSY) movimentos=0;
- if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+0] ==MOV_LEFT) frog_stats=MOV_LEFT; //colisão com objeto andando pra a esquerda
- 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
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+0] ==MOV_LEFT) frog_stats=MOV_LEFT;
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==MOV_LEFT) frog_stats=MOV_LEFT;
- if( matriz_colisao[frog.linha_inicial][frog.coluna_inicial+0] ==MOV_RIGHT) frog_stats=MOV_RIGHT; //colisão com objeto andando pra a direita
- 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
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+0] ==MOV_RIGHT) frog_stats=MOV_RIGHT;
- if( matriz_colisao[frog.linha_inicial+1][frog.coluna_inicial+1]==MOV_RIGHT) frog_stats=MOV_RIGHT;
- 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
- {
- score += 50; //soma 50 pontos
- casas[0].win = TRUE; //estado da casa 1 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- 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
- {
- score += 50; //soma 50 pontos
- casas[1].win = TRUE; //estado da casa 2 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- 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
- {
- score += 50; //soma 50 pontos
- casas[2].win = TRUE; //estado da casa 3 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- 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
- {
- score += 50; //soma 50 pontos
- casas[3].win = TRUE; //estado da casa 4 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- 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
- {
- score += 50; //soma 50 pontos
- casas[4].win = TRUE; //estado da casa 5 vai para verdadeiro (1)
- dificuldade+=500; //aumenta a dificuldade
- movimentos=MOVIMENTOS; //reseta os movimentos
- life=VIDAS_INICIAIS; //reseta as vidas
- frog.coluna_inicial =LARGURA/2;//
- frog.linha_inicial = ALTURA-3;// reseta a posição do sapo
- frog_inicial(&frog); //printa o frog na sua nova posição
- clear_line(ALTURA-3); //
- clear_line(ALTURA-2); //limpa as linhas de baixo (para não haver duplicação do sapo)
- }
- }
- if(frog_stats==MOV_LEFT) //caso o estado seja MOV_LEFT
- frog.coluna_inicial-=2; //move o sapo junto com o tronco para a esquerda
- if(frog_stats==MOV_RIGHT) //caso o estado seja MOV_RIGHT
- frog.coluna_inicial+=2; //move o sapo junto com o tronco para a direita
- tartaruga_cima++; //altera gradativamente o estado da tartaruga
- if(tartaruga_cima==25) //looping de tartaruga e ve qual que vai afundar
- {
- tartaruga_cima=0;
- afunda = rand()%9; //sorteia tartaruga random entre 1-9 para afunda
- }
- 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
- {
- ganhou(); //função para ganhar o jogo
- ganho=1; //altera o estado para não entrar em looping
- save_name_score(high, &jogador, score);
- }
- if(cursor=='f') //se pedir para salvar
- {
- salvo=fopen("fase.bin","wb"); //abre/cria arquivo para escrita
- if(!salvo) //se der problema para salvar
- printf("\aError ao abrir o aquivo"); //msg de erro
- else //senão
- {
- for(i=0; i<9; i++)
- {
- if( fwrite(&trunk[i],sizeof(Objeto),1,salvo) !=1) //salva as posições dos troncos e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- for(i=0; i<13; i++)
- {
- if( fwrite(&car[i],sizeof(Objeto),1,salvo) !=1) //salva as posições dos carros e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- for(i=0; i<9; i++)
- {
- if( fwrite(&turtle[i],sizeof(Objeto),1,salvo) !=1) //salva as posições da tartaruga e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- if(1 != fwrite(&frog,sizeof(Objeto),1,salvo)) //salva a posição do frog e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(!( fwrite(&movimentos,sizeof(int),1,salvo))) //salva quantos movimentos restantes e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&life,sizeof(int),1,salvo)) //salva quantas vidas e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&ganho,sizeof(int),1,salvo)) //salva se já ganhou o jogo e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&tartaruga_cima,sizeof(int),1,salvo)) //salva o estado da tartaruga e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&dificuldade,sizeof(int),1,salvo)) //salva a dificuldade e e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- for(i=0;i<5;i++)
- {
- if(1 != fwrite(&casas[i],sizeof(CASA_SAPO),1,salvo)) //salva quais casas foram ocupadas e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- if(1 != fwrite(&afunda,sizeof(int),1,salvo)) //salva qual tartaruga afundou e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- if(1 != fwrite(&score,sizeof(int),1,salvo)) //salva a pontuação e msg de erro caso de erro
- {
- clrscr();
- printf("Erro ao salvar o arquivo");
- fclose(salvo);
- }
- }
- fclose(salvo); //fecha o arquivo
- }
- cursor=tolower(cursor); //caracter pego do teclado vai para minusculo
- }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)
- if(movimentos<=0) //caso tenha morrido
- {
- system("cls"); //limpa a tela
- life--; //diminui uma vida
- you_died(); //tela de morreu
- fflush(stdin); //limpa buffer
- movimentos=MOVIMENTOS; //reinicia a quantidade de movimentos
- }
- }
- }while(life>=0 && cursor!='q' && ganho!=1); //enquanto tiver vidas e cursor diferente de q(fim do jogo)
- PlaySound(NULL, 0, 0);
- }
- /**Salva a pontuação no arquivo
- .txt de highscores**/
- void save_name_score(FILE *high, HIGHSCORE *jogador, int score)
- {
- clrscr();
- textcolor(YELLOW); //printa a tela
- gotoxy(9,4); printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
- gotoxy(9,5); printf("$ $");
- gotoxy(9,6); printf("$ $");
- gotoxy(9,7); printf("$ $");
- gotoxy(9,8); printf("$ $");
- gotoxy(9,9); printf("$ $");
- gotoxy(9,10);printf("$ $");
- gotoxy(9,11);printf("$ $");
- gotoxy(9,12);printf("$ $");
- gotoxy(9,13);printf("$ $");
- gotoxy(9,14);printf("$ $");
- gotoxy(9,15);printf("$ $");
- gotoxy(9,16);printf("$ $");
- gotoxy(9,17);printf("$ $");
- gotoxy(9,18);printf("$ $");
- gotoxy(9,19);printf("$ $");
- gotoxy(9,20);printf("$ $");
- gotoxy(9,21);printf("$ $");
- gotoxy(9,22);printf("$ $");
- gotoxy(9,23);printf("$ $");
- gotoxy(9,24);printf("$ $");
- gotoxy(9,25);printf("$ $");
- gotoxy(9,26);printf("$ $");
- gotoxy(9,27);printf("$ $");
- gotoxy(9,28);printf("$ $");
- gotoxy(9,29);printf("$ $");
- gotoxy(9,30);printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
- textcolor(GREEN);
- gotoxy(15,6); printf("Parabens, VOCE VENCEU!!!");
- gotoxy(15,7); printf("Sua Pontuacao foi de %d pontos!!", score);
- gotoxy(10,10);printf(" ____ __.---""---.__ ____ ");
- gotoxy(10,11);printf(" /####\\/ \\/####\\ ");
- gotoxy(10,12);printf(" ( /\\ ) ( /\\ ) ");
- gotoxy(10,13);printf(" \\____/ \\____/ ");
- gotoxy(10,14);printf(" __/ \\__ ");
- gotoxy(10,15);printf(" .-' '-. ");
- gotoxy(10,16);printf(" | | ");
- gotoxy(10,17);printf(" \\ \\ / / ");
- gotoxy(10,18);printf(" \\ \\ / / ");
- gotoxy(10,19);printf(" ___\\ \\_ _/ /___ ");
- gotoxy(10,20);printf(" ./ ))))) ((((( \\. ");
- gotoxy(10,21);printf(" \\ / ");
- gotoxy(10,22);printf(" \\ \\_ _/ / ");
- gotoxy(10,23);printf(" \\ \\____/''-.____.-''\\____/ / ");
- gotoxy(10,24);printf(" \\ \\ / / ");
- gotoxy(10,25);printf(" \\. .| |. ./ ");
- gotoxy(10,26);printf(" .' / | \\ / | \\ '. ");
- gotoxy(10,27);printf(" .' / | \\ / | \\ '. ");
- gotoxy(10,28);printf(" /.-./.--.|.--.\\ /.--.|.--.\\.-.| ");
- fflush(stdin);
- gotoxy(14,16); printf("Digite seu nome: "); //coloca o nome do jogador no buffer
- scanf("%s", jogador->nome);
- jogador->score = score;
- if ((high = fopen ("highscores.txt", "a+"))==NULL) //abre/cria o arquivo para adicionar linha no final
- printf("Erro ao abrir o arquivo");
- else
- {
- //putc('\n', high);
- fprintf(high, "%s %d\n", jogador->nome, jogador->score); //salva no .txt
- fclose(high);
- }
- }
- /**Ordena o highscores.txt**/
- void ordena_score()
- {
- char nome[255], auxs[30]; //variaveis auxiliares
- FILE *score; //ponteiro do arquivo
- HIGHSCORE scores[255]; //variavel do tipo HIGHSCORE para buffer
- int i=0,j=0,c=0,auxi; //int auxiliares
- score=fopen("highscores.txt","r+"); //abre o arquivo praa leitura
- if(!score) //msg caso de erro ao abrir
- printf("Erro ao ordenar");
- else
- {
- while(!feof(score)) //enquanto não chega no fim do arquivo
- {
- fgets(nome,255,score); //pega a string do primeiro da posição
- strcpy(scores[i].nome,strtok(nome," ")); //separa em tokens
- scores[i].score =atoi(strtok(NULL," ")); //e passa para inteiro
- i++; //para contar o numero strings
- }
- for(c=i-1;c>=1;c--) //bubble sort
- {
- for(j=0;j<c;j++)
- {
- if (scores[j].score<scores[j+1].score)
- {
- auxi = scores[j].score; //inverte os numeros
- scores[j].score=scores[j+1].score;
- scores[j+1].score=auxi;
- strcpy(auxs, scores[j].nome); //inverte as strings
- strcpy(scores[j].nome, scores[j+1].nome);
- strcpy(scores[j+1].nome, auxs);
- }
- }
- }
- rewind(score); //recomeça para salvar
- i--; //porque o i excede em 1
- for(j=0;j<i;j++) //salva os arquivos
- fprintf(score,"%s %d\n",scores[j].nome, scores[j].score);
- fclose(score); //fecha arquivo
- }
- }
- /**Carrega e mostra os 5 arquivos do topo do .txt**/
- void highscore(FILE *high) //printa os highscores
- {
- char buffer[255]; //buffer temporário
- int achou=0; //caso ache o arquivo
- ordena_score(); //ordena o arquivo
- PlaySound(NULL, 0, 0);
- PlaySound("Ending_1", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
- clrscr();
- textcolor(YELLOW); //printa a tela
- gotoxy(9,4); printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
- gotoxy(9,5); printf("$ $");
- gotoxy(9,6); printf("$ HIGHSCORES $");
- gotoxy(9,7); printf("$ $");
- gotoxy(9,8); printf("$ $");
- gotoxy(9,9); printf("$ $");
- gotoxy(9,10);printf("$ $");
- gotoxy(9,11);printf("$ $");
- gotoxy(9,12);printf("$ $");
- gotoxy(9,13);printf("$ $");
- gotoxy(9,14);printf("$ $");
- gotoxy(9,15);printf("$ $");
- gotoxy(9,16);printf("$ $");
- gotoxy(9,17);printf("$ $");
- gotoxy(9,18);printf("$ $");
- gotoxy(9,19);printf("$ $");
- gotoxy(9,20);printf("$ $");
- gotoxy(9,21);printf("$ $");
- gotoxy(9,22);printf("$ $");
- gotoxy(9,23);printf("$ $");
- gotoxy(9,24);printf("$ $");
- gotoxy(9,25);printf("$ $");
- gotoxy(9,26);printf("$ $");
- gotoxy(9,27);printf("$ $");
- gotoxy(9,28);printf("$ $");
- gotoxy(9,29);printf("$ $");
- gotoxy(9,30);printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
- if ((high = fopen ("highscores.txt", "r"))==NULL) //abre o arquivo para leitura1
- {
- gotoxy(16,16);printf("Erro ao abrir o arquivo"); //msg de erro caso haja erro
- } else
- {
- while(!feof(high)) //enquanto não tiver no final do arquivo
- {
- fgets(buffer,255,high); //le o arquivo
- gotoxy(24,10+achou); //printa na posição correta
- if(achou>=0 && achou<3) //limita a 5 o número de mostrados no highscore
- printf("Usuario:%s", buffer);
- achou++;
- }
- fclose(high); //fecha o arquivo
- }
- Sleep(10000);
- PlaySound(NULL, 0, 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement