Jogo da Velha em Pascal no modo console

metaverso-1

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ção ClrScr para limpar a tela do console.
  • Em seguida, é definido o tamanho do tabuleiro com a constante TAMANHO_TABULEIRO e o tipo Tabuleiro, que é uma matriz bidimensional do tipo Char.
  • 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 TrocarSimbolo recebe um parâmetro simbolo do tipo Char e troca o valor entre ‘X’ e ‘O’. Essa função é utilizada para alternar entre os jogadores.
  • A função InicializarTabuleiro recebe uma variável tabuleiro do tipo Tabuleiro e preenche todas as posições com espaços em branco, representando o tabuleiro vazio.
  • A função ExibirTabuleiro recebe uma constante tabuleiro do tipo Tabuleiro e exibe o estado atual do jogo no console. É utilizada a função ClrScr para limpar a tela antes de exibir o tabuleiro.
  • A função JogadaValida recebe uma constante tabuleiro do tipo Tabuleiro e as coordenadas de uma jogada (linha e coluna). 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 VerificarVitoria recebe uma constante tabuleiro do tipo Tabuleiro e 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 TabuleiroCompleto recebe uma constante tabuleiro do tipo Tabuleiro e verifica se todas as posições do tabuleiro estão preenchidas, ou seja, se não há mais jogadas disponíveis.
  • A função EfetuarJogadaIA recebe uma variável tabuleiro do tipo Tabuleiro, e as variáveis linha e coluna do tipo Integer. 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ável tabuleiro do tipo Tabuleiro e 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 vtabuleiro do tipo Tabuleiro e é chamada a função Jogar passando 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:

jogo-velha-pascal-console-giovani

 

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.

 

 

  • Publicado por Giovani Da Cruz
  • 22 views
  • 0 comentarios
  • 24 de junho de 2023

 

Está gostando do conteúdo?
Considere pagar um cafezinho para nossa equipe!

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Posts Relacionados a Categoria Algoritmos com Matrizes e Estruturas

Continue aprendendo

Aumente o seu conhecimento
Crie um algoritmo e um programa que utilize pilha para armazenar caracteres. O programa deve apresentar um menu com as seguintes opções:
13 de abril de 2024
Crie um algoritmo e um programa que dado um texto, conte o número de ocorrências de cada palavra única no texto. Ignore maiúsculas e minúsculas, bem como pontuações. Retorne um HashMap onde as chaves são as palavras únicas e os valores são o número de vezes que cada palavra aparece no texto.
16 de março de 2024
Escreva um algoritmo e programa que solicite ao usuário que insira um texto contendo apenas letras minúsculas. O programa deve determinar e retornar a primeira letra no texto que não se repete. Se não houver letras únicas, o programa deve retornar o caractere “_”.
14 de março de 2024
Algoritmo de Cadastro de Produtos utilizando matrizes
1 de maio de 2023