Jogo da velha "inteligente"

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

[ Hits: 16.315 ]

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

Horas por extenso: convertendo as horas em um TDateTime para texto corrido.

Executa comandos Linux

Controle de video locadoras

Árvore binária

Estrutura de dados - lista


  

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