diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000000000000000000000000000000000000..99e53aa53d3faef900d45a380f58365115033f7a --- /dev/null +++ b/src/main.c @@ -0,0 +1,495 @@ +#include "baralho.h" +#include "mesa.h" + +int main (void) { + FILE *placar, *save; + Baralho bar; + + /* Mesa é uma matriz de montes. + [00]..[15] = periferia + [16]..[19] = decrescente + [20]..[23] = crescente */ + Monte mesa[24]; + int cartas_restantes; //[1..96], 96 posições + int modo; + int embaralhamentos; + int jogada; + time_t tempo_atual; + int tempo_de_jogo, inicio, atual; + char lixo; + int test1, test2; + Carta busca_ori, busca_dest; + Carta mao_ori, mao_dest; + int i, j; + int saveNum, qtdeSaves; + time_t tempoSave; + tm *tempoSaveLocal; + /* 0 = ganhou, 1 = perdeu, 2 = esta jogando */ + int perdeu; + + time(&tempoSave); + tempoSaveLocal = localtime(&tempoSave); + + //inicializa a carta NADA, que foi uma forma que eu criei para representar NULL + NADA.valor = '0'; + NADA.naipe = '0'; + + placar = fopen("PLACAR.txt", "r+"); + mkdir("../SAVES", 0777); + + //esse printf funciona como um clear screen + printf("\e[H\e[2J"); + + printf("Voce quer carregar um jogo antigo? [0/1]: "); + scanf("%d", &load); + + /* Iniciou um jogo novo */ + if (load == 0) { + perdeu = 2; + cartas_restantes = 96; + embaralhamentos = 5; + i = 0; + + //parte de gerar o tabuleiro + bar = init("baralho.ppm", 71, 96, '2', "PECO"); + bar = geraBaralho(bar); + inicializa_mesa(mesa); + cria_blocos_centrais(mesa); + distribui_periferia(mesa, bar, cartas_restantes); + embaralha_periferia(mesa); + printf("\e[H\e[2J"); + + saveNum = numero_do_save(); + + //parte de escolher o modo de jogo + printf("Qual vai ser o tipo de jogo? 0-Modo livre\n"); + printf(" 1-Contra o tempo\n"); + scanf("%d", &modo); + if (modo) { + printf("Quanto tempo voce quer? (entre com o valor em minutos) ");; + scanf("%d", &tempo_de_jogo); + if (tempo_de_jogo == 0) + tempo_de_jogo = 20 * 60; + else + tempo_de_jogo = tempo_de_jogo * 60; + time(&tempo_atual); + inicio = segundos(localtime(&tempo_atual)); + } + printf("\e[H\e[2J"); + imprime_tabuleiro(mesa, bar); + if (modo) { + time(&tempo_atual); + atual = segundos(localtime(&tempo_atual)); + printf("Voce tem %d minutos e %d segundos restantes.\n", converte_minutos(tempo_de_jogo - (atual - inicio)), (tempo_de_jogo - (atual - inicio)) % 60); + } + + //escolhe as jogadas + printf("Qual vai ser a sua jogada? [0/1/2/3/4]: "); + scanf("%d", &jogada); + lixo = getchar(); + + /* Esse lasso se repete enquanto o usuário não entrar com o número 3, + ou seja, ele se repete enquanto o usuário não desistir da partida. */ + while (jogada != 0) { + test1 = 1; + test2 = 1; + + /* Caso o usuário entre com o número 1 o programa passa + a executar esse trecho que se refere ao movimento + das cartas */ + if (jogada == 1) { + + /* test1 e test2 são duas variáveis para controlar o lasso. + O lasso do test1 se quebra quando as cartas de origem e + destino são encontradas. + O lasso do test2 se quebra quando a carta de origem é + encontrada. */ + while (test1) { + while (test2) { + if (converte_minutos(tempo_de_jogo - (atual - inicio)) <= 0 && (tempo_de_jogo - (atual - inicio)) % 60 <= 0) { + printf("Tempo esgotado, voce perdeu. :(\n"); + printf("Quer jogar de novo? [0/1]: "); + scanf("%d", &i); + if (i) + main(); + else + exit(1); + } + printf("Voce quer mover qual carta? [entre com 00 para voltar ao menu]: "); + scanf("%c %c", &busca_ori.valor, &busca_ori.naipe); + lixo = getchar(); + if (busca_ori.valor == '0' && busca_ori.naipe == '0') { + break; + } + if (jogada_possivel_ori(mesa, busca_ori, bar)) { + i = posicao_ori(mesa, busca_ori, bar); + mao_ori = verificaTopo(mesa[i], bar); + test2 = 0; + } + else { + printf("Carta nao encontrada, tente outra.\n"); + test2 = 1; + } + } + if (busca_ori.valor == '0' && busca_ori.naipe == '0') { + break; + } + printf("Para onde voce quer mover a carta? "); + scanf("%c %c", &busca_dest.valor, &busca_dest.naipe); + lixo = getchar(); + if (jogada_possivel_dest(mesa, mao_ori, busca_dest, bar)) { + mao_dest = verificaTopo(mesa[i], bar); + j = posicao_dest(mesa, busca_dest, bar); + mesa[j] = colocaCarta(2, mao_dest, mesa[j]); + tiraCarta(mesa[i], bar); + test1 = 0; + printf("\e[H\e[2J"); + imprime_tabuleiro(mesa, bar); + if (modo) { + time(&tempo_atual); + atual = segundos(localtime(&tempo_atual)); + + /* O argumento do primeiro %d calcula quantos minutos restam até + que o tempo estipulado pelo usuário se esgote, através da conta + TEMPO_ESTIPULADO - TEMPO_DECORRIDO. + O argumento do segundo %d tem a mesma lógica do primeiro %d + porém o número resultande é o resto da divisão por 60, o que + indica o número de segundos restantes. */ + printf("Voce tem %d minutos e %d segundos restantes.\n", converte_minutos(tempo_de_jogo - (atual - inicio)), (tempo_de_jogo - (atual - inicio)) % 60); + } + cartas_restantes--; + } + else { + printf("Destino nao encontrado ou impossivel de empilhar.\n"); + test1 = 1; + test2 = 1; + } + + /* Caso o usuário tenha ganhado o jogo no modo + contra o tempo, o tempo dele é análisado e + caso seja melhor que um dos 10 primeiros, ele + é adicionado à lista de melhores tempos */ + if (ganhou(mesa, bar)) { + printf("VOCE GANHOU!!\n"); + perdeu = 0; + salva_jogo(mesa, bar, modo, embaralhamentos, tempo_de_jogo, atual, inicio, saveNum, perdeu); + if (modo) + analiza_tempo(placar, inicio, atual); + printf("MELHORES TEMPOS:\n"); + imrpime_melhores_tempos(placar); + printf("Quer jogar de novo? [0/1]: "); + scanf("%d", &i); + if (i) + main(); + else + exit(1); + } + else { + if (modo) { + + /* Verifica se o tempo estipulado pelo usuário + já se esgotou pelo cálculo: TEMPO_ESTIPULADO - TEMPO_DECORRIDO + (o mesmo cálculo é feito com os segundos, porém usando o resto + da divsão por 60). + Caso ambos os cálculos resultem em 0 o programa é abortado e + o usuário perde. */ + if (converte_minutos(tempo_de_jogo - (atual - inicio)) <= 0 && (tempo_de_jogo - (atual - inicio)) % 60 <= 0) { + printf("Tempo esgotado, voce perdeu. :(\n"); + printf("Quer jogar de novo? [0/1]: "); + scanf("%d", &i); + if (i) + main(); + else + exit(1); + } + } + } + } + } + else { + if (jogada == 2) { + + /* Esse if ocorre caso a jogada escolhida seja 2 + (embaralhamento) e o usuário tenha embaralhamentos + restantes. + A periferia é embaralhada com a função rand e + depois é colocada de volta na mesa. */ + if (embaralhamentos != 0) { + for (i = 0; i < 16; i++) + mesa[i] = embaralha(mesa[i]); + embaralhamentos--; + printf("\e[H\e[2J"); + imprime_tabuleiro(mesa, bar); + if (modo) { + time(&tempo_atual); + atual = segundos(localtime(&tempo_atual)); + printf("Voce tem %d minutos e %d segundos restantes.\n", converte_minutos(tempo_de_jogo - (atual - inicio)), (tempo_de_jogo - (atual - inicio)) % 60); + } + printf("Voce tem %d embaralhamentos restantes.\n", embaralhamentos); + } + else + printf("Voce nao tem mais embaralhamentos.\n"); + } + else { + if (jogada == 3) { + salva_jogo(mesa, bar, modo, embaralhamentos, tempo_de_jogo, atual, inicio, saveNum, perdeu); + printf("Jogo %d salvo. %2.2d:%2.2d:%2.2d %2.2d/%2.2d/%d\n", saveNum, tempoSaveLocal->tm_hour, tempoSaveLocal->tm_min, tempoSaveLocal->tm_sec, tempoSaveLocal->tm_mday, tempoSaveLocal->tm_mon, tempoSaveLocal->tm_year+1900); + } + else { + salva_jogo(mesa, bar, modo, embaralhamentos, tempo_de_jogo, atual, inicio, saveNum, perdeu); + printf("Jogo %d salvo. %2.2d:%2.2d:%2.2d %2.2d/%2.2d/%d\n", saveNum, tempoSaveLocal->tm_hour, tempoSaveLocal->tm_min, tempoSaveLocal->tm_sec, tempoSaveLocal->tm_mday, tempoSaveLocal->tm_mon, tempoSaveLocal->tm_year+1900); + exit(1); + } + } + } + printf("Qual vai ser a sua jogada? [0/1/2/3/4]: "); + if(ganhou(mesa, bar)) { + printf("VOCE GANHOU!!\n"); + perdeu = 0; + salva_jogo(mesa, bar, modo, embaralhamentos, tempo_de_jogo, atual, inicio, saveNum, perdeu); + if (modo) + analiza_tempo(placar, inicio, atual); + printf("MELHORES TEMPOS:\n"); + imrpime_melhores_tempos(placar); + printf("Quer jogar de novo? [0/1]: "); + scanf("%d", &i); + if (i) + main(); + else + exit(1); + } + else { + scanf("%d", &jogada); + lixo = getchar(); + } + } + perdeu = 1; + salva_jogo(mesa, bar, modo, embaralhamentos, tempo_de_jogo, atual, inicio, saveNum, perdeu); + printf("Fim de jogo.\n"); + printf("MELHORES TEMPOS:\n"); + imrpime_melhores_tempos(placar); + fclose(placar); + printf("Quer jogar de novo? [0/1]: "); + scanf("%d", &i); + if (i) + main(); + } + + /* Carregou um jogo antigo */ + else { + printf("Saves encontrados: "); + qtdeSaves = saves_encontrados(); + if (qtdeSaves == 0) { + printf("Nenhum save foi encontrado!"); + main(); + } + + //parte de gerar o tabuleiro + bar = init("baralho.ppm", 71, 96, '2', "PECO"); + bar = geraBaralho(bar); + inicializa_mesa(mesa); + + LASSO: printf("Qual save voce quer carregar? [1..%d]: ", qtdeSaves); + scanf("%d", &saveNum); + lixo = getchar(); + while (saveNum > qtdeSaves || saveNum == 0) { + printf("Save nao encontrado, tente outro: "); + scanf("%d", &saveNum); + lixo = getchar(); + } + carrega_jogo(mesa, bar, &modo, &embaralhamentos, &tempo_de_jogo, &atual, &inicio, saveNum, &perdeu); + if (perdeu == 1) { + printf("Voce perdeu esse jogo, ele nao pode ser carregado. Tente outro.\n"); + goto LASSO; + } + + printf("\e[H\e[2J"); + + + //printf("%c%c ", mesa[0][0][0], mesa[0][0][1]); + printf("\e[H\e[2J"); + time(&tempo_atual); + inicio = segundos(localtime(&tempo_atual)); + imprime_tabuleiro(mesa, bar); + if (modo) { + time(&tempo_atual); + atual = segundos(localtime(&tempo_atual)); + printf("Voce tem %d minutos e %d segundos restantes.\n", converte_minutos(tempo_de_jogo - (atual - inicio)), (tempo_de_jogo - (atual - inicio)) % 60); + } + + //escolhe as jogadas + printf("Qual vai ser a sua jogada? [0/1/2/3/4]: "); + scanf("%d", &jogada); + lixo = getchar(); + + /* Esse lasso se repete enquanto o usuário não entrar com o número 3, + ou seja, ele se repete enquanto o usuário não desistir da partida. */ + while (jogada != 0) { + test1 = 1; + test2 = 1; + + /* Caso o usuário entre com o número 1 o programa passa + a executar esse trecho que se refere ao movimento + das cartas */ + if (jogada == 1) { + + /* test1 e test2 são duas variáveis para controlar o lasso. + O lasso do test1 se quebra quando as cartas de origem e + destino são encontradas. + O lasso do test2 se quebra quando a carta de origem é + encontrada. */ + while (test1) { + while (test2) { + if (converte_minutos(tempo_de_jogo - (atual - inicio)) <= 0 && (tempo_de_jogo - (atual - inicio)) % 60 <= 0) { + printf("Tempo esgotado, voce perdeu. :(\n"); + printf("Quer jogar de novo? [0/1]: "); + scanf("%d", &i); + if (i) + main(); + else + exit(1); + } + printf("Voce quer mover qual carta? [entre com 00 para voltar ao menu]: "); + scanf("%c %c", &busca_ori.valor, &busca_ori.naipe); + lixo = getchar(); + if (busca_ori.valor == '0' && busca_ori.naipe == '0') { + break; + } + if (jogada_possivel_ori(mesa, busca_ori, bar)) { + i = posicao_ori(mesa, busca_ori, bar); + mao_ori = verificaTopo(mesa[i], bar); + test2 = 0; + } + else { + printf("Carta nao encontrada, tente outra.\n"); + test2 = 1; + } + } + if (busca_ori.valor == '0' && busca_ori.naipe == '0') { + break; + } + printf("Para onde voce quer mover a carta? "); + scanf("%c %c", &busca_dest.valor, &busca_dest.naipe); + lixo = getchar(); + if (jogada_possivel_dest(mesa, mao_ori, busca_dest, bar)) { + mao_dest = verificaTopo(mesa[i], bar); + j = posicao_dest(mesa, busca_dest, bar); + mesa[j] = colocaCarta(2, mao_dest, mesa[j]); + tiraCarta(mesa[i], bar); + test1 = 0; + printf("\e[H\e[2J"); + imprime_tabuleiro(mesa, bar); + if (modo) { + time(&tempo_atual); + atual = segundos(localtime(&tempo_atual)); + + /* O argumento do primeiro %d calcula quantos minutos restam até + que o tempo estipulado pelo usuário se esgote, através da conta + TEMPO_ESTIPULADO - TEMPO_DECORRIDO. + O argumento do segundo %d tem a mesma lógica do primeiro %d + porém o número resultande é o resto da divisão por 60, o que + indica o número de segundos restantes. */ + printf("Voce tem %d minutos e %d segundos restantes.\n", converte_minutos(tempo_de_jogo - (atual - inicio)), (tempo_de_jogo - (atual - inicio)) % 60); + } + cartas_restantes--; + } + else { + printf("Destino nao encontrado ou impossivel de empilhar.\n"); + test1 = 1; + test2 = 1; + } + + /* Caso o usuário tenha ganhado o jogo no modo + contra o tempo, o tempo dele é análisado e + caso seja melhor que um dos 10 primeiros, ele + é adicionado à lista de melhores tempos */ + if (ganhou(mesa, bar)) { + if (modo) + analiza_tempo(placar, inicio, atual); + printf("Voce ganhou!!!\n"); + test1 = 0; + test2 = 0; + } + else { + if (modo) { + + /* Verifica se o tempo estipulado pelo usuário + já se esgotou pelo cálculo: TEMPO_ESTIPULADO - TEMPO_DECORRIDO + (o mesmo cálculo é feito com os segundos, porém usando o resto + da divsão por 60). + Caso ambos os cálculos resultem em 0 o programa é abortado e + o usuário perde. */ + if (converte_minutos(tempo_de_jogo - (atual - inicio)) <= 0 && (tempo_de_jogo - (atual - inicio)) % 60 <= 0) { + printf("Tempo esgotado, voce perdeu. :(\n"); + printf("Quer jogar de novo? [0/1]: "); + scanf("%d", &i); + if (i) + main(); + else + exit(1); + } + } + } + } + } + else { + if (jogada == 2) { + + /* Esse if ocorre caso a jogada escolhida seja 2 + (embaralhamento) e o usuário tenha embaralhamentos + restantes. + A periferia é embaralhada com a função rand e + depois é colocada de volta na mesa. */ + if (embaralhamentos != 0) { + for (i = 0; i < 16; i++) + mesa[i] = embaralha(mesa[i]); + embaralhamentos--; + printf("\e[H\e[2J"); + imprime_tabuleiro(mesa, bar); + if (modo) { + time(&tempo_atual); + atual = segundos(localtime(&tempo_atual)); + printf("Voce tem %d minutos e %d segundos restantes.\n", converte_minutos(tempo_de_jogo - (atual - inicio)), (tempo_de_jogo - (atual - inicio)) % 60); + } + printf("Voce tem %d embaralhamentos restantes.\n", embaralhamentos); + } + else + printf("Voce nao tem mais embaralhamentos.\n"); + } + else { + + /* Esse if ocorre caso a jogada escolhida seja 3 + (salvar o jogo) */ + if (jogada == 3) { + salva_jogo(mesa, bar, modo, embaralhamentos, tempo_de_jogo, atual, inicio, saveNum, perdeu); + printf("Jogo %d salvo. %2.2d:%2.2d:%2.2d %2.2d/%2.2d/%d\n", saveNum, tempoSaveLocal->tm_hour, tempoSaveLocal->tm_min, tempoSaveLocal->tm_sec, tempoSaveLocal->tm_mday, tempoSaveLocal->tm_mon, tempoSaveLocal->tm_year+1900); + } + + /* Esse else ocorre caso a jogada esja 4 (interromper o jogo) */ + else { + salva_jogo(mesa, bar, modo, embaralhamentos, tempo_de_jogo, atual, inicio, saveNum, perdeu); + printf("Jogo %d salvo. %2.2d:%2.2d:%2.2d %2.2d/%2.2d/%d\n", saveNum, tempoSaveLocal->tm_hour, tempoSaveLocal->tm_min, tempoSaveLocal->tm_sec, tempoSaveLocal->tm_mday, tempoSaveLocal->tm_mon, tempoSaveLocal->tm_year+1900); + exit(1); + } + } + } + printf("Qual vai ser a sua jogada? [0/1/2/3/4]: "); + if(ganhou(mesa, bar)) + jogada = 0; + else { + scanf("%d", &jogada); + lixo = getchar(); + } + } + perdeu = 1; + salva_jogo(mesa, bar, modo, embaralhamentos, tempo_de_jogo, atual, inicio, saveNum, perdeu); + printf("Fim de jogo.\n"); + printf("MELHORES TEMPOS:\n"); + imrpime_melhores_tempos(placar); + fclose(placar); + printf("Quer jogar de novo? [0/1]: "); + scanf("%d", &i); + if (i) + main(); + } +}