Jogo da velha "inteligente"
Publicado por João Carlos abreu Junior 01/09/2006
[ Hits: 16.493 ]
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.
Tocador de Vídeo no Lazarus(Player de Vídeo)
Ordenando um vetor sem utilização de variáveis de contagem ou auxiliar
Script em Pascal/Kylix para controle de Locadoras sem salvar arquivos em disco
Nenhum comentário foi encontrado.
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
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhorando a precisão de valores flutuantes em python[AJUDA] (7)
SysAdmin ou DevOps: Qual curso inicial pra essa área? (4)
É cada coisa que me aparece! - não é só 3% (4)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta