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 três 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.
Views: 0