Implementação do Jogo do Campo Minado em C

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;
        }
    }
}

Tags: C campo minado algoritmo jogos em C programação modular

Publicado em 5-30 04:53 por Thomas