A implementação do nosso Jogo Campo Minado aqui em nosso Curso de Programação C foi finalizada na aula anterior. Nesta aula vamos testar nosso jogo campo minado.
JOGO CAMPO MINADO Parte 1
JOGO CAMPO MINADO Parte 2
JOGO CAMPO MINADO Parte 3
JOGO CAMPO MINADO Parte 4
JOGO CAMPO MINADO Parte 5
JOGO CAMPO MINADO Parte 6
Código completo para o Jogo Campo Minado em C
#include <stdio.h> #include <stdlib.h> #include <time.h> /* Aula 178: Jogo Campo Minado Completo Código escrito por Wagner Gaspar Maio de 2021 CELULA eBomba 0 ou 1 estaAberta 0 ou 1 vizinhos 0 a 4 */ typedef struct{ int eBomba; int estaAberta; int vizinhos; }Celula; // variáveis globais Celula jogo[10][10]; int l, c, tam = 10; // procedimento para inicializar a matriz do jogo void inicializarJogo(){ for(l = 0; l < tam; l++){ for(c = 0; c < tam; c++){ jogo[l][c].eBomba = 0; jogo[l][c].estaAberta = 0; jogo[l][c].vizinhos = 0; } } } // procedimento para sortear n bombas void sortearBombas(int n){ int i, bombas = 0; srand(time(NULL)); for(i = 1; i <= n; i++){ l = rand() % tam; c = rand() % tam; if(jogo[l][c].eBomba == 0){ jogo[l][c].eBomba = 1; bombas++; } else i--; } } /* função que diz se um par de coordenadas é válido ou não 1 - é válido 0 - não é válido */ int coordenadaEhValida(int l, int c){ if(l >= 0 && l < tam && c >= 0 && c < tam) return 1; else return 0; } /* função que retorna a quantidade de bombas na vizinhança de l c n - quantidade de bombas */ int quantBombasVizinhas(int l, int c){ /* l - 1 e c l + 1 e c l e c + 1 l e c - 1 */ int quantidade = 0; if(coordenadaEhValida(l - 1, c) && jogo[l-1][c].eBomba) quantidade++; if(coordenadaEhValida(l + 1, c) && jogo[l+1][c].eBomba) quantidade++; if(coordenadaEhValida(l, c + 1) && jogo[l][c+1].eBomba) quantidade++; if(coordenadaEhValida(l, c - 1) && jogo[l][c-1].eBomba) quantidade++; return quantidade; } // procedimento para contar as bombas vizinhas void contarBombas(){ for(l = 0; l < tam; l++){ for(c = 0; c < tam; c++) jogo[l][c].vizinhos = quantBombasVizinhas(l, c); } } // procedimento para imprimir o jogo void imprimir(){ printf("\n\n\t "); for(l = 0; l < tam; l++) printf(" %d ", l); // índices das colunas printf("\n\t -----------------------------------------\n"); for(l = 0; l < tam; l++){ printf("\t%d |", l); // índices das linhas for(c = 0; c < tam; c++){ if(jogo[l][c].estaAberta){ if(jogo[l][c].eBomba) printf(" * "); else printf(" %d ", jogo[l][c].vizinhos); } else printf(" "); printf("|"); } printf("\n\t -----------------------------------------\n"); } } // procedimento para abrir a coordenada digitada pelo usuário void abrirCelula(int l, int c){ if(coordenadaEhValida(l, c) == 1 && jogo[l][c].estaAberta == 0){ jogo[l][c].estaAberta = 1; if(jogo[l][c].vizinhos == 0){ /* l-1 e c acima l+1 e c abaixo l e c+1 direita l e c-1 esquerda */ abrirCelula(l-1, c); abrirCelula(l+1, c); abrirCelula(l, c+1); abrirCelula(l, c-1); } } } /* função para verificar vitória n > 0 - não ganhou ainda 0 - ganhou */ int ganhou(){ int quantidade = 0; for(l = 0; l < tam; l++){ for(c = 0; c < tam; c++){ if(jogo[l][c].estaAberta == 0 && jogo[l][c].eBomba == 0) quantidade++; } } return quantidade; } // procedimento jogar que faz a leitura das coordenadas void jogar(){ int linha, coluna; do{ imprimir(); do{ printf("\nDigite as coordenadas de linha e coluna: "); scanf("%d%d", &linha, &coluna); if(coordenadaEhValida(linha, coluna) == 0 || jogo[linha][coluna].estaAberta == 1) printf("\nCoordenada invalida ou ja aberta!"); }while(coordenadaEhValida(linha, coluna) == 0 || jogo[linha][coluna].estaAberta == 1); abrirCelula(linha, coluna); }while(ganhou() != 0 && jogo[linha][coluna].eBomba == 0); if(jogo[linha][coluna].eBomba == 1) printf("\n\tQue pena! Voce perdeu!!!\n"); else printf("\n\tPARABENS! VOCE GANHOU!!!\n"); imprimir(); } int main() { int opcao; do{ inicializarJogo(); sortearBombas(20); contarBombas(); printf("\n\t\t\tCAMPO MINADO\n"); jogar(); printf("\nDigite 1 para jogar novamente: "); scanf("%d", &opcao); }while(opcao == 1); return 0; }