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 ();
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