Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <stdbool.h> #include <time.h> #ifdef _WIN32 #include <windows.h> #endif // _WIN32 #define LINHA 10 #define COLUNA 10 #define FACIL 15 #define MEDIO 20 #define DIFICIL 25 #define MENUPRINCIPAL 0 #define MENUJOGO 1 #define BOMBA '*' char jogar(); bool ganhou(); void menu(int); void limpaTela(); void pausa(char*); void imprimeCampo(); void lerOpcao(char*); void preencheDicas(); void imprimeBombas(); void imprimeRegras(); int selecionaNivel(); void gotoxy(int, int); void expande(int, int); void imprimeDica(bool*); void preencheBombas(int); char bombas[LINHA][COLUNA] = {}; char campo[LINHA][COLUNA] = {}; int main() { // Por padrao o usuario deve escolher um novo jogo char opcao; bool dica; /** Animação Inicial; **/ do { limpaTela(); menu(MENUPRINCIPAL); lerOpcao(&opcao); switch(opcao) { case 'n': // Novo Jogo dica = true; limpaTela(); memset(campo , '-', LINHA*COLUNA); memset(bombas, '0', LINHA*COLUNA); imprimeCampo(); menu(MENUJOGO); preencheBombas( selecionaNivel() ); preencheDicas(); do { opcao = jogar(); switch(opcao) { case 't': // Dica imprimeDica(&dica); break; case 'r': // Regras do Jogo limpaTela(); menu(MENUJOGO); imprimeRegras(); pausa("\n\nTecle <enter> para voltar ao jogo!"); imprimeCampo(); break; case 's': // Sair break; default: gotoxy(1, 15); printf("Opcao invalida! Tente Novamente!\n"); } } while(opcao != 's' && opcao != 'm'); break; case 'r': // Regras do Jogo limpaTela(); imprimeRegras(); pausa("\n\nTecle <enter> para voltar ao menu principal!"); imprimeCampo(); break; case 's': // Sair break; default: gotoxy(1, 15); printf("Opcao invalida! Tente novamente!\n"); } } while(opcao != 's'); gotoxy(1, 18); return 0; } void imprimeRegras() { gotoxy(20, 2); printf("Regras do Jogo: \n"); gotoxy(1, 4); printf(". Se voce descobrir uma mina, o jogo acaba;\n"); printf(". Se descobrir um quadrado vazio, voce continua jogando;\n"); printf(". Se aparecer um numero, ele informara quantas minas estao\n"); printf(" escondidas nos oito quadrados que o cercam;\n"); printf(". Voce usa essa informacao para deduzir em que\n"); printf(" quadrados proximos e seguro clicar;\n"); } void pausa(char* msg) { printf("%s!", msg); getchar(); getchar(); } void imprimeDica(bool* dica) { if(*dica) { int i, j; for(i = 0; i < LINHA; i++) { for(j = 0; j < COLUNA; j++) { if(campo[i][j] == '-' && bombas[i][j] != BOMBA) { gotoxy(1, 15); printf("Nao tem bomba na linha '%d' coluna '%c' =) !\n", i, 'A' + j); *dica = false; pausa("Tecle <enter> para voltar ao jogo!"); return; } } } } else { gotoxy(1, 15); printf("Voce nao pode pedir mais dicas nessa partida =( !\n"); pausa("Tecle <enter> para voltar ao jogo!"); } } void limpaTela() { #ifdef __linux__ system("clear"); #elif _WIN32 system("cls"); #endif } char jogar() { int lin, col; char aux; do { limpaTela(); imprimeCampo(); menu(MENUJOGO); do { gotoxy(1, 13); printf("Linha: "); lerOpcao(&aux); lin = aux; // Opcoes do menu: t - Dica, r - Regras, s - Sair, m - Menu Principal; if(lin == 'm' || lin == 't' || lin == 'r' || lin == 's') return lin; lin = lin - '0'; } while(lin < 0 || lin > LINHA); do { gotoxy(1, 14); printf("Coluna: "); lerOpcao(&aux); col = aux; // Opcoes do menu: t - Dica, r - Regras, s - Sair, m - Menu Principal; if(col == 'm' || col == 't' || col == 'r' || col == 's') return col; col = col - 'a'; } while(col < 0 || col > COLUNA); if(bombas[lin][col] == BOMBA) { gotoxy(1, 1); imprimeBombas(); printf("\n\n\n\n\t\tVoce perdeu =( !\n"); pausa("Tecle <enter> para voltar ao menu principal!"); return 'm'; } else { campo[lin][col] = bombas[lin][col]; expande(lin, col); } } while( !ganhou() ); } bool ganhou() { return false; } void preencheDicas() { int linha, coluna; int lin, col; int cont; for(linha = 0; linha < LINHA; linha++) { for(coluna = 0; coluna < COLUNA; coluna++) { cont = 0; if(bombas[linha][coluna] != BOMBA) { for(lin = linha - 1; lin <= linha + 1; lin++) { for(col = coluna - 1; col <= coluna + 1; col++) { if(lin >= 0 && lin < LINHA && col >= 0 && col < COLUNA && bombas[lin][col] == BOMBA) cont++; } } bombas[linha][coluna] = '0' + cont; } } } } void expande(int lin, int col) { if(bombas[lin][col] != '0') campo[lin][col] = bombas[lin][col]; else { int i, j; for(i = lin - 1; i <= lin + 1; i++) { for(j = col - 1; j <= col + 1; j++) { if(i >= 0 && i < LINHA && j >= 0 && j < COLUNA && campo[i][j] == '-') { campo[i][j] = bombas[i][j]; expande(i, j); } } } } } void lerOpcao(char* opcao) { fflush(stdin); scanf("%c", opcao); *opcao = tolower(*opcao); } int selecionaNivel() { int col = 1; int lin = 15; int nivel; gotoxy(col, lin++); printf(" 1 - Nivel Facil (15 Bombas)\n"); gotoxy(col, lin++); printf(" 2 - Nivel Medio (20 Bombas)\n"); gotoxy(col, lin++); printf(" 3 - Nivel Dificil (25 Bombas)\n"); do { fflush(stdin); gotoxy(col + 5, lin); scanf("%d", &nivel); } while( nivel < 1 || nivel > 3 ); switch(nivel) { case 1: return FACIL; case 2: return MEDIO; case 3: return DIFICIL; } } void menu(int m) { // Posição do menu int col; int lin; switch(m) { case MENUPRINCIPAL: col = 35; lin = 5; gotoxy(col, lin++);printf("+-- MENU PRINCIPAL --+"); gotoxy(col, lin++);printf("| N - Novo Jogo |"); gotoxy(col, lin++);printf("| R - Regras |"); gotoxy(col, lin++);printf("| K - Ranking |"); gotoxy(col, lin++);printf("| S - Sair |"); gotoxy(col, lin++);printf("+--------------------+"); break; case MENUJOGO: col = 65; lin = 2; gotoxy(col, lin++);printf("+------- MENU -------+"); gotoxy(col, lin++);printf("| M - Menu Principal |"); gotoxy(col, lin++);printf("| R - Regras |"); gotoxy(col, lin++);printf("| T - Dica |"); gotoxy(col, lin++);printf("| S - Sair |"); gotoxy(col, lin++);printf("+--------------------+"); break; } gotoxy(col + 4, lin); } void imprimeBombas() { int i, j; /** Cabecalho **/ printf(" |"); for(i = 0; i < LINHA; i++) printf(" %c |", 'A' + i); printf("\n"); for(i = 0; i < LINHA; i++) { printf("%2d |", i); for(j = 0; j < COLUNA; j++) { if(bombas[i][j] != BOMBA) printf(" "); else printf(" %c ", bombas[i][j]); } printf("\n"); } } void imprimeCampo() { int i, j; /** Cabecalho **/ printf(" |"); for(i = 0; i < LINHA; i++) printf(" %c |", 'A' + i); printf("\n"); for(i = 0; i < LINHA; i++) { printf("%2d |", i); for(j = 0; j < COLUNA; j++) printf(" %c ", campo[i][j]); printf("\n"); } } void preencheBombas(int numBombas) { int lin, col; int cont = 0; srand( (unsigned int) time(NULL) ); while( cont != numBombas ) { lin = rand() % LINHA; col = rand() % COLUNA; if( bombas[lin][col] != BOMBA ) { bombas[lin][col] = BOMBA; cont++; } } } void gotoxy(int x, int y) { printf("\033[%d;%df", y, x); fflush(stdout); } /* void gotoxy(int col, int lin) { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){ col - 1, lin - 1 }); } */
Compartilhar