Buscar

Campo Minado em C - Multiplataforma

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 });
}
*/

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais