Projetando IA em uma batalha 1 contra 1 semelhante ao Pokemon

7

Estou criando um jogo em que o sistema de batalha é semelhante ao Pokemon. Ou seja, uma batalha 1 contra 1 com apenas alguns movimentos (4-6) para escolher. À medida que o jogo está tomando forma, estou começando a pensar em algumas das áreas de codificação mais difíceis, como a IA do inimigo, e tenho algumas perguntas. Eu já pensei em algumas possibilidades para projetar a IA e também queria ouvir seus comentários.

Estou pensando em experimentar uma IA universal para o meu jogo, onde todos os monstros utilizarão a mesma lógica para determinar que movimento usarão. Ele será baseado em equações / valores atribuídos a cada movimento e determinar qual é o melhor a ser feito. Por exemplo, se o movimento dos monstros sofrer resistência (1/2 dano) pelo oponente, ele receberá um valor efetivo menor do que os outros e os movimentos que causarem dano extra devido à vulnerabilidade receberão um valor efetivo mais alto. Além disso, eu estava pensando em adicionar uma variável que reduz o valor se a movimentação tiver sido usada repetidamente para evitar que o computador sempre use a mesma movimentação. Eu sinto que isso está atualmente limitado apenas para fazer o computador usar o movimento de maior dano. Alguma sugestão?

SO para minhas perguntas.

  1. Como o design da lógica da IA ​​para cada monstro / Pokemon vs ter um conjunto geral de regras para todos afeta o tamanho do meu jogo em termos de código e eficácia da IA?

  2. Existem recursos que discutem a criação de IA dessa maneira? Eu descobri muito pouco sobre a IA nos jogos Pokemon e não tenho certeza de que outros jogos possam ser similares em mecânica.

Obrigado pelo seu tempo!

Willmer
fonte

Respostas:

12

A IA generalizada com componentes modulares provavelmente resultará em código menor e será mais fácil de expandir para um número maior de caracteres. Aqui estão algumas considerações de exemplo, supondo que você construa um sistema de ponderação genérico para todos os caracteres.

-Você pode atribuir a cada personagem uma 'personalidade' ou 'atitude' de uma lista fixa (por exemplo, 'Agressivo', 'Defensivo', 'Aleatório'). Em seguida, faça com que sua fórmula de ponderação leve isso em consideração. Então, digamos, um personagem agressivo daria mais peso a movimentos prejudiciais, enquanto um personagem defensivo daria mais peso a se curar. Então, você só precisa atribuir a personalidade a cada personagem, em vez de escrever scripts exclusivos para cada um.

-Em vez de sempre escolher a opção 'melhor', sua IA pode ponderar cada opção e decidir aleatoriamente entre elas. Portanto, com 4 movimentos, se os valores calculados chegarem a 60, 35, 25 e 20 neste turno, isso soma 140. Escolha um número aleatório no intervalo de 1 a 140 e verifique os pesos para decidir qual movimento é usado. Isso fará com que a IA geralmente use a melhor jogada, mas muitas vezes surpreende você com uma escolha alternativa.

-Você pode atribuir a cada personagem de IA uma classificação de "habilidade" numérica usada para aumentar as chances de que eles escolham a melhor jogada.

Lembre-se de que Pokemon tem MUITOS movimentos que não causam dano direto, mas aplicam efeitos de status, buffs ou debuffs. Você pode dar a cada personagem uma preferência numérica por movimentos prejudiciais versus movimentos não prejudiciais. Você também pode fornecer a eles um número definido ou uma variedade possível de movimentos não prejudiciais que eles usarão antes de começar a atacar diretamente. Os valores atuais de HP e de seu oponente também podem ser um fator na fórmula para ponderar o ataque versus o uso de movimentos estratégicos - quando os dois estão em plena saúde, têm tempo para configurar, mas quando se trata de uma fatia de HP cada , é hora de usar um ataque (espero que atinja primeiro!).

-Além disso, Pokemon tem ataques com efeitos secundários. Considere como você deseja ponderar um ataque que causa mais dano do que um ataque mais fraco, com chance de atordoar ou que sempre acontece primeiro.

DGH
fonte
obrigado por muito por essas sugestões. Eu acho que seria uma ótima idéia configurar alguns estilos diferentes (agressivo, defensivo) para adicionar alguma variedade e depois dar peso a coisas diferentes, como efeitos de status ou movimentos prejudiciais.
willmer
5

Portanto, suas maiores preocupações são o código e a eficácia da IA. Como sua pergunta tem 44 visualizações e nenhuma sugestão, eu pensei que você não se importaria com as idéias de um jogador básico - especialmente aquele que jogou jogos de Pokemon. Eu não tenho um background de IA e apenas um pequeno background de programação, no entanto, penso:

Se você possui uma IA exclusiva por puxão (Pokemon), seu código pode ser enorme. Portanto, você precisa de classes de puxão e IA (um conjunto de estratégias) por classe. O problema é que, para as classes = n, você tem "A soma de i = n a i = 0 de i" conjuntos de estratégias (SS) a serem criados.

Example: 
Classes A, B, C have match-ups AA, AB, AC, BB, BC, CC. n=3 SS=6=3+2+1
Classes ABCD; match-ups AA AB AC AD BB BC BD CC CD DD. n=4 SS=10=4+3+2+1

Se você cria suas aulas da maneira típica, há uma maneira de pedra-papel-tesoura para tudo. Como o fogo bate a água bate a terra carrega fogo (dá uma volta). Assim, cada puxão pode ter um identificador para a classe de puxão. Além disso, você diz um máximo de 5 jogadas.

Example:
Pikachu's "growl" has the same effect as Raticates "squeal" to "Lower defense"

Seu objeto Poke conteria o seguinte

  1. É classe (A, B, C, etc)
  2. classe # de listas ordenadas que priorizam qual mudança usar em relação a outras classes

    Exemplo: Pikachu: Classe A. StrategySet A; 12345, B; 34512 C; 51234 Chrmndr: Classe B. StrategySet A; 21543, B; 12345 C; 34512 Squirtl: Classe C. StrategySet A; 43215, B; 21543 C; 12345

Quando eles lutam (digamos Pikachu x Charmander) se a CPU for Pikachu, o objeto Charmander passa a Classe B para Pikachu, e o CPU-Pikachu seleciona o conjunto de estratégias B; 34512, que é a maneira priorizada de combater um oponente da Classe B . Esses cinco movimentos se enquadram em categorias gerais (ataque, defesa, aceleração automática, velocidade do inimigo, ataque do inimigo) ou o que você tem e, portanto, o computador sabe o que usar primeiro. O uso de outros itens da lista pode estar dentro de parâmetros como a frequência de saúde do oponente ou até algo louco como o sim dos valores de prioridade que ultrapassam o máximo.

VISQL
fonte
0

Eu fiz algum trabalho no código de batalha pixelmon, como já foi mencionado, funciona em opções ponderadas para os movimentos, mas também existem status para se preocupar, então o atributo speed é usado + buffs / debuffs / items para determinar o movimento ordem para esse turno e recalque o próximo turno.

Mas lembre-se de que existem movimentos e itens limitados para qualquer um usar em um jogo no estilo pokemon, pois todos são pré-determinados no início da batalha.

Há um
fonte