Introdução a Ciência da Computação

Propaganda
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
Download