aula 181

Ler coordenadas e abrir uma célula | Jogo Campo Minado parte 5

Nesta aula do nosso Curso de Programação C, a parte 5 do nosso jogo Campo Minado, vamos ver como ler coordenadas e abrir uma célula.

JOGO CAMPO MINADO Parte 1
JOGO CAMPO MINADO Parte 2
JOGO CAMPO MINADO Parte 3
JOGO CAMPO MINADO Parte 4

Uma coordenada é formada por dois números inteiros que indicam a linha e a coluna que o jogador deseja abrir. Para ler uma coordenada, basta fazer a leitura de dois números inteiros. Contudo, ninguém garante que o usuário irá de fato digitar dois números inteiros válidos, entre 0 e tamanho da matriz – 1. Assim, precisamos utilizar a função que já desenvolvemos nas aulas anteriores para validar a coordenada digitada.

Outro detalhe importante é que cada célula pode ser aberta apenas uma vez. Assim, também precisamos verificar se a coordenada jogada ainda está fechada. A leitura de uma coordenada deverá se repetir até que seja digitada uma coordenada válida e ainda fechada.

// procedimento jogar que faz a leitura das coordenadas
void jogar(){
    int linha, coluna;

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

Agora que temos uma coordenada válida e fechada, precisamos abrir essa posição. Abrir uma posição é basicamente atribuir 1 ao campo estaAberta.

Ao abrir uma posição, caso ela possua zero bombas na vizinhança, precisamos também abrir seus vizinhos. Isso pode ser feito com quatro chamadas recursivas, uma para cada vizinho. Como os índices desses vizinhos são obtidos por meio de somas e subtrações, é algumas situações teremos índices inválidos. Para identificar esses índices, precisamos novamente verificar se são válidos e se estão fechados (no início do procedimento), senão teremos erros e/ou loops infinitos nesse passo.

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

Código parcial para o Jogo Campo Minado em C

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

// procedimento jogar que faz a leitura das coordenadas
void jogar(){
    int linha, coluna;

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

Deixe um comentário

1 × 5 =

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.