• 0
Sign in to follow this  
dfop02

Criar uma IA que jogue xadrez

Question

Eu estou fazendo um xadrez como trabalho pra faculdade, e queria fazer a IA dele pra além de ser player 1 vs player 2, tenha player vs comp. Acontece que não faço a menor ideia de como fazer, alguém pode me dar uma luz de como fazer o comp jogar sozinho?

Share this post


Link to post
Share on other sites

5 answers to this question

Recommended Posts

  • 0
  • 0
37 minutos atrás, Jhonas disse:

Sinceramente, não ajudou muito...

A ideia de vim buscar ajuda no fórum é de que alguém ajude com sugestões e/ou exemplos de como fazer. Mandar links de buscas no google é muito vago (O que alias eu já fiz antes de vir aqui, mas não encontrei o que procuro), eu procuro fazer uma IA especifica em uma linguagem especifica (C), mas não espero códigos prontos, quero aprender a fazer. Ainda assim eu agradeço a atenção o/

Share this post


Link to post
Share on other sites
  • 0

ok...  voce disse que não tinha a menor idéia de como fazer , por isso os links para voce aprender o conceito .

exemplos prontos tem varios na net, mas não usando IA

https://www.google.com.br/search?q=jogo+da+velha+em+c+com+matriz&o que=jogo+da+velha+em+c&gs_l=psy-ab.1.3.0l8.2564920.2575849.0.2582703.32.25.6.0.0.0.231.3007.1j22j1.24.0....0...1.1.64.psy-ab..2.30.3065...0i67k1j0i131k1j0i10k1j0i22i30k1j0i22i10i30k1j0i13k1.0.KtLyNtwHK5U

o que voce pode fazer é, aprender como montar a interface do usuario e depois aplicar o conceito de IA

 

OBS: Caso interessar, veja esse exemplo feito em delphi usando o conceito de IA

https://www.vivaolinux.com.br/script/Jogo-da-velha-inteligente

abraço

Share this post


Link to post
Share on other sites
  • 0
4 horas atrás, Jhonas disse:

ok...  voce disse que não tinha a menor idéia de como fazer , por isso os links para voce aprender o conceito .

exemplos prontos tem varios na net, mas não usando IA

https://www.google.com.br/search?q=jogo+da+velha+em+c+com+matriz&o que=jogo+da+velha+em+c&gs_l=psy-ab.1.3.0l8.2564920.2575849.0.2582703.32.25.6.0.0.0.231.3007.1j22j1.24.0....0...1.1.64.psy-ab..2.30.3065...0i67k1j0i131k1j0i10k1j0i22i30k1j0i22i10i30k1j0i13k1.0.KtLyNtwHK5U

o que voce pode fazer é, aprender como montar a interface do usuario e depois aplicar o conceito de IA

 

OBS: Caso interessar, veja esse exemplo feito em delphi usando o conceito de IA

https://www.vivaolinux.com.br/script/Jogo-da-velha-inteligente

abraço

Certo, agora tive um progresso, mas por ser em uma linguagem que não estou habituado, eu não entendi bem as declarações e funções, apenas a parte lógica, basicamente ele manda a "IA" jogar de forma randômica em qualquer local não escolhido? Pelo menos foi o que deu a entender.

Essa manipulação funciona bem em jogos de menor porte como jogo da velha que tem apenas 9 casas para preencher, mas em coisas mais elaboradas como damas e xadrez requer um refinamento a mais, algum tipo de filtragem nas jogadas, ou algo do gênero pra classificar como boas(executar) ou ruins(ignorar). Vou pesquisar sobre.

Share this post


Link to post
Share on other sites
  • 0

eu não entendi bem as declarações e funções, apenas a parte lógica, basicamente ele manda a "IA" jogar de forma randômica em qualquer local não escolhido?

exato, mas o que ele faz é guardar as jogadas feitas, marcando aquelas em que o computador perdeu.

depois a cada nova jogada, ele faz uma verificação rapida nas posições que não deve mais usar

dessa forma, voce começa o jogo ganhando, mas depois o maximo que voce vai conseguir é empatar ou perder se cometer um erro.

a lógica é a mesma para qualquer linguagem que for usar

o mesmo programa do link ( delphi ) , convertido para o C#

using System;
using crt;

namespace Matriz
{

  public class Matriz
  {
    public static Char menu;
    public static Char posicao;
    public static int opcao;
    public static int jogadas;
    public static int empates;
    public static int derrotas;
    public static int vitorias;
    public static int i;
    public static int j;
    public static int linha;
    public static int coluna;
    public static int jogador;
    public static matriz_jogo mj;
    public static nome_jogadores nomes;
    public static Boolean jogar_mais;
    public static Boolean posicao_branco;

    public static void Zera_variaveis(ref matriz_jogo mat, nome_jogadores nomes, int a, int b, int c, ref int d, ref Boolean e)
    {
      int i;
      int j;
      int posicao;
      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; i <= 3; i += 1)
      {
        for (j = 1; j <= 3; j += 1)
        {
          posicao = posicao + 1;
          Gotoxy(-2, i + 5);
          mat[i][j] = 0;
          Write(posicao);
        }
      }
    }

    public static void Zera_placar(ref int a, ref int b, ref int c)
    {
      a = 0;
      b = 0;
      c = 0;
    }

    public static int Sorteia_jogador()
    {
      sorteia_jogador = random(2) + 1;
    }

    public static void Imprime_matriz(ref matriz_jogo mat, nome_jogadores nomes, int a, int b, int c)
    {
      int i;
      int j;
      int posicao;
      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; i <= 3; i += 1)
      {
        for (j = 1; j <= 3; j += 1)
        {
          posicao = posicao + 1;
          Gotoxy(-2, i + 5);
          if (mat == 1)
          {
          }
          if (mat == 2)
          {
          }
          Write(posicao);
        }
      }
    }

    public static void Coordenadas_jogada(char posicao, ref int Linha, ref int coluna)
    {
      if (posicao == '1')
      {
        linha = 1;
        coluna = 1;
      }
      else if (posicao == '2') 
      {
        linha = 1;
        coluna = 2;
      }
      else if (posicao == '3') 
      {
        linha = 1;
        coluna = 3;
      }
      else if (posicao == '4') 
      {
        linha = 2;
        coluna = 1;
      }
      else if (posicao == '5') 
      {
        linha = 2;
        coluna = 2;
      }
      else if (posicao == '6') 
      {
        linha = 2;
        coluna = 3;
      }
      else if (posicao == '7') 
      {
        linha = 3;
        coluna = 1;
      }
      else if (posicao == '8') 
      {
        linha = 3;
        coluna = 2;
      }
      else
      {
        linha = 3;
        coluna = 3;
      }
    }

    public static void Posicao_em_branco(int caracter, int linha, int coluna, ref matriz_jogo mj, ref Boolean a)
    {
      if (mj == 0)
      {
        mj[linha][coluna] = caracter;
        a = true;
      }
      else
        a = false;
    }

    public static void Verifica_vencedor(int jogador, ref Boolean vencedor, matriz_jogo mj)
    {
      int pontos_coluna;
      int pontos_linha;
      int i;
      int j;
      Boolean posicao_vazial;
      Boolean posicao_vaziac;
      vencedor = false;
      for (i = 1; i <= 3; i += 1)
      {
        pontos_coluna = 0;
        pontos_linha = 0;
        posicao_vazial = false;
        posicao_vaziac = false;
        for (j = 1; j <= 3; j += 1)
        {
          if (mj == jogador)
          {
            pontos_coluna = pontos_coluna + mj[i][j];
          }
          else if (mj == 0) 
          {
            posicao_vaziac = true;
          }
          if (mj == jogador)
          {
            pontos_linha = pontos_linha + mj[j][i];
          }
          else if (mj == 0) 
          {
            posicao_vazial = true;
          }
        }
        if (((3 == 0) && (posicao_vaziac == false)) || ((3 == 0) && (posicao_vazial == false)) && (vencedor == false))
        {
          vencedor = true;
        }
        if (vencedor == false)
        {
          if ((3 == 0) && (mj == jogador) && (mj == jogador) && (mj == jogador))
          {
            vencedor = true;
          }
          else if ((3 == 0) && (mj == jogador) && (mj == jogador) && (mj == jogador)) 
          {
            vencedor = true;
          }
        }
      }
    }

    public static void Devolve_jogada_pc(matriz_jogo mj, int jogada, ref int soma, ref int espacos_vazios, ref int linha, ref int coluna)
    {
      int i;
      int j;
      int dif_linha;
      int dif_coluna;
      int lp;
      int cp;
      soma = 0;
      espacos_vazios = 0;
      linha = 0;
      coluna = 0;
      if (jogada <= 3)
      {
        dif_coluna = 0;
        for (j = 1; j <= 3; j += 1)
        {
          if (mj == 0)
          {
            espacos_vazios = espacos_vazios + 1;
            if (soma > 0)
            {
              dif_coluna = j - cp;
              if (dif_coluna < 0)
              {
                dif_coluna =  - dif_coluna;
              }
              if ((dif_coluna > 1) || (linha == 0))
              {
                linha = jogada;
                coluna = j;
              }
            }
            else
            {
              if (linha == 0)
              {
                linha = jogada;
                coluna = j;
              }
            }
          }
          else
          {
            soma = soma + mj[jogada][j];
            cp = j;
          }
        }
      }
      else if (jogada <= 6) 
      {
        dif_linha = 0;
        for (i = 1; i <= 3; i += 1)
        {
          if (mj == 0)
          {
            espacos_vazios = espacos_vazios + 1;
            if (soma > 0)
            {
              dif_linha = i - cp;
              if (dif_linha < 0)
              {
                dif_linha =  - dif_linha;
              }
              if ((dif_linha > 1) || (linha == 0))
              {
                linha = i;
                coluna = jogada - 3;
              }
            }
            else if (linha == 0) 
            {
              linha = i;
              coluna = jogada - 3;
            }
          }
          else
          {
            soma = soma + mj[i][jogada - 3];
            lp = i;
          }
        }
      }
      else if (jogada == 7) 
      {
        for (i = 1; i <= 3; i += 1)
        {
          if (mj == 0)
          {
            espacos_vazios = espacos_vazios + 1;
            if ((mj == 1) && (mj == 1) && (mj == 0))
            {
              linha = 1;
              coluna = 1;
            }
            else if ((mj == 1) && (mj == 1) && (mj == 0)) 
            {
              linha = 3;
              coluna = 3;
            }
            else
            {
              linha = i;
              coluna = i;
            }
          }
          else
            soma = soma + mj[i][i];
        }
      }
      else
      {
        for (i = 1; i <= 3; i += 1)
        {
          if (mj == 0)
          {
            espacos_vazios = espacos_vazios + 1;
            linha = i;
            coluna = 4 - i;
          }
          else
            soma = soma + mj[i][4 - i];
        }
      }
    }

    public static void Jogada_pc(int jogador, ref matriz_jogo mj)
    {
      int i;
      int j;
      int soma;
      int espacos_vazios;
      int linha_vazia;
      int coluna_vazia;
      int somamax;
      int espacosmin;
      int linha;
      int coluna;
      int[] jogadas_possiveis = new int[3 - 1 + 1];
      int jogadas;
      linha = 0;
      coluna = 0;
      somamax = 0;
      espacosmin = 3;
      for (i = 1; i <= 8; i += 1)
      {
        devolve_jogada_pc(mj, i, soma, espacos_vazios, linha_vazia, coluna_vazia);
        if ((soma >= somamax) && (espacos_vazios <= espacosmin) && (espacos_vazios >= 1) && (2 == 0))
        {
          if ((soma != somamax) || (espacos_vazios != espacosmin))
          {
            linha = linha_vazia;
            coluna = coluna_vazia;
            somamax = soma;
            espacosmin = espacos_vazios;
          }
        }
      }
      if ((linha == 0) && (coluna == 0))
      {
        for (i = 1; i <= 3; i += 1)
        {
          for (j = 1; j <= 3; j += 1)
          {
            if (mj == 0)
            {
              linha = i;
              coluna = j;
            }
          }
        }
      }
      mj[linha][coluna] = jogador;
    }

    void run()
    {
      Clrscr;
      zera_placar(empates, derrotas, vitorias);
      nomes[1][1] = "Computador1";
      Nomes[2][1] = "Computador2";
    }

    public static void Main(string[] args)
    {
      Matriz myApp = new Matriz();
      myApp.run();
    }
  }
}

Somente fiz a conversão , mas não testei .... O resto agora é com voce

abraço

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this