Jogo da velha "inteligente"

Publicado por João Carlos abreu Junior 01/09/2006

[ Hits: 16.493 ]

Download jogo_da_velha.pas




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.

  



Esconder código-fonte

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.

Scripts recomendados

Tocador de Vídeo no Lazarus(Player de Vídeo)

Ordenando um vetor sem utilização de variáveis de contagem ou auxiliar

Executa comandos Linux

Joguinho Tetris

Script em Pascal/Kylix para controle de Locadoras sem salvar arquivos em disco


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts