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 Como funciona? ■ Abaixo temos a anatomia de um robô 3 Sensores do robô ■ 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 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 Sistema de coordenadas ■Ângulos sempre em sentido horário 6 Criando seu primeiro robô ■Para ● ● ● ● criar seu primeiro robô: Robot → Source Editor File → New → Robot Nome do robo: MeuPrimeiroRobo Pacote: ufjf 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) { // nada } public void onBulletMissed(BulletMissedEvent e) { // nada } public void onHitWall(HitWallEvent e) { back(20); } public void onHitRobot(HitRobotEvent e) { // nada } } 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 Melhorando seu robô ■Várias ● ● ● ● ● ● ● ● funções podem ser usadas: 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) { // nada } public void onBulletMissed(BulletMissedEvent e) { // nada } public void onHitWall(HitWallEvent e) { back(20); } public void onHitRobot(HitRobotEvent e) { // nada } } 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) { // nada } public void onBulletMissed(BulletMissedEvent e) { // nada } public void onHitWall(HitWallEvent e) { back(20); } public void onHitRobot(HitRobotEvent e) { // nada } } 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) { // nada } public void onBulletMissed(BulletMissedEvent e) { // nada } public void onHitWall(HitWallEvent e) { back(20); } public void onHitRobot(HitRobotEvent e) { // nada } } 13