Jogo da velha "inteligente"
Publicado por João Carlos abreu Junior 01/09/2006
[ Hits: 16.768 ]
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)
Script em Pascal/Kylix para controle de Locadoras sem salvar arquivos em disco
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
É normal não gostar de KDE? (9)
Linux é a solução para o fim do Windows10? (2)
Problemas com Driver NVIDIA (4)









