Este artigo descreve a implementação do jogo do campo minado em linguagem C, utilizando uma estrutura modular com arquivos de cabeçalho e código fonte. O jogo é configurado para uma grade 9x9 com 10 minas, permitindo ao jogador revelar células até encontrar todas as minas ou ser derrotado.
Arquivo de Cabeçalho: campo_minado.h
O arquivo de cabeçalho centraliza definições essenciais, como macros para o tamanho da grade, contagem de minas, inclusões de bibliotecas padrão e declarações de funções.
#define _CRT_SECURE_NO_WARNINGS
#define LINHAS 9
#define COLUNAS 9
#define TOTAL_LINHAS LINHAS + 2
#define TOTAL_COLUNAS COLUNAS + 2
#define MINAS_FACIL 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void exibir_menu();
void iniciar_jogo();
void configurar_grade(char grade[TOTAL_LINHAS][TOTAL_COLUNAS], int linhas, int colunas, char caractere);
void mostrar_grade(char grade[TOTAL_LINHAS][TOTAL_COLUNAS], int linhas, int colunas);
void posicionar_minas(char grade[TOTAL_LINHAS][TOTAL_COLUNAS], int linhas, int colunas);
int calcular_minas_vizinhas(char minas[TOTAL_LINHAS][TOTAL_COLUNAS], int posX, int posY);
void explorar_campo(char minas[TOTAL_LINHAS][TOTAL_COLUNAS], char visivel[TOTAL_LINHAS][TOTAL_COLUNAS], int linhas, int colunas);</time.h></stdlib.h></stdio.h>
Arquivo Principal: principle.c
O arquivo principal contém a lógica do menu e a função principal que gerencia o fluxo do jogo.
#include "campo_minado.h"
void exibir_menu()
{
printf("** Bem-vindo ao Campo Minado! **\n");
printf("******************************\n");
printf("*********1. JOGAR*************\n");
printf("*********0. SAIR**************\n");
printf("******************************\n");
}
void iniciar_jogo()
{
char minas[TOTAL_LINHAS][TOTAL_COLUNAS] = { 0 };
char visivel[TOTAL_LINHAS][TOTAL_COLUNAS] = { 0 };
configurar_grade(minas, TOTAL_LINHAS, TOTAL_COLUNAS, '0');
configurar_grade(visivel, TOTAL_LINHAS, TOTAL_COLUNAS, '*');
mostrar_grade(visivel, LINHAS, COLUNAS);
posicionar_minas(minas, LINHAS, COLUNAS);
explorar_campo(minas, visivel, LINHAS, COLUNAS);
}
int main()
{
int opcao;
srand((unsigned int)time(NULL));
do
{
exibir_menu();
printf("Escolha uma opção: ");
scanf("%d", &opcao);
switch (opcao)
{
case 1:
printf("Iniciando o jogo...\n");
iniciar_jogo();
break;
case 0:
printf("Encerrando.\n");
break;
default:
printf("Opção inválida, tente novamente.\n");
break;
}
} while (opcao != 0);
return 0;
}
Arquivo de Implementação: jogo.c
Este arquivo implementa as funções de lógica do jogo, incluindo inicialização da grade, posicionamento aleatório de minas e lógica de exploração.
#include "campo_minado.h"
void configurar_grade(char grade[TOTAL_LINHAS][TOTAL_COLUNAS], int linhas, int colunas, char caractere)
{
int linha, coluna;
for (linha = 0; linha < linhas; linha++)
{
for (coluna = 0; coluna < colunas; coluna++)
{
grade[linha][coluna] = caractere;
}
}
}
void mostrar_grade(char grade[TOTAL_LINHAS][TOTAL_COLUNAS], int linhas, int colunas)
{
int idx;
printf("---- Campo Minado ----\n");
printf("0");
for (idx = 1; idx <= colunas; idx++)
{
printf(" %d", idx);
}
printf("\n");
for (idx = 1; idx <= linhas; idx++)
{
int j;
printf("%d", idx);
for (j = 1; j <= colunas; j++)
{
printf(" %c", grade[idx][j]);
}
printf("\n");
}
}
void posicionar_minas(char grade[TOTAL_LINHAS][TOTAL_COLUNAS], int linhas, int colunas)
{
int minas_colocadas = 0;
while (minas_colocadas < MINAS_FACIL)
{
int posX = rand() % linhas + 1;
int posY = rand() % colunas + 1;
if (grade[posX][posY] == '0')
{
grade[posX][posY] = '1';
minas_colocadas++;
}
}
}
int calcular_minas_vizinhas(char minas[TOTAL_LINHAS][TOTAL_COLUNAS], int posX, int posY)
{
return (minas[posX - 1][posY - 1] + minas[posX - 1][posY] + minas[posX - 1][posY + 1] +
minas[posX][posY - 1] + minas[posX][posY + 1] +
minas[posX + 1][posY - 1] + minas[posX + 1][posY] + minas[posX + 1][posY + 1] - 8 * '0');
}
void explorar_campo(char minas[TOTAL_LINHAS][TOTAL_COLUNAS], char visivel[TOTAL_LINHAS][TOTAL_COLUNAS], int linhas, int colunas)
{
int posX, posY, celulas_seguras = 0;
while (1)
{
printf("Informe as coordenadas (linha coluna): ");
scanf("%d %d", &posX, &posY);
if (posX >= 1 && posX <= linhas && posY >= 1 && posY <= colunas)
{
if (minas[posX][posY] == '1')
{
printf("Game Over! Você encontrou uma mina.\n");
printf("Mapa das minas:\n");
mostrar_grade(minas, LINHAS, COLUNAS);
break;
}
else
{
int minas_perto = calcular_minas_vizinhas(minas, posX, posY);
visivel[posX][posY] = (minas_perto + '0');
mostrar_grade(visivel, LINHAS, COLUNAS);
celulas_seguras++;
}
}
else
{
printf("Coordenadas inválidas, tente novamente.\n");
}
if (celulas_seguras == linhas * colunas - MINAS_FACIL)
{
printf("Parabéns! Você venceu o jogo.\n");
mostrar_grade(minas, LINHAS, COLUNAS);
break;
}
}
}