Introdução a Ciência da Computação RoboCode Professor: Jairo de Souza / DCC-UFJF 1
Introdução Aplicativo para implementação de estratégia de jogos Cenário: Um campo de batalha entre robôs Para baixar: http://robocode.sourceforge.net/ 2
Abaixo temos a anatomia de um robô Como funciona? 3
O que o robô pode fazer? Pode se movimentar o corpo ou o canhão Pode atirar Pode identificar um inimigo mas só se o canhão estiver apontando pra ele! Sabe se foi atingido por um tiro inimigo Sabe se seu tiro atingiu ou não um inimigo Sabe se bateu no chassi de outro inimigo Sabe se bateu ou não numa parede/muro Sensores do robô 4
Código inicial package Robo1; import robocode.*; import java.awt.color; public class Robo1 extends Robot { public void run() { // A inicialização do robô deve ser colocada aqui e seu código básico também public void onscannedrobot(scannedrobotevent e) { // O que o robô vai fazer quando estiver com outro na mira public void onhitbybullet(hitbybulletevent e) { // O que o robô vai fazer quando for atingido por um tiro public void onbullethit(bullethitevent e) { // O que o robô vai fazer quando seu tiro atinge um robô public void onbulletmissed(bulletmissedevent e) { // O que o robô vai fazer quando o tiro disparado errou o alvo public void onhitwall(hitwallevent e) { // O que o robô vai fazer quando bater um uma parede public void onhitrobot(hitrobotevent e) { // O que o robô vai fazer quando seu robô colide com outro robô 5
Ângulos sempre em sentido horário Sistema de coordenadas 6
Para criar seu primeiro robô: Robot Source Editor File New Robot Nome do robo: MeuPrimeiroRobo Pacote: ufjf Criando seu primeiro robô 7
Criando seu primeiro robô package ufjf; import robocode.*; import java.awt.color; public class MeuPrimeiroRobo extends Robot { public void run() { while(true) { ahead(100); turngunright(360); back(100); turngunright(360); public void onscannedrobot(scannedrobotevent e) { fire(1); public void onhitbybullet(hitbybulletevent e) { back(10); public void onbullethit(bullethitevent e) { public void onbulletmissed(bulletmissedevent e) { public void onhitwall(hitwallevent e) { back(20); public void onhitrobot(hitrobotevent e) { 8
Batalhando Vamos criar uma batalha pra entender o comportamento do seu robô: Atenção: se alterar o código do robô, lembre-se de compilar o código antes de começar a batalha! Battle New Escolha os robôs MeuPrimeiroRobo e Crazy Veja eles batalhando... Repare: Cada tiro disparado pelo seu robô consome uma unidade de energia O robô vai pra frente e pra trás e gira o canhão 360 graus (código em run()) Quando vê o inimigo, atira. Se for atingido pelo tiro, retrocede. 9
Várias funções podem ser usadas: Melhorando seu robô fire(int): quando maior o valor, maior o dono e maior o gasto de energia do robô turnradarleft(double) e turnradarright(double) getbearing(): pega o ângulo do robo escaneado (em relação ao seu robô) getdistance(): pega a distância do robô escaneado (em relação ao seu robô) e.getenergy(): retorna quanto de energia tem o adversário getenergy(): retorna a energia do seu robô E pode programar igual C: variáveis, if, for, while, etc. Dica: quando usar uma função com e. na frente, você está consultando dados do inimigo. Quando não tiver o e. você está consultando dados do seu robô. Exemplo: e.getenergy() vs getenergy() 10
Modificando: só atira se valer a pena package ufjf; import robocode.*; import java.awt.color; public class MeuPrimeiroRobo extends Robot { public void run() { while(true) { ahead(100); turngunright(360); back(100); turngunright(360); public void onscannedrobot(scannedrobotevent e) { if(e.getdistance() < 250) { fire(3); public void onhitbybullet(hitbybulletevent e) { back(10); public void onbullethit(bullethitevent e) { public void onbulletmissed(bulletmissedevent e) { public void onhitwall(hitwallevent e) { back(20); public void onhitrobot(hitrobotevent e) { 11
Modificando: robô perseguidor de tiros package ufjf; import robocode.*; import java.awt.color; import static robocode.util.utils.normalrelativeangledegrees; public class MeuPrimeiroRobo extends Robot { public void run() { while(true) { turngunright(10); public void onscannedrobot(scannedrobotevent e) { if(e.getdistance() < 250) { fire(3); public void onhitbybullet(hitbybulletevent e) { turnright(e.getbearing()); ahead(50); public void onbullethit(bullethitevent e) { public void onbulletmissed(bulletmissedevent e) { public void onhitwall(hitwallevent e) { back(20); public void onhitrobot(hitrobotevent e) { 12
Modificando: robô perseguidor de robôs package ufjf; import robocode.*; import java.awt.color; import static robocode.util.utils.normalrelativeangledegrees; public class MeuPrimeiroRobo extends Robot { public void run() { while(true) { turngunright(10); public void onscannedrobot(scannedrobotevent e) { if(e.getdistance() < 250) { fire(3); double distancia = e.getdistance(); double angulo = e.getbearing(); turnright(angulo); ahead(distancia/2); public void onhitbybullet(hitbybulletevent e) { turnright(e.getbearing()); ahead(50); public void onbullethit(bullethitevent e) { public void onbulletmissed(bulletmissedevent e) { public void onhitwall(hitwallevent e) { back(20); public void onhitrobot(hitrobotevent e) { 13