Jogo da velha "inteligente"
Publicado por João Carlos abreu Junior 01/09/2006
[ Hits: 16.522 ]
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.
Script em Pascal/Kylix para controle de Locadoras sem salvar arquivos em disco
Ordenando um vetor sem utilização de variáveis de contagem ou auxiliar
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI