Jogo da Velha – Delphi

Sharing is caring!

Abaixo um exemplo de Delphi para se criar um Jogo da Velha.

Este código abaixo não tem exatamente algum tipo de inteligência nas jogadas considerando as possibilidades possíveis.

Neste caso é um jogo simples será visto que é usada a Função Random que irá gerar um número aleatório de 1 a 9 (tem 9 posições possíveis na janela). Gerando um número de 1 a 9 e esta  posição em branco , ele marca como sendo o jogo da máquina (procedure JogadaMaquina) e já executa a avaliação de avaliação de ganhador, onde avalia se formou tres figuras iguais na horizontal, vertical ou diagonal (procedure AvaliaGanhador).

Como um desafio para quem está aprendendo lógica, proponho criar “inteligência” ao jogo, como por exemplo avaliar antes da maquina fazer a jogada verificar se já existe uma posição que se o maquina jogar ele fecha o jogo.

O desafio aqui é passar a sua forma de analisar se existe uma jogada que pode ganhar o jogo, não necessariamente fazendo uma analise que irá tentar prever  a próxima jogada (Inteligência Artificial), mas é muito util  para treinar passar algo que você faz quase por instinto em uma lógica de programação.

A janela a ser criada deve ser algo deste tipo, com os mesmos tipos e nomes dos componentes (ou caso mudem, mudar no código também).

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, StdCtrls;

type
  TForm2 = class(TForm)
    Reiniciar: TButton;
    botao11: TSpeedButton;
    botao12: TSpeedButton;
    botao13: TSpeedButton;
    botao21: TSpeedButton;
    botao22: TSpeedButton;
    botao23: TSpeedButton;
    botao31: TSpeedButton;
    botao32: TSpeedButton;
    botao33: TSpeedButton;
    procedure ReiniciarClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure botaoClick(Sender: TObject);
    procedure JogadaMaquina;
    procedure AvaliaGanhador(xValorConsiderado: String);
  private
    { Private declarations }
  public
    { Public declarations }
    xJogada: Integer;
    Jogadas: Array of String;
    FimJogo: boolean;

  end;

var
  Form2: TForm2;

implementation

{$R *.DFM}

procedure TForm2.ReiniciarClick(Sender: TObject);
var i: integer;
begin
  for i := 0 to ComponentCount -1 do
   begin
     if Components[I].ClassType = TSpeedButton then
       begin
         TSpeedButton(Components[i]).Caption := '';
       end;
   end;
   xJogada := 0;
   SetLength(Jogadas,0);
   SetLength(Jogadas,9);
   FimJogo:= False;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  ReiniciarClick(Sender);
end;

procedure TForm2.botaoClick(Sender: TObject);
begin
  if FimJogo = false then
   begin
      if TSpeedButton(Sender).Caption <> '' then
        begin
          ShowMessage('Posição já escolhida');
          abort;
        end;

      TSpeedButton(Sender).Caption := 'X';
      Jogadas[TSpeedButton(Sender).Tag] := 'X';
      xJogada := xJogada +1;
      JogadaMaquina;
      AvaliaGanhador('X');
      AvaliaGanhador('0');
   end;
end;

procedure TForm2.JogadaMaquina;
var AchouVago: Boolean;
xPosicaoJogar, i : Integer;
begin
  if xJogada <9 then
    begin
      AchouVago := False;
      while AchouVago  = false do
        begin
          xPosicaoJogar := Random(9);
          for i := 0 to ComponentCount -1 do
           begin
             if Components[I].ClassType = TSpeedButton then
               begin
                 if (TSpeedButton(Components[i]).Tag = xPosicaoJogar + 1) and
                    (TSpeedButton(Components[i]).Caption = '') then
                   begin
                       TSpeedButton(Components[i]).Caption := '0';
                       Jogadas[TSpeedButton(Components[i]).Tag] := '0';
                       AchouVago:= true;
                       xJogada := xJogada +1;
                   end;
               end;
           end;
        end;
    end;
end;

procedure TForm2.AvaliaGanhador(xValorConsiderado: String);
var Mensagem: String;
begin
  if FimJogo = false then
    begin
      if xValorConsiderado = 'X' then
        Mensagem := 'Você Ganhou!'
      else
        Mensagem := 'Você Perdeu!';
         // horizontal
      if ((Jogadas[0] = Jogadas[1]) and (Jogadas[1] = Jogadas[2]) and (Jogadas[2] = xValorConsiderado)) or
         ((Jogadas[3] = Jogadas[4]) and (Jogadas[4] = Jogadas[5]) and (Jogadas[5] = xValorConsiderado)) or
         ((Jogadas[6] = Jogadas[7]) and (Jogadas[7] = Jogadas[8]) and (Jogadas[8] = xValorConsiderado)) or
         // vertical
         ((Jogadas[0] = Jogadas[3]) and (Jogadas[3] = Jogadas[6]) and (Jogadas[6] = xValorConsiderado)) or
         ((Jogadas[1] = Jogadas[4]) and (Jogadas[4] = Jogadas[7]) and (Jogadas[7] = xValorConsiderado)) or
         ((Jogadas[2] = Jogadas[5]) and (Jogadas[5] = Jogadas[8]) and (Jogadas[8] = xValorConsiderado)) or
         // Diagonal
         ((Jogadas[0] = Jogadas[4]) and (Jogadas[4] = Jogadas[8]) and (Jogadas[8] = xValorConsiderado)) or
         ((Jogadas[2] = Jogadas[4]) and (Jogadas[4] = Jogadas[6]) and (Jogadas[6] = xValorConsiderado)) then
        begin
          ShowMessage(Mensagem);
          FimJogo:= True;
        end
      else
        begin
          if xJogada = 9 then
            begin
              ShowMessage('Empate');
              FimJogo:= True;
            end;
        end;
    end;
end;

end.

Wagner Salvi

Trabalho há mais de 20 anos com Desenvolvimento de Sistemas, incluindo ERP’s (Enterprise Resource Planning). Atualmente atuo como Gerente de Produtos coordenando a equipe de desenvolvimento em implementações de novas funcionalidades e tecnologias. Neste momento estudando sobre novas tecnologias iOT usando RaspBerry, desenvolvimento para plataformas móveis, como Android.

Deixe uma resposta

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.