Esta atividade consiste na familiarização da execução do programa TankSoar: essencialmente ele provê um ambiente similiar ao Eaters - jogo de tabuleiro com agentes se movimenta e realizando ações. Entretanto, o TankSoar oferece uma maior complexidade, com mais sensores e ações disponíveis para cada agente.
Tabuleiro de uma partida do TankSoar - reprodução do Tutorial 3.
Uma diferença importante com o jogo Eaters é o processo de execução/escalonamento de cada agente: uma vez que cada tanque poderá executar uma grande variedade de ações simplesmente analisando e elaborando as informações recebidas dos sensores, o TankSoar possui um processo de escalonamento que permite cada agente executar até que ele crie uma extensão no objeto "io.output-link", ou seja, defina uma ação para executar no tabuleiro, ou atinja um total de 15 ciclos de decisão do Soar. Esse escalonamento está ilustrado a seguir:
O jogo também estabelece um limite de 100 rodadas para auto reinciar os tanques - como se todos houvessem sido destruídos - caso durante essas 100 rodadas nenhum deles dispare um míssel.
Cada tanque ganha 2 pontos quando um míssel que disparou atinge outro tanque com o escudo desligado; ganha 3 pontos quando seu míssel destrói um tanque. Cada tanque perde 1 ponto quanto é atingido por um míssel enquanto está com o escudo desligado; perde 2 pontos quanto morre.
O jogo termina quando um tanque atinge 50 pontos.
1.1. Quais sensores disponíveis?
São muitos sensores disponíveis para cada agente, acessíveis a partir de extensões no objeto "io.input-link"; o tutorial os divide em 2 categorias - Primários e Secundários - descritos a seguir:
Primários:
- Blocked sensor: "^blocked" - possui extensões para cada direção ("backward", "forward", "left" e "right") que indicam qual está bloqueada por qualquer tipo de objeto.
- Incomming sensor: "^incoming" - também possui extensões para cada direção, indicando em quais delas um míssel foi disparado contra o tanque.
- Radar sensor: "^radar" - rastreia objetos à frente do tanque, cobrindo a direção imediatamente à frente do tanque e também uma posição à esquerda e outra à direita. Possui uma extensão para cada tipo de objeto ("energy", "health", "missiles", "obstacle", "open" e "tank"); dentro de cada uma dessas extensões existem outras duas, indicando a distância do objeto ("distance") - medida apenas em termos de posições à frente (não distância necessária para se chegar do tanque até o objeto que, no caso de objetos à frente à esquerda ou direita seria diferente) - e indicando se o objeto está logo à frente, à direita ou à esquerda na frente do tanque ("center", "right" e "left" respectivamente).
- Rwaves (radar waves) sensor: "^rwaves" - possui extensões para cada direção, indicando em qual delas ondas de radar foram lançadas para deterctar o tanque, indicando um oponente nessa direção.
- Smell sensor: "^smell" - detecta o tanque mais próximo (usando distância de Manhattan, sem levar em conta a existência de obstáculos), indicando a distância até ele e a sua cor (característica estranha para um sensor de cheiro...).
- Sound sensor: "^sound" - informa o tanque mais próximo que se moveu durante o último ciclo de decisão, desde que ele não esteja a uma distância superior a 7 blocos. Devolve a direção do caminho mais curto para o tanque.
Secundários
- Clock: "^clock" - contador de rodadas da partida.
- Direction: "^direction" - direção absoluta ("north", "east", "south" e "west") absoluta para a qual o tanque está virado.
- Energy: "^energy" - recarregador de energia.
- Energy recharger: "^energyrecharger" - indicador se o tanque está ou não recarregando energia.
- Health: "^health" - recarregador de saúde.
- Health recharger: "^healthrecharger" - indicador se o tanque está ou não recarregando saúde.
- Missiles: "^missiles" - pacote para recarga de mísseis.
- My-color: "^my-color" - cor própria do tanque
- Radar-distance: "^radar-distance" - potência atual do radar, indicando até qual distância ele pode analisar.
- Radar-status: "^radar-status" - indicação se ele está ligado ou não.
- Random: "^random" - um valor randômico entre 0.0 e 1.0.
- Resurrected: "^resurrected" - indicação se o tanque ressucitou (mudando subtamente de posição) durante a última rodada.
- Shield-status: "^shield-status" - indicação se o escudo protetor do tanque está ligado ou não.
- X, Y: "^x" e "^y" - coordenadas atuais do tanque.
1.2. Quais ações possíveis para cada tanque?
- Move - mover nas 4 direções; mover para o lado é chamado "slide" no tutorial.
- Rotate - rotacionar na mesma posição
- Fire - disparar míssel
- Radar - ligar/desligar radar
- Radar Range - selecionar a distância que o radar chega, mudando a sua potência
- Shields - ligar/desligar escudo
1.3. Quais objetos podem ser encontrados?
- Obstáculos - árvores ou rochas
- Health charger - carregador de saúde
- Energy charger - carregador de energia
- Pack of missiles - carga com 7 mísseis
- Tanks - outros tanques
1.4. Tabelas de consumo de energia, saúde e pontuação
- 1000 - valor inicial
- -20 - consumo pelo uso do escudo por uma rodada
- -1 ~ -14 - consumo de energia pelo uso do radar, definido de acordo com a potência de uso; ligando-se o radar sempre na potência usual de 13 (não faz sentido ligar com 14, já que o tabuleiro tem 16 posições, as extremidades são sempre bloqueadas e o tanque ocupa pelo menos 1 posição)
- +250 - carga recebida por rodada do carregador
- 1000 - valor inicial
- -400 - se for atingido por um míssil inimigo
- -100 - se tentar mover para posição bloqueada
- +150 - carga recebida por rodada do carregador
1.5. Criação de 2 agentes com "simple-bot.soar":
Com essas regras Soar os tanques tem os comandos básicos para batalhar: ligam radar, encontram-se, disparam mísseis, ligam o escudo.
Execução 2 tanques utilizando regras definidas no arquivo "SimpleBot.soar"