aula 182

Vitória e derrota no jogo campo minado | Campo Minado Parte 6

Nesta aula do nosso Curso de Programação C, a sexta parte do nosso jogo Campo Minado, vamos aprender como identificar vitória e derrota em 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

Para identificar vitória é necessário que esteja claro o que significa a vitória no Jogo Campo Minado. O jogador ganha no Campo Minado quando ele consegue abrir todas as posições que não são bombas. Assim, para saber se o jogador venceu, basta contarmos a quantidade de casas fechadas que não são bombas. Se esse valor for exatamente zero, então o jogador ganhou. É exatamente isso que faz a função a seguir.

/*
    função para verificar vitória (conta a quantidade de casas fechadas que não são bombas)
    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;
}

Vamos agora atualizar nosso procedimento jogar. A leitura de coordenadas e a abertura de cada coordenada precisa acontecer até que o jogador vença ou até que uma bomba seja aberta. Para isso, vamos colocar mais uma estrutura de repetição do tipo faça enquanto. Outra alteração é a retirada do procedimento imprimir do main, que agora ficará dentro desta nova repetição, para imprimir novamente o tabuleiro a cada nova coordenada digitada

Quando a repetição terminar, significa que ou o jogador ganhou ou ele abriu uma bomba. Usamos um if para descobrir o que aconteceu e imprimir uma mensagem na tela.

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

Por fim, vamos alterar a função main, inserindo uma repetição para permitir ao jogador iniciar um novo jogo caso ele queira.

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

5 × 2 =

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.