Você está visualizando atualmente Jogo da velha com a linguagem de programação C – Parte III

Jogo da velha com a linguagem de programação C – Parte III

Bora continuar nosso jogo da velha?

Se você chegou até aqui por acaso e perdeu o início não se preocupe, você pode acessar a parte I aqui e a parte II aqui.

Hoje construiremos quatro funções para identificar a vitória de um dos jogadores. Mas, porque quatro funções?

Bom, como mencionei nas partes anteriores, quanto menor for o problema mais fácil para resolvê-lo. Assim, dividiremos a verificação da vitória em quatro partes, as quatro possibilidades de vitória existentes, como apresentado na figura abaixo:

As 4 possibilidades de vitória no jogo da velha.

1) Vitória em uma das linhas;

Esta verificação é bem simples se você já entendeu como percorrer uma estrutura de dados do tipo matriz. Basicamente o que fazemos aqui é percorrer cada uma das três linhas da matriz, comparando o caractere de cada posição com o caractere seguinte. Um jogador vence quando qualquer uma das linhas possuir três x ou três 0.

Abaixo apresentamos a função que faz esta verificação. Seu retorno será 1 caso encontre uma linha com três caracteres iguais ou 0 caso verifique as três linhas da matriz e nenhuma possua três caracteres iguais.

int ganhouLinhas() {
    int i, j, igual = 1;
    for(i = 0; i < 3; i++) {
        for(j = 0; j < 2; j++) {
            if(eValido(jogo[i][j]) && jogo[i][j] == jogo[i][j+1])
                igual++;
        }
        if(igual == 3)
            return 1;
        igual = 1;
    }
    return 0;
}

2) Vitória em uma das colunas;

Esta verificação é muito semelhante à anterior, com a diferença que agora verificaremos as colunas. Basicamente o que fazemos aqui é percorrer cada uma das três colunas da matriz, comparando o caractere de cada posição com o caractere seguinte. Um jogador vence quando qualquer uma das colunas possuir três x ou três 0.

Abaixo apresentamos a função que faz esta verificação. Seu retorno será 1 caso encontre uma coluna com três caracteres iguais ou 0 caso verifique as três colunas da matriz e nenhuma possua três caracteres iguais.

int ganhouColunas() {
    int i, j, igual = 1;
    for(i = 0; i < 3; i++) {
        for(j = 0; j < 2; j++) {
            if(eValido(jogo[j][i]) && jogo[j][i] == jogo[j+1][i])
                igual++;
        }
        if(igual == 3)
            return 1;
        igual = 1;
    }
    return 0;
}

3) Vitória na diagonal principal;

Agora, diferentemente das duas funções anteriores, precisamos percorrer a matriz na diagonal principal, comparando cada elemento da diagonal principal com o elemento seguinte. Como os índices para acessar a diagonal principal pode ser obtida com uma única variável, fazemos uso de apenas um comando “para”.

Abaixo apresentamos a função para esta verificação, retornando 1 caso os três caracteres sejam iguais ou 0 caso contrário.

int ganhouDiagonalPrincipal() {
    int i, igual = 1;
    for(i = 0; i < 2; i++) {
        if(eValido(jogo[i][i]) && jogo[i][i] == jogo[i+1][i+1])
            igual++;
    }
    if(igual == 3)
        return 1;
    else
        return 0;
}

4) Vitória na diagonal secundária.

Por fim, precisamos também verificar a diagonal secundária. Esta é a mais trabalhosa, exigindo uma certa “brincadeira” com os índices de acesso à matriz. Caso tenha dificuldade em entender como chegamos à conta feita dentro dos pares de colchetes, assista ao vídeo no final do post ou tente desenhar no papel uma matriz com três linhas e três colunas, identificando os índices de cada posição. Você deverá chegar a algo parecido com:

00  01  02
10  11  12
20  21  22

Perceba que a diagonal secundária possui os índices 0 2, 1 1 e 2 0. São este índices que precisamos gerar. Abaixo apresentamos esta função, retornando 1 caso haja um vencedor e 0 caso contrário.

int ganhouDiagonalSecundaria() {
    int i, igual = 1;
    for(i = 0; i < 2; i++) {
        if(eValido(jogo[i][3-i-1]) && jogo[i][3-i-1] == jogo[i+1][3-i-2])
            igual++;
    }
    if(igual == 3)
        return 1;
    else
        return 0;
}

Se ficou alguma dúvida, compartilhe nos comentários que faremos o possível para esclarecer. Um grande abraço, bons estudos e até o próximo.

Deixe um comentário

17 + 16 =

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.