Angry Birds Basic Game Playing Software version1.31 Por: XiaoYu (Gary) Ge, Stephen Gould, Jochen Renz Sahan Abeyasinghe, Jim Keys, Andrew Wang, Peng Zhang Traduzido por: Jacson Rodrigues Correia da Silva Research School of Computer Science The Australian National University 2014-05-06 This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playingsoftware.html Sumário Instalação..............................................................................................................................................1 Instalação do ambiente JAVA..........................................................................................................1 Instalação do Chrome......................................................................................................................1 Instalação do Software.....................................................................................................................1 Instalação do Plugin.........................................................................................................................1 Executando o Software....................................................................................................................2 Server-Client Architecture....................................................................................................................2 Angry Birds Extension.....................................................................................................................3 AI Agent...........................................................................................................................................3 Proxy................................................................................................................................................3 Porta de Comunicação S/C..............................................................................................................3 Módulo Vision.................................................................................................................................3 Obtendo MBRs................................................................................................................................4 Obtendo o Contorno Real (Real Shape)..........................................................................................5 Módulo Trajectory...........................................................................................................................5 O Agente Naive (standalone) – uma demonstração..............................................................................6 Agente Naive...................................................................................................................................6 Jogando com o Agente Naive...............................................................................................................7 Carregando a Janela do Jogo...........................................................................................................7 Executando o Agente Naive.............................................................................................................7 Criando seu próprio Agente Inteligente................................................................................................8 Representação dos Objetos..............................................................................................................8 Tire um Screenshot e Segmente a imagem......................................................................................9 Acessando o estado do Jogo............................................................................................................9 Módulo Trajectory.........................................................................................................................10 Efetuando tiros...............................................................................................................................10 Self-Manage mode....................................................................................................................10 Auto-Arrange mode...................................................................................................................11 Outros métodos úteis..........................................................................................................................11 Obter o tipo de pássaro do estilingue.............................................................................................11 Obter todo o suporte/recursos de um objeto..................................................................................11 Reachability...................................................................................................................................12 Compile utilizando o ANT.................................................................................................................12 1 Instalação Instalação do ambiente JAVA Este framework foi testado com o JAVA6 e superiores. Para checar qual é a versão do java instalada em seu computador, execute o seguinte comando em seu terminal: java -version Você pode efetuar o download do ambiente java deste link: http://www.oracle.com/technetwork/java/javase/downloads/index.html Instalação do Chrome O navegador Chrome pode ser obtido no link: https://www.google.com/chrome/browser/ Instalação do Software Descompacte o arquivo zip com o software. Assumindo que o diretório do software é ./angrybirds/ Você terá os seguintes arquivos/pastas: • A pasta external que contém todas as bibliotecas necessárias. • A pasta src que contém todos os códigos fontes. • A pasta plugin que possui uma extensão para interagir com o Chrome. Instalação do Plugin 1. Abra o Chrome; 2. Vá em: chrome://chrome/extensions/ 3. Clique na caixinha (checkbox) “Modo Desenvolvedor”; 4. Clique no botão “Carregar extensão descompactada...”; 5. Selecione a pasta plugin (que contém o arquivo manifest.json); NOTA: Se os screenshots estão sendo gravados como arquivos PNGs transparentes, faça isso: 1. Abra o Chrome; 2. Vá em: chrome://flags/ 3. Encontre a opção “Desabilitar WebGL” e marque-a. This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 2 Executando o Software Através da linha de comando você pode executar o Agente Naive (veja a seção Executando o Agente Naive), ver em tempo real a segmentação das imagens do jogo (veja seção Módulo Vision) e ver em tempo real a trajetória de saída (veja seção Módulo Trajectory). Server-Client Architecture This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 3 Angry Birds Extension O plugin do chrome interage com o navegador Chrome. Ele oferece funcionalidades, como capturar a janela do jogo, executar ações (ex.: mover o mouse, clicar e modificar o zoom). Para instalá-lo, veja a seção Instalação do Plugin. AI Agent Um agente pode utilizar o módulo vision para analisar os cenários do jogo e o módulo trajectory para planejar os tiros. Embora o jogo seja escrito em Java, o agente pode ser implementado em outras linguagens, como C++, Python, etc. Proxy O servidor interage com a extensão do Angry Birds através do módulo proxy. As mensagens do proxy são: • CLICK: clicar com o botão esquerdo do mouse; • DRAG: arrastar o cursor de um lugar para outro; • MOUSEWHEEL: rolar a rodinha do mouse; • SCREENSHOT: capturar a imagem da janela atual do jogo O agente não precisa de acessar o componente proxy. Porta de Comunicação S/C A porta de comunicação Servidor/Cliente recebe mensagens dos agentes e envia os feedbacks de volta após o servidor executar as ações indicadas pelas mensagens. As mensagens se encaixam nas seguintes categorias: • Mensagens de Configuração; • Mensagens de Consulta (Query); • Mensagens de ação dentro do jogo (In-Game); • Mensagens de seleção de nível. A sintaxe das mensagens pode ser encontrada em /doc/ServerClientProtocols.pdf Módulo Vision O módulo Vision é composto de dois componentes de segmentação de imagem. Um dos componetnes segmenta uma imagem e gera uma lista de Retângulos de Limites Mínimos (MBR) dos objetos essenciais da imagem. Os elementos essenciais incluem {“Sling”, “Red Bird”, “Yellow Bird”, “Blue Bird”, “Black Bird”, “White Bird”, “Pig”, “Ice”, “Wood”, “Stone”, “TNT”, This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 4 “TrajPoints”} (traduzindo: {“Estilingue”, “Pássaro Vermelho”, “Pássaro Amarelo”, “Pássaro Azul”, “Pássaro Preto”, “Pássaro Branco”, “Porco”, “Gelo”, “Madeira”, “Pedra”, “Dinamite”, “TrajPoints”}). O outro componente gera formas reais ao invés de MBRs. Você pode utilizar ambos para processar um screenshot. Obtendo MBRs Geralmente são necessários 100ms para processar o MBR de um cenário. A seguir tem-se um exemplo do resultado da segmentação (MBRs). Para exibir a segmentação em tempo real, você deve executar o aplicativo com o comando: java -jar ABSoftware.jar -showMBR This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 5 Obtendo o Contorno Real (Real Shape) Geralmente são necessários 300–500ms para processar o Contorno Real. Além dos objeto essenciais, essa segmentação de imagem pode reconhecer colinas e o chão. Colinas são os obstáculos da cor marrom escuro que não serão afetados ou destruídos por objetos do jogo. A seguir tem-se um exemplo do resultado da segmentação (Real Shape). Para mostrar essa segmentação, você deve executar o aplicativo com o comando: java -jar ABSoftware.jar -showReal Módulo Trajectory O módulo Trajectory estima a trajetória que o pássaro seguirá dado um particular ponto de lançamento (relativo ao tiro do estilingue). Nós utilizamos uma constante de velocidade para todos os tiros do mesmo nível e utilizamos o ponto de lançamento e a localização do estilingue para determinar o ângulo de lançamento a. Com isso, nós podemos computar as velocidades horizontais e verticais como v cos(a) e v sen(a), respectivamente. Com as velocidades iniciais em mãos, nós utilizamos as leis físicas clássicas de Newton para estimar a o caminho parabólico que o pássaro vai seguir. A função predictTrajectory dentro do módulo Trajectory retorna uma lista de pontos que o pássaro vai seguir dado um certo ponto de lançamento. Para facilitar o planejamento dos tiros, o módulo Trajectory fornece uma função (chamada estimulateLaunchPoint) para estimar o ponto de lançamento a partir do fornecimento de um destino desejado (por exemplo, o centro de um dos porcos detectados). A função utiliza a seguinte equação para calcular o ângulo: θ=arctan ( v 2±√ v 4 −g( gx 2+2 yv 2 ) gx ) This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 6 Onde (x,y) são as coordenadas normalizadas do ponto de destino relativos ao estilingue (utilizando o tamanho do estilingue como escala) e a gravidade g é definida como 1 unidade. Dois ângulos são obtidos dessa equação e a função retorna dois pontos de lançamento correspondentes em um ArrayList de Points. Note que quando um tiro é fabricado, o ângulo atual de lançamento a é sempre um pouquinho diferente do arco tangente do vetor de lançamento e a diferença varia de nível para nível. Da mesma forma, as velocidades normalizadas são um pouquinho diferentes entre os níveis. A variação no ângulo e na velocidade são levados em conta na predição das trajetórias e nos pontos de lançamento. O módulo trajectory provê um método (adjustTrajectory) para ajustar essas duas mudanças utilizando a informação do último tiro, de modo que a precisão dos tiros seguintes é melhorada. Observe também que devido as variações no nível do pixel no local do estilingue, pássaro e efeitos devido à escala, os caminhos estimados pelo módulo Trajectory são somente aproximados. Os Agentes devem devem levar isso em conta quando planejam seus tiros. Para mostrar a segmentação em tempo real, você pode executar o aplicativo com o comando: java -jar ABSoftware.jar -showTraj Exemplo da saída: O Agente Naive (standalone) – uma demonstração Agente Naive O Agente Naive foi criado para demonstrar como construir um agente baseado nos módulos providos, nomealmente, o plugin do Chrome, o módulo vision e o módulo trajectory. O agente naive é chamado “naive” (tradução: tolo) por que ele dispara o pássaro diretamente no porco sem raciocínio algum. O código pode ser encontrado em: /src/ab/demo/NaiveAgent.java This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 7 Jogando com o Agente Naive Carregando a Janela do Jogo Para carregar a janela do jogo, faça: 1. Abra o Chrome; 2. Maximize a janela do navegador; 3. Digite “http://chrome.angrybirds.com/” na barra de endereços e pressione ENTER; 4. Selecione versão SD e clique em Play; 5. Selecione o episódio POACHED EGGS e permaneça na página de seleção de níveis. (Página de seleção de níveis) Por favor, mantenha a aba do jogo visível. Você não precisa de manter a janela do navegador na frente das outras janelas. Por exemplo, você pode minimizar a janela do navegador após carregar o jogo, mas garantindo que a aba do jogo esteja selecionada. Executando o Agente Naive Para executar o Agente Naive, faça: 1. Carregue o jogo no Chrome (veja seção Carregando a Janela do Jogo); 2. Abra o terminal (janela de comandos); 3. Vá ao diretório do jogo; 4. Então, execute no terminal o comando: java -jar ABSoftware.jar -na [1-21] substituindo [1-21] pelo nível que você desejar. O nível inicial é 1 por padrão. Ex.: “java -jar ABSoftware.jar -na 2” começará o agente Naive no nível 2. Obsercação: Você não pode acessar um nível antes de desbloqueá-lo. This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 8 Criando seu próprio Agente Inteligente Representação dos Objetos Para cada objeto de um screenshot, o módulo vision criará um objeto java sobre ele. Este objeto é especificado dentro do ABObject.java que estende java.awt.Rectangle. A classe ABObject tem quatro atributos principais: x e y da coordenada do canto superior esquerdo, width (largura) e height (altura). A classe ABObject tem um atributo indicando o tipo de objeto de um objeto do jogo. Os tipos de objetos são: {“Hill”, “Sling”, “Red Bird”, “Yellow Bird”, “Blue Bird”, “Black Bird”, “White Bird”, “Pig”, “Ice”, “Wood”, “Stone”, “TNT”} (traduzindo: {“Colina/Morro”, “Estilingue”, “Pássaro Vermelho”, “Pássaro Amarelo”, “Pássaro Azul”, “Pássaro Preto”, “Pássaro Branco”, “Porco”, “Gelo”, “Madeira”, “Pedra”, “Dinamite”}). O atributo “hollow” indica se um objeto está com cavidade (tem um buraco no meio) ou não. Observação: A segmentação MBR não distingue entre objetos com cavidade e objetos sólidos. Nós classificamos as formas dos objetos do jogo em três grupos: Circle (círculo), Rect (retângulo) e Poly (polígono) (referem-se a /src/ab/vision/real/shape). Há uma classe java correspondente para cada grupo e as classes javas estendem o ABObject.java, mantendo assim todos os métodos e atributos do ABObject. • • Circle: representa uma fórmula circular do centro do círculo e do raio. Rect: representa um retângulo de um ângulo arbitrário. Além dos quatro atributos que especificam a MBR, a classe Rect representa o desenho real de um retângulo, possuindo mais três atributos: pwidth, plength e angle. O pwdith e o plength abrigam o tamanho do menor e do maior borda respectivamente. • Poly: representa um polígono utilizando java.awt.Polygon. Triângulos são representados assim. This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 9 Tire um Screenshot e Segmente a imagem É muito simples tirar um screenshot e segmentá-lo. O seguinte fragmento de código exibe o processo. //Start the game proxy ActionRobot aRobot = new ActionRobot(); //Capture an Image BufferedImage screenshot = aRobot.doScreenShot(); // Initialize the vision component Vision vision = new Vision(screenshot); // Get a list of MBRs of all the pigs in the screenshot List<ABObject> pigsMBR = vision.findPigsMBR(); // Get a list of real shapes of all the pigs in the screenshot List<ABObject> pigsReal = vision.findPigsRealShape(); Como pode ser visto do código, nós fornecemos uma visão macro (veja /src/ab/vision/Vision.java) que gerencia os dois componentes de segmentação. O método findPigsRealShape() utiliza a segmentação com contorno real para obter a lista de porcos enquanto o método findPigsMBR() utiliza a segmentação MBR. Sob os componentes de segmentação ocorre o reconhecimento de todas as categorias de objetos. A segmentação MBR não detecta a colina/morro enquanto a segmentação com contorno real não reconhece o TNT. Então, o método findTNTs() utiliza a segmentação MBR e o método findHills() utiliza a segmentação com contorno real (real-shape). Acessando o estado do Jogo Há cinco estados principais do jogo: 1. “WON”: uma página mostra o placar final e as estrelas que você ganhou. 2. “LOST”: um grande porco fala que você perdeu. 3. “PLAYING”: o jogo ainda não acabou. 4. “LEVEL SELECTION”: a página de seleção de níveis. 5. “LOADING”: o jogo está sendo carregado neste momento e uma barra de progresso é apresentada sobre a página. Por favor, consulte /src/ab/vision/GameStateExtractor.java para detalhes. This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 10 Módulo Trajectory Uma vez que você sabe seu objetivo, você precisa do módulo trajectory para planejar os tiros. Para obter o conjunto de pontos de lançamento estimados dados para um objetivo (destino), você pode chaamar o método estimateLaunchPoint(Rectangle, Point). Este método necessita do MBR do estilingue e to ponto de destino. //Initial a trajectory planner TrajectoryPlanner tp = new TrajectoryPlanner(); //Get the estimated points List<Point> pts = tp.estimateLaunchPoint(sling, target); Por favor, consulte /src/ab/planner/TrajectoryPlanner.java para detalhes. Efetuando tiros Um Tiro (Shot) contém seis parâmetros (x, y, dx, dy, t_shot, t_tap). Os primeiros quatro parâmetros especificam o caminho do mouse de (x,y) à (x+dx, y+dy). T_shot é o tempo que o pássaro será colocado para ser lançado. T_tap especifica o intervalo entre o tempo de liberação e o tempo de tocar na tela (clicar) após isso. O tempo é mensurado em milissegundos. Você pode submeter uma lista de tiros ao servidor e ele pode executar um por um de acordo com a ordem. Mais detalhes sobre efetuar tiros podem ser vistos na seção Mensagens das Ações Dentro do Jogo, em ServerClientProtocols.pdf (Pode ser encontrado no diretório “doc”). Self-Manage mode Digamos que você deseja atirar dois pássaros seguindo as correspondentes instâncias de tiro: 1) Shot (x,y,dx,dy, 5000,2000); 2) Shot (x,y,dx,dy, 13000,5000); Você pode passar os dois tiros ao servidor e ele seguirá a seguinte linha do tempo: 5000 7000 13000 18000 (shot 1) (tap 1) (shot 2) (tap 2) > Tempo Observação> t_tap especifica o intervalo entre o lançamento e o tempo correspondente ao tapping (que é o ato de bater na tela após o lançamento para ativar a característica do pássaro). Quando você especificar o tempo do tiro (shot), por favor tenha atenção que: 1) Evite fazer um tiro (shot) e um tap ao mesmo tempo. Ex.: Os seguintes tiros estão com conflito: Shot (x,y,dx,dy, 5000,3000); Shot (x,y,dx,dy, 8000,5000); This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 11 2) No jogo, há um intervalo entre dois tiros. Você não pode atirar um pássaro imediatamente após o outro tiro. O intervalo é de aproximadamente 5 segundos. Então, por favor, ajuste o t_shot e assegure-se que o tempo entre dois tiros é maior que 5000. 3) O tempo do tap do primeiro tiro não pode ser após atirar o segundo pássaro. Auto-Arrange mode Nós fornecemos outra forma conveniente de atirar os pássaros. Isso pode ser utilizado se você não quiser se importar sobre o tempo exato. Nós podemos organizar o tempo de tiro para você. Basta definir o t_shot de cada tiro da sequẽncia como 0 (zero). Por exemplo: 1) Shot (x,y,dx,dy, 0,3000); 2) Shot (x,y,dx,dy, 0,5000); O primeiro tiro será feito no tempo 0 (zero) e o segundo tiro será feito no tempo 5000. Além disso, o primeiro tap ocorre no tempo 3000 + 0 = 3000 e o segundo tap ocorre no tempo 5000 + 5000 = 10000. Observe que se você quer que o servidor organize os tiros para você, você terá que garantir que todos os campos t_shot serão definidos para 0 (zero) na sequência de tiros desejada. O servidor tratará a seguinte sequência com conflitos como auto-gerida: 1) Shot (x, y,dx,dy, 0,3000); 2) Shot (x,y,dx,dy, 0,5000); 3) Shot (x,y,dx,dy, 10000,5000); Outros métodos úteis Obter o tipo de pássaro do estilingue Você pode obter o tipo de pássaro do estilingue utilizando o método getBirdTypeOnSling() (veja /src/ab/demo/other/ActionRobot.java). Este método fará um zoom no estilingue, obterá um screenshot e segmentará a imagem para obter a lista de pássaros. O método então ordenará a lista para encontrar o pássaro mais alto e retornará o tipo desse pássaro. Obter todo o suporte/recursos de um objeto O método isSupport(ABObject o1, ABObject o2) (veja /src/ab/utils/ABUtil.java) retornará verdadeiro se o1 suporta o2. O método determina a relação dos objetos checando se a borda superior do MBR de o1 está situada na região de suporte (apresentada como o retângulo pontilhado da figura a seguir) do MBR do o2. This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva 12 A região de suporte é o retângulo com o (x,y, width, height) como (o2.x – intervalo, o2.y + o2.height – intervalo, intervalo * 2 + o2.width, intervalo * 2). O intervalo é ajustável. Na figura, o intervalo é de 5px. O método getSupporters(ABObject o2, List<ABObject> objs) retorna uma lista contendo um subconjunto de objs que suportam o2. Como você percebeu, este método não é compatível com o suporte de retângulos angulares. Você terá que fazer sua própria estratégia para realizar uma checagem disso. Reachability O método isReachable(Vision vision, Point target, Shot shot) (veja /src/ab/utils/ABUtil.java) retorna true se o ponto (target/destino/alvo) é alcançavel (sem obstruções) pelo tiro (shot). O método primeiro obtém uma lista de todos os pontos da trajetória de um tiro e guarda (preserva) aqueles que estão a esquerda do alvo. Tipo assim: a coordenada x do ponto é menor que o algo. Então, o método checa se qualquer um dos pontos contidos no MBR de qualquer bloco (madeira, gelo e pedra), ou se tem um RGB similar a cor de uma colina/morro. O método retorna true (alcançavel) quando estes pontos não existem. Você pode também desenvolver sua própria estratégia para determinar a alcançabilidade do pássaro. Compile utilizando o ANT Você pode utilizar o ANT para compilar o código fonte pela linha de comando. Ant é uma biblioteca Java e uma ferramenta em linha de texto que possui a missão de direcionar o processo descrito nos arquivos de compilação (build), compilando as dependências e gerando o resultado almejado. Para mais informações, acesse: http://ant.apache.org/ Você pode efetuar o download do ANT em: http://ant.apache.org/manualdownload.cgi É necessário ter o ANT 1.7 ou superior. Para compilar o código fonte, vá ao diretório do software e execute: ant compile Para gear o executável “jar”, execute: ant jar This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and can be accessed via http://www.aibirds.org/basic-game-playing-software.html. It was translated by: Jacson RC Silva