aula 101

JOGO DA VELHA com a linguagem Portugol

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

Deixe um comentário

dezesseis + treze =

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.