segunda-feira, 6 de março de 2017

Dev Log3 # Tic Tac Toe SP - IA do jogo. [Português]

Hoje vamos falar sobre a Inteligência Artificial(IA).

O protótipo e a primeira versão do jogo.

Primeiro foi feito um protótipo em papel com alguns poderes, com esse teste o jogo funcionou, mas dependia ainda de duas pessoas. Na primeira versão digital em unity do jogo, ainda, não havia uma IA implementada. Era uma versão para dois jogadores. Dependendo da esperteza dos jogadores.

Primeiro protótipo



O conceito inicial da IA.

Primeiro se pensou em jogadas mais usadas nos protótipos em papel e na versão digital. Também se pensou em uma hierarquia de ações. Depois a equipe traçou algumas jogadas mais recorrentes e foram colocadas no código da IA. No entanto, esse mapeamento ainda é insuficiente. Com isso estamos usando um algoritmo para mapear as jogadas e aprimorar a IA.


O funcionamento técnico da IA.

Para decidir qual a jogada da IA, o Tic Tac Toe SP analisa o tabuleiro por cada situação, e atribui pontos a cada casa de acordo com as situações, se encontradas. A casa com mais pontos é aquela na qual a IA deve jogar.

Durante a análise do tabuleiro, a cada casa é atribuído dois valores: prioridade (o número de pontos) e o tipo de ação: none, basic, prevent e destroy (esta lista está sujeita a mudanças).

None: a IA não pode jogar naquela casa.
Basic: a IA deve jogar a sua peça básica (X ou O) naquela casa.
Prevent: a IA deve jogar uma peça (gelo, planta, sua peça normal mesmo) para atrapalhar uma jogada do adversário. A diferença para basic é que ele pode usar gelo e planta também.
Destroy: a IA deve destruir a peça que está na casa, com maçarico ou bomba.

Se a IA não conseguir realizar a ação com mais pontos (por não ter maçarico ou bomba para destruir, por exemplo), esta é descartada e a próxima com mais pontos é tentada.



A cada função a IA procura uma situação específica no tabuleiro. No exemplo acima, encontraria duas peças do adversário soltas e duas suas juntas. Atualmente, ele não procura um bloco de gelo isolado, pois ele não tem importância – se ele estivesse junto com outras peças daí poderia ter importância.



As situações que o programa procura são as seguintes:

Legenda:
Peça básica do jogador: A peça básica do jogador (no caso da IA) – X ou O
Peça básica do adversário: A peça básica do adversário – X ou O
Prioridade: número de pontos, no fim a casa com a maior prioridade é a escolhida para ser jogada.
Casa vazia: casa sem qualquer peça colocada

checkPlayerOneBasicPiece ();

Prioridade: 50
Ação: Basic

Procura pelas peças básicas do jogador, independente de estarem juntas de outras ou não. Então atribui pontos a todas as casas ao redor destas que estejam vazias.




checkPlayerTwoBasicPieces ();

Prioridade: 75
Ação: Basic

Procura pelas peças básicas do jogador que estejam um adjacente do outro. Se ele encontrar uma peça adjacente a outra, atribui os pontos para as casas que permitem completar três peças (duas no máximo) – as que estiverem vazias, obviamente.




checkEnemyTwoBasicPieces ();

Prioridade: 74
Ação: Prevent

Como o anterior, mas procura pelas peças do adversário. Se ele encontrar uma peça adjacente a outra, atribui os pontos para as casas que o adversário poderia usar para completar três peças (duas no máximo) – as que estiverem vazias, obviamente.

Obs: No estado atual do jogo, parece que as casas atribuídas por esta função não têm sido escolhidas: sempre tem outra casa com mais pontos.




checkPlayerThreeBasicPieces ();

Prioridade: 100
Ação: Basic

Procura por três peças básicas do jogador que estejam adjacentes, sendo que só precisa colocar mais uma peça para vencer o jogo. A prioridade é máxima, e no máximo a duas casas serão atribuídas pontos (as que estiverem vazias).




checkEnemyThreeBasicPieces ();

Prioridade: 95
Ação: Prevent

Como o anterior, mas procura pelas peças do adversário. É muito importante prevenir a vitória dele, só não mais do que garantir a própria vitória neste turno.




checkEnemyTwoAndAFourthBasicPieces ();
checkEnemyOneAndThirdFourthBasicPieces ();

Prioridade: 95

Ação: Prevent

Procura os casos em que o adversário tem duas peças juntas, uma casa vazia, e outra peça, sendo que jogar na vazia daria a ele uma vitória. Atribui os pontos a esta casa vazia, e têm a mesma prioridade de três peças dele juntas.



checkEnemyOneAndThirdFourthBasicPiecesAndAnIceBetween ();
checkEnemyTwoAndAFourthBasicPiecesAndAnIceBetween ();

Prioridade: 90
Ação: Destroy

Aqui se procura a situação de haver duas peças, um gelo, e outra peça alinhados. Destrói uma das peças.

Obs.: De fato, este é o único caso atualmente em que a IA é solicitada a usar o maçarico ou bomba.



resetActionsBoard ();

Prioridade: 0
Ação: Basic ou None

Garante que todas as casas do tabuleiro tenham valores atribuídos. Atribui prioridade zero a cada casa, e se ela estiver ocupada é atribuída ação none, proibindo ação sobre ela.

Obs.: Os valores atribuídos podem ser substituídos posteriormente por outra das funções acima, inclusive das casas ocupadas, nas quais podem ser atribuídas uma ação destroy: de destruir a peça.




Obs. 2: A ordem em que as funções são executadas não importa, pois somente valores com prioridade maior podem substituir outros. Se uma função tentar atribuir valores com prioridade menor, é impedido.




Nenhum comentário:

Postar um comentário