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();
+	}
+}