Jogo da Velha em Pascal no modo console

Fala galera da programação, tudo beleza? Hoje vamos fazer de um pequeno jogo, muito conhecido que é o jogo da velha.
A ideia aqui é fazer este jogo onde o usuário possa jogar contra o computador de forma automatica, em modo console.
Este é um ótimo exercício porque vamos utilizar todas a habilidades necessárias da programação básica.
Conteúdos
- Leitura e Escrita de Dados;
- Variáveis e Constantes;
- Desvio Condicional (Comando “Se / IF” simples e composto com o uso de “e / and “);
- Procedimentos e Funções dentro do programa;
- Parâmetros em funções;
- Laços de Repetição (Enquanto / While, Repita / Repeat e Para / For)
- Matrizes e Vetores (array)
Vamos ao código em Pascal
(*
Criado pelo Prefessor Giovani Da Cruz
https://giovanidacruz.com.br
Jogo da Velha em modo console
COMPILADO EM LAZARUS
Compatível com https://www.onlinegdb.com/online_pascal_compiler
*)
program jogoVelhaConsole;
uses
Crt;
const
TAMANHO_TABULEIRO = 3;
type
Tabuleiro = array[1..TAMANHO_TABULEIRO, 1..TAMANHO_TABULEIRO] of Char;
procedure Finalizar();
begin
WriteLn('Pressione qualquer tecla para finalizar!');
ReadLn;
end;
procedure TrocarSimbolo(var simbolo: Char);
begin
if simbolo = 'X' then
simbolo := 'O'
else
simbolo := 'X';
end;
procedure InicializarTabuleiro(var tabuleiro: Tabuleiro);
var
i, j: Integer;
begin
for i := 1 to TAMANHO_TABULEIRO do
begin
for j := 1 to TAMANHO_TABULEIRO do
begin
tabuleiro[i, j] := ' ';
end;
end;
end;
procedure ExibirTabuleiro(const tabuleiro: Tabuleiro);
var
i, j: Integer;
begin
ClrScr;
WriteLn('*********** JOGO DA VELHA ***************');
WriteLn('********** GIOVANI DA CRUZ **************');
WriteLn();
WriteLn('-------------');
for i := 1 to TAMANHO_TABULEIRO do
begin
Write('| ');
for j := 1 to TAMANHO_TABULEIRO do
begin
Write(tabuleiro[i, j], ' | ');
end;
WriteLn();
WriteLn('-------------');
end;
WriteLn();
end;
function JogadaValida(const tabuleiro: Tabuleiro; linha, coluna: Integer): Boolean;
begin
if (linha >= 1) and
(linha <= TAMANHO_TABULEIRO) and
(coluna >= 1) and
(coluna <= TAMANHO_TABULEIRO) and
(tabuleiro[linha, coluna] = ' ') then
JogadaValida := True //Result Adequação para compilar no www.onlinegdb.com
else
JogadaValida := False; //Result Adequação para compilar no www.onlinegdb.com
end;
function VerificarVitoria(const tabuleiro: Tabuleiro; simbolo: Char): Boolean;
var
i: Integer;
begin
// Verificar linhas
for i := 1 to TAMANHO_TABULEIRO do
begin
if (tabuleiro[i, 1] = simbolo) and
(tabuleiro[i, 2] = simbolo) and
(tabuleiro[i, 3] = simbolo) then
Exit(True);
end;
// Verificar colunas
for i := 1 to TAMANHO_TABULEIRO do
begin
if (tabuleiro[1, i] = simbolo) and
(tabuleiro[2, i] = simbolo) and
(tabuleiro[3, i] = simbolo) then
Exit(True);
end;
// Verificar diagonais
if (tabuleiro[1, 1] = simbolo) and
(tabuleiro[2, 2] = simbolo) and
(tabuleiro[3, 3] = simbolo) then
Exit(True);
if (tabuleiro[1, 3] = simbolo) and
(tabuleiro[2, 2] = simbolo) and
(tabuleiro[3, 1] = simbolo) then
Exit(True);
VerificarVitoria := False; //Result Adequação para compilar no www.onlinegdb.com
end;
function TabuleiroCompleto(const tabuleiro: Tabuleiro): Boolean;
var
i, j: Integer;
begin
for i := 1 to TAMANHO_TABULEIRO do
begin
for j := 1 to TAMANHO_TABULEIRO do
begin
if tabuleiro[i, j] = ' ' then
Exit(False);
end;
end;
TabuleiroCompleto := True; //Result Adequação para compilar no www.onlinegdb.com
end;
procedure EfetuarJogadaIA(var tabuleiro: Tabuleiro; linha, coluna: Integer);
begin
repeat
linha := Random(TAMANHO_TABULEIRO) + 1;
coluna := Random(TAMANHO_TABULEIRO) + 1;
until JogadaValida(tabuleiro, linha, coluna);
{ Descomente as linhas caso queira deixar sem limpar a tela }
//writeln('Jogada do computador (Jogador O):');
//writeln('Linha: ', linha);
//writeln('Coluna: ', coluna);
tabuleiro[linha, coluna] := 'O';
end;
procedure Jogar(var tabuleiro: Tabuleiro);
var
linha, coluna: Integer;
jogadorAtual: Char;
begin
Randomize;
InicializarTabuleiro(tabuleiro);
jogadorAtual := 'X';
while True do
begin
ExibirTabuleiro(tabuleiro);
if jogadorAtual = 'X' then
begin
WriteLn('*** TERMINAL DE JOGADA ***');
Write('Informe a linha: ');
ReadLn(linha);
Write('Informe a coluna: ');
ReadLn(coluna);
if JogadaValida(tabuleiro, linha, coluna) then
begin
tabuleiro[linha, coluna] := jogadorAtual;
TrocarSimbolo(jogadorAtual);
end
else
begin
WriteLn(UTF8ToString( '*** Jogada inválida! *** '));
WriteLn('ENTER PARA JOGAR NOVAMENTE');
ReadLn;
end;
end
else
begin
WriteLn('Vez do computador (Jogador O):');
EfetuarJogadaIA(tabuleiro, linha, coluna);
TrocarSimbolo(jogadorAtual);
end;
if VerificarVitoria(tabuleiro, 'X') then
begin
ExibirTabuleiro(tabuleiro);
WriteLn(Utf8ToAnsi('Você venceu!'));
Finalizar;
Exit;
end
else if VerificarVitoria(tabuleiro, 'O') then
begin
ExibirTabuleiro(tabuleiro);
WriteLn('O computador venceu!');
Finalizar;
Exit;
end
else if TabuleiroCompleto(tabuleiro) then
begin
ExibirTabuleiro(tabuleiro);
WriteLn('Partida Empatada!');
Finalizar;
Exit;
end;
end;
end;
var
vtabuleiro: Tabuleiro;
begin
Jogar(vtabuleiro);
end.
Explicação
- O programa começa com a declaração das bibliotecas
uses Crt, que permite o uso da funçãoClrScrpara limpar a tela do console. - Em seguida, é definido o tamanho do tabuleiro com a constante
TAMANHO_TABULEIROe o tipoTabuleiro, que é uma matriz bidimensional do tipoChar. - A função
Finalizaré responsável por exibir uma mensagem e aguardar que o usuário pressione qualquer tecla antes de finalizar o programa. - A função
TrocarSimbolorecebe um parâmetrosimbolodo tipoChare troca o valor entre ‘X’ e ‘O’. Essa função é utilizada para alternar entre os jogadores. - A função
InicializarTabuleirorecebe uma variáveltabuleirodo tipoTabuleiroe preenche todas as posições com espaços em branco, representando o tabuleiro vazio. - A função
ExibirTabuleirorecebe uma constantetabuleirodo tipoTabuleiroe exibe o estado atual do jogo no console. É utilizada a funçãoClrScrpara limpar a tela antes de exibir o tabuleiro. - A função
JogadaValidarecebe uma constantetabuleirodo tipoTabuleiroe as coordenadas de uma jogada (linhaecoluna). Ela verifica se a jogada é válida, ou seja, se as coordenadas estão dentro dos limites do tabuleiro e se a posição correspondente está vazia. - A função
VerificarVitoriarecebe uma constantetabuleirodo tipoTabuleiroe um símbolo (simbolo) para verificar se esse símbolo venceu o jogo. Ela verifica todas as possibilidades de vitória: linhas, colunas e diagonais. - A função
TabuleiroCompletorecebe uma constantetabuleirodo tipoTabuleiroe verifica se todas as posições do tabuleiro estão preenchidas, ou seja, se não há mais jogadas disponíveis. - A função
EfetuarJogadaIArecebe uma variáveltabuleirodo tipoTabuleiro, e as variáveislinhaecolunado tipoInteger. Essa função é responsável por efetuar a jogada do computador (jogador ‘O’). Ela gera números aleatórios para as coordenadas da jogada até encontrar uma jogada válida. - A função
Jogaré a principal função do jogo. Ela recebe uma variáveltabuleirodo tipoTabuleiroe implementa a lógica do jogo. O jogador atual é alternado entre ‘X’ e ‘O’ até que haja uma vitória, empate ou o jogador decida sair do jogo. - Por fim, no programa principal, é criada uma variável
vtabuleirodo tipoTabuleiroe é chamada a funçãoJogarpassando esse tabuleiro como parâmetro.
O código implementa as funcionalidades básicas do jogo da velha, incluindo jogadas do usuário e do computador, exibição do tabuleiro, verificação de vitória e empate.
Veja uma imagem do jogo rodando:

Acesso o repositório no GutHub: https://github.com/giovani7cruz/jogovelhaPascalConsole/
Beleza Pessoal?
Dúvidas ou sugestões? Deixe o seu comentário!
Um abraço e até o próximo post. Valeu.