aula 183

Testando nosso JOGO CAMPO MINADO

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

Deixe um comentário

seis − 3 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.