Nesta aula vamos praticar tudo que aprendemos até aqui desenvolvendo o jogo da velha com a linguagem de programação Portugol.
O interessante neste exercício é que ele deixa evidente a necessidade de planejar ações para resolver o jogo da velha. Essas ações podem ser divididas em problemas menores, como:
- qual estrutura de dados usar?
- como inicializar a estrutura de dados antes do jogo iniciar?
- imprimir o jogo na tela;
- ler as coordenadas de um jogador;
- salvar as coordenadas jogadas;
- verificar se alguém ganhou por linha;
- verificar se alguém ganhou por coluna;
- verificar se alguém ganhou na diagonal principal;
- verificar se alguém ganhou na diagonal secundária
Perceba que dentro do problema maior, resolver o jogo da velha, temos inúmeros problemas menores que, ao serem resolvidos, formam a solução para o problema principal.
Como utilizaremos dois caracteres diferentes para o jogo, o 0 e o X, podemos inicializar nossa matriz com espaços, isso indica que as posições estão vazias e podem ser escolhidas pelos jogadores.
para(l = 0; l < 3; l++){ para(c = 0; c < 3; c++) jogo[l][c] = ' ' }
Na sequência, precisamos imprimir o tabuleiro na tela. Esta parte é realmente na tentativa e erro, fazendo, testando e ajustando, até obter um resultado adequado.
// impressão do tabuleiro escreva("\n\n 0 1 2\n\n") // imprime as colunas para(l = 0; l < 3; l++){ para(c = 0; c < 3; c++){ escreva(" ", jogo[l][c]) // imprime o caracter de cada posição se(c < 2) escreva(" | ") // imprime a barra de divisão do tabuleiro se(c == 2) escreva(" ", l) // imprime o índice das linhas } se(l < 2) escreva("\n------------") // imprime a linha pontilhada que separa as linhas escreva("\n") }
Agora estamos prontos para realizar a leitura das coordenadas. O jogador precisa digitar o índice da linha e da coluna onde deseja jogar. Neste momento precisamos fazer algumas validações, como garantir que os índices são válidos e que a posição escolhida ainda não foi jogada.
// ler coordenadas faca{ faca{ escreva("\nJogador ",jogador, " digite linha e coluna da posição desejada: ") leia(linha, coluna) }enquanto(linha < 0 ou linha > 2 ou coluna < 0 ou coluna > 2) }enquanto(jogo[linha][coluna] != ' ')
Após a leitura de uma coordenada válida, precisamos então salvar essa jogada em nossa matriz. O caracter a ser salvo na matriz vai depender de qual jogador está jogando naquele momento.
// salvar cordenadas se(jogador == 1){ jogo[linha][coluna] = '0' jogador++ } senao{ jogo[linha][coluna] = 'X' jogador = 1 } jogadas++
Agora que salvamos uma jogada, precisamos verificar se houve vitória. Lembre-se que a vitória pode ocorrer de quatro formas diferentes: por linha, por coluna, por diagonal principal ou ainda por diagonal secundária.
// verificar ganhador por linhas para(l = 0; l < 3; l++){ se(jogo[l][0] == '0' e jogo[l][1] == '0' e jogo[l][2] == '0') ganhou = 1 } para(l = 0; l < 3; l++){ se(jogo[l][0] == 'X' e jogo[l][1] == 'X' e jogo[l][2] == 'X') ganhou = 2 } // verificar ganhador por colunas para(c = 0; c < 3; c++){ se(jogo[0][c] == '0' e jogo[1][c] == '0' e jogo[2][c] == '0') ganhou = 1 } para(c = 0; c < 3; c++){ se(jogo[0][c] == 'X' e jogo[1][c] == 'X' e jogo[2][c] == 'X') ganhou = 2 } // verificar ganhador na diagonal principal se(jogo[0][0] == '0' e jogo[1][1] == '0' e jogo[2][2] == '0') ganhou = 1 se(jogo[0][0] == 'X' e jogo[1][1] == 'X' e jogo[2][2] == 'X') ganhou = 2 // verificar ganhador na diagonal secundária se(jogo[0][2] == '0' e jogo[1][1] == '0' e jogo[2][0] == '0') ganhou = 1 se(jogo[0][2] == 'X' e jogo[1][1] == 'X' e jogo[2][0] == 'X') ganhou = 2
Esta não é a melhor forma de resolvermos o jogo da velha, mas é o que conseguimos fazer com tudo o que vimos no curso até o momento. Mais a frente em nosso Curso de Algoritmos e Lógica de Programação veremos como dividir essa código em funções e procedimento.
Código completo em Portugol para o Jogo da Velha
programa{ /* Aula 101: Faça o jogo da velha em Portugol. * * Escrito por Wagner Gaspar * Março de 2021 * * | | * -------- * | | * -------- * | | */ funcao inicio(){ caracter jogo[3][3] inteiro l, c, linha, coluna, jogador, ganhou, jogadas, opcao faca{ jogador = 1 ganhou = 0 jogadas = 0 para(l = 0; l < 3; l++){ para(c = 0; c < 3; c++) jogo[l][c] = ' ' } faca{ // impressão do tabuleiro escreva("\n\n 0 1 2\n\n") para(l = 0; l < 3; l++){ para(c = 0; c < 3; c++){ escreva(" ", jogo[l][c]) se(c < 2) escreva(" | ") se(c == 2) escreva(" ", l) } se(l < 2) escreva("\n------------") escreva("\n") } // ler coordenadas faca{ faca{ escreva("\nJogador ",jogador, " digite linha e coluna da posição desejada: ") leia(linha, coluna) }enquanto(linha < 0 ou linha > 2 ou coluna < 0 ou coluna > 2) }enquanto(jogo[linha][coluna] != ' ') // salvar cordenadas se(jogador == 1){ jogo[linha][coluna] = '0' jogador++ } senao{ jogo[linha][coluna] = 'X' jogador = 1 } jogadas++ // verificar ganhador por linhas para(l = 0; l < 3; l++){ se(jogo[l][0] == '0' e jogo[l][1] == '0' e jogo[l][2] == '0') ganhou = 1 } para(l = 0; l < 3; l++){ se(jogo[l][0] == 'X' e jogo[l][1] == 'X' e jogo[l][2] == 'X') ganhou = 2 } // verificar ganhador por colunas para(c = 0; c < 3; c++){ se(jogo[0][c] == '0' e jogo[1][c] == '0' e jogo[2][c] == '0') ganhou = 1 } para(c = 0; c < 3; c++){ se(jogo[0][c] == 'X' e jogo[1][c] == 'X' e jogo[2][c] == 'X') ganhou = 2 } // verificar ganhador na diagonal principal se(jogo[0][0] == '0' e jogo[1][1] == '0' e jogo[2][2] == '0') ganhou = 1 se(jogo[0][0] == 'X' e jogo[1][1] == 'X' e jogo[2][2] == 'X') ganhou = 2 // verificar ganhador na diagonal secundária se(jogo[0][2] == '0' e jogo[1][1] == '0' e jogo[2][0] == '0') ganhou = 1 se(jogo[0][2] == 'X' e jogo[1][1] == 'X' e jogo[2][0] == 'X') ganhou = 2 }enquanto(ganhou == 0 e jogadas < 9) // impressão do tabuleiro escreva("\n\n 0 1 2\n\n") para(l = 0; l < 3; l++){ para(c = 0; c < 3; c++){ escreva(" ", jogo[l][c]) se(c < 2) escreva(" | ") se(c == 2) escreva(" ", l) } se(l < 2) escreva("\n------------") escreva("\n") } se(ganhou == 1) escreva("\n\tParabéns Jogador 1. Você ganhou!\n\n") se(ganhou == 2) escreva("\n\tParabéns Jogador 2. Você ganhou!\n\n") escreva("Digite 1 para jogar novamente: ") leia(opcao) }enquanto(opcao == 1) } }