Jogo da velha "inteligente"
Publicado por João Carlos abreu Junior 01/09/2006
[ Hits: 16.800 ]
Este script é um jogo da velha inteligente. Tente ganhar do computador e depois veja o algoritmo. Ele não joga de apenas uma maneira, de acordo com sua jogada o computador "pensa" e tentar vencer. Muito bom para aprender a usar modularização e um pouco de inteligência em seus algoritmos. Para exibir na página retirei os comentários para facilitar a leitura, mas quando você efetuar o download do arquivo poderá visualizar meus comentários.
Program Matriz;
Uses crt;
Type matriz_jogo=Array[1..3,1..3] Of Integer;
Type nome_jogadores=Array[1..2,1..1] Of String[20];
Procedure zera_variaveis(var mat:matriz_jogo;nomes:nome_jogadores;a:integer;b:integer;c:integer;
var d:integer;var e:boolean);
var i,j,posicao:integer;
Begin
Clrscr;
d:=0;
e:=false;
posicao:=0;
Writeln('Jogador1(X):',nomes[1][1]);
Writeln('Vit¢rias|Empates|Derrotas');
Write(' ',c,' ',a,' ',b);
Gotoxy(50,1);
Writeln('Jogador2(O):',nomes[2][1]);
Gotoxy(50,2);
Write('Vit¢rias|Empates|Derrotas');
Gotoxy(50,3);
Write(' ',b,' ',a,' ',c);
Gotoxy(1,6);
Writeln('___|___|___');
Writeln('___|___|___');
Writeln(' | | ');
For i:=1 To 3 Do
Begin
For j:=1 To 3 Do
Begin
posicao:=posicao+1;
Gotoxy((j*4)-2,i+5);
mat[i][j]:=0;
Write(posicao);
End;
End;
End;
Procedure zera_placar(var a:Integer; Var b:integer;Var c:integer);
Begin
a:=0;
b:=0;
c:=0;
End;
Function sorteia_jogador:integer;
Begin
sorteia_jogador:=random(2)+1;
End;
Procedure imprime_matriz(var mat:matriz_jogo;nomes:nome_jogadores;a,b,c:integer);
var i,j,posicao:integer;
Begin
Clrscr;
Writeln('Jogador1(X):',nomes[1][1]);
Writeln('Vit¢rias|Empates|Derrotas');
Write(' ',c,' ',a,' ',b);
Gotoxy(50,1);
Writeln('Jogador2(O):',nomes[2][1]);
Gotoxy(50,2);
Writeln('Vit¢rias|Empates|Derrotas');
Gotoxy(50,3);
Write(' ',b,' ',a,' ',c);
Gotoxy(1,6);
Writeln('___|___|___');
Writeln('___|___|___');
Writeln(' | | ');
posicao:=0;
For i:=1 To 3 Do
Begin
For j:=1 To 3 Do
Begin
posicao:=posicao+1;
Gotoxy((j*4)-2,i+5);
if mat[i][j]=1 Then
write('X')
else
If mat[i][j]=2 then
Write('O')
else
Write(posicao);
End;
End;
End;
Procedure coordenadas_jogada(posicao:char;var Linha:integer;var coluna:integer);
Begin
if posicao='1' Then
Begin
linha:=1;
coluna:=1;
End
Else
If posicao='2' Then
Begin
linha:=1;
coluna:=2;
End
Else
If posicao='3' Then
Begin
linha:=1;
coluna:=3;
End
Else
If posicao='4' Then
Begin
linha:=2;
coluna:=1;
End
Else
If posicao='5' Then
Begin
linha:=2;
coluna:=2;
End
Else
If posicao='6' Then
Begin
linha:=2;
coluna:=3;
End
Else
If posicao='7' Then
Begin
linha:=3;
coluna:=1;
End
Else
If posicao='8' Then
Begin
linha:=3;
coluna:=2;
End
Else
Begin
linha:=3;
coluna:=3;
End;
End;
Procedure posicao_em_branco(caracter,linha,coluna:integer;var mj:matriz_jogo;var a:boolean);
Begin
if mj[linha][coluna]=0 Then
Begin
mj[linha][coluna]:=caracter;
a:=true;
End
Else
a:=false;
End;
Procedure verifica_vencedor(jogador:integer;var vencedor:boolean;mj:matriz_jogo);
var pontos_coluna,pontos_linha,i,j:integer;
posicao_vazial,posicao_vaziac:boolean;
Begin
vencedor:=false;
For i:=1 To 3 Do
Begin
pontos_coluna:=0;
pontos_linha:=0;
posicao_vazial:=false;
posicao_vaziac:=false;
For j:=1 To 3 Do
Begin
if mj[i][j]=jogador Then
pontos_coluna:=pontos_coluna+mj[i][j]
else
if (mj[i][j]=0) Then
posicao_vaziac:=true;
If mj[j][i]=jogador Then
pontos_linha:=pontos_linha+mj[j][i]
Else
if (mj[j][i]=0) Then
posicao_vazial:=true;
End;
if ((pontos_coluna mod 3=0) and (posicao_vaziac=false)) or ((pontos_linha mod 3=0) and (posicao_vazial=false)) and
(vencedor=false) Then
Begin
vencedor:=true;
End;
if vencedor=false Then
Begin
if ((mj[1][1]+mj[2][2]+mj[3][3]) mod 3=0) and (mj[1][1]=jogador) and (mj[2][2]=jogador) and (mj[3][3]=jogador)
Then
vencedor:=true
else
if ((mj[3][1]+mj[2][2]+mj[1][3]) mod 3=0) and (mj[3][1]=jogador) and (mj[2][2]=jogador) and (mj[1][3]=jogador)
Then
vencedor:=true;
End;
End;
End;
Procedure devolve_jogada_pc(mj:matriz_jogo;jogada:integer;var soma:integer;var espacos_vazios:integer;var linha:integer;
var coluna:integer);
var i,j:integer;
dif_linha,dif_coluna,lp,cp:Integer;
Begin
soma:=0;
espacos_vazios:=0;
linha:=0;
coluna:=0;
If jogada<=3 Then
Begin
dif_coluna:=0;
For j:=1 To 3 Do
Begin
If mj[jogada][j]=0 Then
Begin
espacos_vazios:=espacos_vazios+1;
if soma>0 Then
Begin
dif_coluna:=j-cp;
if dif_coluna<0 Then
dif_coluna:=-dif_coluna;
if (dif_coluna>1) or (linha=0) Then
Begin
linha:=jogada;
coluna:=j;
End;
End
Else
Begin
If linha=0 Then
Begin
linha:=jogada;
coluna:=j;
End;
End;
End
Else
Begin
soma:=soma+mj[jogada][j];
cp:=j;
End;
End;
End
Else
If jogada<=6 Then
Begin
dif_linha:=0;
For i:=1 To 3 Do
Begin
If mj[i][jogada-3]=0 Then
Begin
espacos_vazios:=espacos_vazios+1;
if soma>0 Then
Begin
dif_linha:=i-cp;
if dif_linha<0 Then
dif_linha:=-dif_linha;
if (dif_linha>1) or (linha=0) Then
Begin
linha:=i;
coluna:=jogada-3;
End;
End Else
If linha=0 Then
Begin
linha:=i;
coluna:=jogada-3;
End;
End
Else
Begin
soma:=soma+mj[i][jogada-3];
lp:=i;
End;
End;
End
Else
If jogada=7 Then
Begin
For i:=1 To 3 Do
If mj[i][i]=0 Then
Begin
espacos_vazios:=espacos_vazios+1;
if (mj[2][1]=1) and (mj[1][2]=1) and (mj[1][1]=0) Then
Begin
linha:=1;
coluna:=1;
End
Else
If (mj[2][3]=1) and (mj[3][2]=1) and (mj[3][3]=0) Then
Begin
linha:=3;
coluna:=3;
End
Else
Begin
linha:=i;
coluna:=i;
End;
End
Else
soma:=soma+mj[i][i];
End
Else
Begin
For i:=1 to 3 Do
If mj[i][4-i]=0 Then
Begin
espacos_vazios:=espacos_vazios+1;
linha:=i;
coluna:=4-i;
End
Else
soma:=soma+mj[i][4-i];
End;
End;
Procedure jogada_pc(jogador:integer;var mj:matriz_jogo);
Var i,j:integer;
soma,espacos_vazios,linha_vazia,coluna_vazia:integer;
somamax,espacosmin:integer;
linha,coluna:integer;
jogadas_possiveis:Array[1..23,1..3] of Integer;
jogadas:Integer;
Begin
linha:=0;
coluna:=0;
somamax:=0;
espacosmin:=3;
For i:=1 To 8 Do
Begin
devolve_jogada_pc(mj,i,soma,espacos_vazios,linha_vazia,coluna_vazia);
If (soma>=somamax) and (espacos_vazios<=espacosmin) and (espacos_vazios>=1) and (soma mod 2=0) Then
Begin
if (soma<>somamax) or (espacos_vazios<>espacosmin) Then
Begin
linha:=linha_vazia;
coluna:=coluna_vazia;
somamax:=soma;
espacosmin:=espacos_vazios;
End;
End;
End;
if (linha=0) and (coluna=0) Then
Begin
For i:=1 To 3 Do
For j:=1 To 3 Do
if mj[i][j]=0 Then
Begin
linha:=i;
coluna:=j;
End;
End;
mj[linha][coluna]:=jogador;
End;
Var menu,posicao:Char;
opcao:Integer;
jogadas,empates,derrotas,vitorias:integer;
i,j,linha,coluna:Integer;
jogador:Integer;
mj:matriz_jogo;
nomes:nome_jogadores;
jogar_mais,posicao_branco:boolean;
Begin
Randomize;
Repeat
opcao:=1;
Clrscr;
Repeat
Gotoxy(30,20);
If opcao=1 then
Begin
Textcolor(46);
Textbackground(4);
End
Else
Begin
Textcolor(14);
Textbackground(1);
End;
For i:=1 To (15-(Length('Jogador1 X Jogador2') Div 2)) Do
Write(' ');
Write('Jogador1 X Jogador2');
For i:=(16+(Length('Jogador1 X Jogador2') Div 2)) To 30 Do
Write(' ');
Gotoxy(30,22);
If opcao=2 Then
Begin
Textcolor(46);
Textbackground(4);
End
Else
Begin
Textcolor(14);
Textbackground(1);
End;
For i:=1 To (15-(Length('Jogador X Computador') Div 2)) Do
Write(' ');
Write('Jogador X Computador');
For i:=(15+(Length('Jogador X Computador') Div 2)) To 30 Do
Write(' ');
Gotoxy(30,24);
If opcao=3 Then
Begin
Textcolor(46);
Textbackground(4);
End
Else
Begin
Textcolor(14);
Textbackground(1);
End;
For i:=1 To (15-(length('Computador X Computador') Div 2)) Do
Write(' ');
Write('Computador X Computador');
For i:=(16+(length('Computador X Computador') Div 2)) To 30 Do
Write(' ');
Gotoxy(30,26);
If opcao=4 Then
Begin
TEXTCOLOR(46);
TEXTBACKGROUND(4);
End
Else
Begin
Textcolor(14);
Textbackground(1);
End;
For i:=1 To (15-(Length('sair') Div 2)) Do
Write(' ');
Write('Sair');
For i:=(15+(Length('sair') Div 2)) To 30 Do
Write(' ');
menu:=Readkey;
If (menu = 'H') Then
opcao:=opcao-1
Else
If (menu = 'P') Then
opcao:=opcao+1;
If opcao>4 Then
opcao:=1
Else
If opcao<1 Then
opcao:=4;
Until (menu=chr(13)) Or (menu=chr(27));
Textcolor(white);
Textbackground(black);
If Opcao=1 Then
Begin
Clrscr;
zera_placar(empates,derrotas,vitorias);
For i:=1 To 2 Do
Begin
Write('Jogador',i,':');
readln(nomes[i][1]);
End;
repeat
Clrscr;
jogador:=sorteia_jogador;
Writeln('O Jogador',jogador,':',nomes[jogador][1],' come‡a a partida.');
Writeln('Pressione uma tecla para come‡ar.');
readkey;
Repeat
Zera_variaveis(mj,nomes,empates,derrotas,vitorias,jogadas,jogar_mais);
Writeln;
Write('PosicÆo:');
posicao:=Readkey;
if (posicao<>'1') and (posicao<>'2') and (posicao<>'3') and (posicao<>'4') and (posicao<>'5') and
(posicao<>'6') and (posicao<>'7') and (posicao<>'8') and (posicao<>'9') Then
Begin
Writeln('PosicÆo Inv lida.Pressione uma tecla para continuar.');
Readkey;
End;
Until (posicao='1') or (posicao='2') or (posicao='3') or (posicao='4') or (posicao='5') or (posicao='6') or
(posicao='7') or (posicao='8') or (posicao='9');
Repeat
Coordenadas_jogada(posicao,Linha,coluna);
posicao_em_branco(jogador,linha,coluna,mj,posicao_branco);
if posicao_branco=True Then
Begin
jogadas:=jogadas+1;
verifica_vencedor(jogador,jogar_mais,mj);
if jogar_mais=false Then
Begin
if jogador=1 then
jogador:=2
else
jogador:=1;
if jogadas=9 Then
empates:=empates+1;
End
Else
Begin
if jogador=1 then
vitorias:=vitorias+1
else
derrotas:=derrotas+1;
End;
End
Else
Begin
Writeln('A posi‡Æo j esta preenchida.Favor jogar novamente.');
Writeln('Pressione uma tecla para continuar.');
Readkey;
End;
imprime_matriz(mj,nomes,empates,derrotas,vitorias);
if (jogar_mais<>true) and (jogadas<9) Then
begin
Writeln;
Write('PosicÆo:');
posicao:=readkey;
End;
Until (jogar_mais=true) or (jogadas=9);
Repeat
Writeln;
Write('Deseja jogar novamente?(S)im,(N)Æo:');
menu:=Readkey;
if (menu<>'S') and (menu<>'s') and (menu<>'N') and (menu<>'n') Then
Begin
Writeln('Op‡Æo Inv lida.Pressione uma tecla para continuar.');
Readkey;
End;
Until (menu='S') or (menu='s') or (menu='N') or (menu='n')
Until (menu='N') or (menu='n')
End
Else
If opcao=2 Then
Begin
Clrscr;
zera_placar(empates,derrotas,vitorias);
Write('Jogador',1,':');
readln(nomes[1][1]);
Nomes[2][1]:='Computador';
repeat
Clrscr;
jogador:=sorteia_jogador;
Writeln('O Jogador',jogador,':',nomes[jogador][1],' come‡a a partida.');
Writeln('Pressione uma tecla para come‡ar.');
readkey;
Zera_variaveis(mj,nomes,empates,derrotas,vitorias,jogadas,jogar_mais);
Repeat
if jogador=1 Then
Begin
Repeat
Writeln;
Write('PosicÆo:');
posicao:=Readkey;
if (posicao<>'1') and (posicao<>'2') and (posicao<>'3') and (posicao<>'4') and (posicao<>'5') and
(posicao<>'6') and (posicao<>'7') and (posicao<>'8') and (posicao<>'9') Then
Begin
Writeln('PosicÆo Inv lida.Pressione uma tecla para continuar.');
Readkey;
End;
Until (posicao='1') or (posicao='2') or (posicao='3') or (posicao='4') or (posicao='5') or
(posicao='6') or (posicao='7') or (posicao='8') or (posicao='9');
Coordenadas_jogada(posicao,Linha,coluna);
posicao_em_branco(jogador,linha,coluna,mj,posicao_branco);
if posicao_branco=True Then
Begin
jogadas:=jogadas+1;
verifica_vencedor(jogador,jogar_mais,mj);
if jogar_mais=false Then
Begin
jogador:=2;
if jogadas=9 Then
empates:=empates+1;
End
Else
Begin
if jogador=1 then
vitorias:=vitorias+1
else
derrotas:=derrotas+1;
End;
End
Else
Begin
Writeln('A posi‡Æo j esta preenchida.Favor jogar novamente.');
Writeln('Pressione uma tecla para continuar.');
Readkey;
End;
End
Else
Begin
if (jogadas<=2) and (mj[2][2]=0) Then
mj[2][2]:=jogador
Else
jogada_pc(jogador,mj);
jogadas:=jogadas+1;
verifica_vencedor(jogador,jogar_mais,mj);
if jogar_mais=false Then
Begin
jogador:=1;
if jogadas=9 Then
empates:=empates+1;
End
Else
Begin
if jogador=1 then
vitorias:=vitorias+1
else
derrotas:=derrotas+1;
End;
End;
imprime_matriz(mj,nomes,empates,derrotas,vitorias);
Until (jogar_mais=true) or (jogadas=9);
Repeat
Writeln;
Write('Deseja jogar novamente?(S)im,(N)Æo:');
menu:=Readkey;
if (menu<>'S') and (menu<>'s') and (menu<>'N') and (menu<>'n') Then
Begin
Writeln('Op‡Æo Inv lida.Pressione uma tecla para continuar.');
Readkey;
End;
Until (menu='S') or (menu='s') or (menu='N') or (menu='n')
Until (menu='N') or (menu='n')
End
Else
If opcao=3 Then
Begin
Clrscr;
zera_placar(empates,derrotas,vitorias);
nomes[1][1]:='Computador1';
Nomes[2][1]:='Computador2';
repeat
Clrscr;
jogador:=sorteia_jogador;
Writeln('O Jogador',jogador,':',nomes[jogador][1],' come‡a a partida.');
Writeln('Pressione uma tecla para come‡ar.');
readkey;
Zera_variaveis(mj,nomes,empates,derrotas,vitorias,jogadas,jogar_mais);
Repeat
if (jogadas<=2) and (mj[2][2]=0) Then
mj[2][2]:=jogador
Else
jogada_pc(jogador,mj);
jogadas:=jogadas+1;
Writeln;
Writeln('Pressione uma tecla para a proxima jogada');
Readkey;
verifica_vencedor(jogador,jogar_mais,mj);
if jogar_mais=false Then
Begin
if jogador=1 Then
Jogador:=2
Else
jogador:=1;
if jogadas=9 Then
empates:=empates+1;
End
Else
Begin
if jogador=1 then
vitorias:=vitorias+1
else
derrotas:=derrotas+1;
End;
imprime_matriz(mj,nomes,empates,derrotas,vitorias);
Until (jogar_mais=true) or (jogadas=9);
Repeat
Writeln;
Write('Deseja jogar novamente?(S)im,(N)Æo:');
menu:=Readkey;
if (menu<>'S') and (menu<>'s') and (menu<>'N') and (menu<>'n') Then
Begin
Writeln('Op‡Æo Inv lida.Pressione uma tecla para continuar.');
Readkey;
End;
Until (menu='S') or (menu='s') or (menu='N') or (menu='n')
Until (menu='N') or (menu='n')
End;
Until opcao=4;
End.
Horas por extenso: convertendo as horas em um TDateTime para texto corrido.
Tocador de Vídeo no Lazarus(Player de Vídeo)
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Ativando e usando "zoom" no ambiente Cinnamon
Vídeo Nostálgico de Instalação do Conectiva Linux 9
Como realizar um ataque de força bruta para desobrir senhas?
Estou tentando ser legalista, mas tá complicado! (8)
Thinkpads são bons mesmo ?! (0)
Queda no serviços da Cloudflare, alguns sites estão fora do ar. (1)









