Skip to content
Snippets Groups Projects
Commit 0d0460f0 authored by Matheus Rotondano De Camargo's avatar Matheus Rotondano De Camargo
Browse files

Upload new file

parent ea285411
Branches
No related tags found
No related merge requests found
#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();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment