??

Inteligência Artificial (IA) para Jogo de Cartas

Estamos atualmente analisando como implementar a questão do I.A no jogo de cartas Jornada, vendo entre varias estrategias e quais passos devem ser seguidos, vou comentar neste pequeno artigo um pouco sobre, nosso trabalho.

 

Primeiramente quais técnicas de I.A podem ser aplicadas?

R.:  Algoritmo Genético ou Rede Neural são dois exemplos do que devemos aplicar. Pois a maquina precisa ir aprendendo e evoluindo, porém isto não pode onerar o tempo de resposta do jogo.

 

Alguma técnica de Mineração de Dados vai ser utilizada?

R.: Sim! Pois os dados precisam ser transformados em Informação, para depois ser lançados em algoritmos de aprendizagem. Por exemplo quais são os atributos mais pertinentes e relevantes no banco de dados? Precisam ser tratados para algum termo linguístico? e por ai vai.

 

Vai haver alteração no Banco de dados das cartas?

R.: Sim! Alguns campos novos na tabela serão adicionados, por exemplo, o campo "PotencialDanoMin" e "PotencialDanoMax", mesmo cartas mágicas ou de criaturas podem gerar algum dano, este intervalo de dano deve ser considerado pela I.A, nos casos onde não ocorra um dano, vai haver um peso para os tipos de efeitos das cartas, entre outros detalhes que vão facilitar ao computador fazer a jogada mais inteligente.

 

Outro ponto e como fazer a construção da tela do "Player vs PC", bom neste, inicialmente será tratado como um jogo multiplayer, onde o host será um usuário especifico do banco de dados, criado somente para conter os dados necessário para o iniciar do jogo, após isto é "só" tornar a maquina inteligente  nos lances e manter alguns cuidados, para que ela tenha um comportamento parecido com a de um jogador.

 

Quais as ações que o PC faz de forma mecânica?

R.: Mover carta da mão para o campo de batalha,  clicar no alvo de algum efeito (Ex.: Destrói a carta inimiga selecionada), Vira cartas viradas para cima se estiverem ocultas (Ativando algum efeito de target, como mencionado antes), Atacar cartas inimigas.
Obs.: Existem ações que ocorrem de forma automática, independente da maquina por  exemplo,  "Ao entrar em campo causa dano em todas as criaturas", basta a maquina por a carta em campo que o efeito ocorre, então posso dizer que as ações de fato da maquina esta em:

  • [Click] Cartas da Mão para campo (Direito e/ou esquerdo dependendo do tipo da carta, por exemplo, cartas de revelação)
  • [Click] Alvo de efeito. (Se a carta em campo tiver ativado algum)
  • [Click] Virar carta para cima (Flip) e checar alvo do efeito (Se existir efeito de alvo)
  • [Click] Atacar criatura inimiga
  • [Click] Passar Turno se não puder executar nenhuma ação acima

 

Poderia falar mais sobre isto?  

R.: Primeiro o foco na I.A da maquina para a escolha dos alvos. Existe a I.A bruta (Burra) que segue um algoritmo fechado em uma regra que não evolui, por exemplo, como definir qual o melhor alvo (target) para atacar? Se não tiver o que fazer? Veja o código abaixo.

  1. int applyDamge = target.getDamage() - (source.getDefense()+source.getLife());
  2. int receivedDamage = source.getDamage() - (target.getDefense()+target.getLife());
  3. return applyDamge-(receivedDamage);

O objetivo do código acima é informa se o valor retornado foi positivo, zero ou negativo. No jogo de Cartas, quando a criatura ataca outra, ambas recebem dano, podendo transpassar ao oponente. Então se o resultado da variável "applyDamge" for:

  • Positivo: Destrói carta inimiga e transpassa dano ao Adversário.
  • Zero: Destrói carta inimiga
  • Negativo: NÃO Destrói a carta inimiga, somente causa dano.

A variável "receivedDamage"  é a mesma coisa, porém em relação ao jogador aliado (você). Logo entendemos que "applyDamge" Positivo é excelente, Zero bom e  Negativo Ruim. Enquanto que "receivedDamagePositivo é Ruim, Zero bom e  Negativo Excelente. Então é simples, na linha do returno usamos a seguinte regra "applyDamge-(receivedDamage)", se o dano recebido for negativo, ele é convertido em positivo e somado, porém se o dano recebido for positivo ele é subtraído (Ex.: 5 - ( - 6 ) = 5+6 = 11 ou 5 - ( 6 ) = 5-6=-1). Uma regra matemática simples, sem nada complexo que contribui imensamente para a I.A do jogo. Notem que este código vai ser feito com cada possível alvo (For/While), guardando sempre o maior valor. Em relação ao return: 

  1. Positivo: Ataca.
  2. Zero: Ataca
  3. Negativo: Entra em modo de defesa.

Em casos de cartas que causam dano direto ao adversário só atacar, sem validar nada. Nos casos de cartas imunes a um número X de ataques, só bater no melhor alvo (Menos pior ou melhor). já que vai enfraquecer o mesmo. Nos casos de cartas que batem mais de uma vez, a cada batida, checar se foi ao cemitério, assim interrompendo os ataques consecutivos (Ex.: Tem 3 ataques, mas ao bater 2x foi destruída na troca de dano, então interrompe o ataque).

No caso de efeitos de alvo (Target) é simples, priorize a carta inimiga de melhor status (Dano/Defesa/Vida), uma vez que se o alvo é o inimigo, o melhor caso por padrão, seria afetar a carta mais forte em campo.

Em casos de cartas de Revelação (Flip), sempre vire elas na primeira chance quando estão em campo, e coloque as mesmas sempre viradas para baixo (Mão para o campo).

Para que a maquina não saia tomando ações em velocidade extrema, onde o jogador não consiga acompanhar o que aconteceu, gere um delay de analise (Ex.: 2 seg).

 

Temos dois tipos de I.A, a burra, onde suas regras são fechadas (não existe aprendizagem), somente ações fixas dentro de uma regra. A partir disto passamos para a I.A inteligente (Ocorre aprendizado), por exemplo, se tiver 5 cartas na mão, em qual a ordem devo por no campo? qual deve ser priorizada? inicialmente se cria uma ordem fixa (I.A burra) de forma empírica, com o tempo se analisa os dados do jogo e reformula esta ordem.

  1. Guarda no banco a ordem dos lançamentos das cartas feitas pelo jogador e pela maquina.
  2. no mesmo registro (Linha) se guarda uma pontuação, com base em:
    • Pontos por HP do inimigo perdida (positivo); Sua HP perdida (negativo); 
    • Pontos positivos e negativos por Cartas em campo, na mão e no cemitério (sua e adversário).

Isto com o tempo vai gerar informações a serem tratadas no I.A e por fim um arquivo, tabela ou algo similar, informando a ordem de lançamento das cartas nos melhores resultados, a maquina apenas vai ver o caso igual ou similar e seguir a ordem.

Nota.: As exceções vão surgir nos casos de I.A aplicada pós Mineração de dados (Regras mais inteligentes), com base na mão e nas cartas em campo (Mágica e Criatura).

 

Como fazer a maquina escolher a melhor carta para por em campo?

R.: Digamos que a maquina pode por todas as 9 cartas em campo, por padrão a maquina vai jogar a primeira carta que tiver na lista e assim por diante. O segredo esta em dar uma ordem de prioridade entre cartas, por exemplo, na hora de decidir qual carta vai da mão para o campo, ele reordena as cartas por ordem de relevância, em seguida joga o primeiro desta lista, só isto. Como definir o grau de relevância das cartas? Inicialmente você na mão vai dizer esta ordem em uma lista fixa com todas as cartas, com o tempo a maquina vai pegar a melhor escolha de uma lista criada com I.A

Go to top