Está en la página 1de 21

Robocode

Javier Villegas Gómez


Contenido

- Anatomía de un Robot
- Mi primer Robot
- Física del juego
- Puntuaciones
- Un vistazo a la API
- Ejercicio 1
- Ejercicio 2
- Manejando Eventos
- Ejercicio 3
- Ejercicio 4
- Ejercicio 5
Anatomía de un Robot

-Cuerpo: Permite el movimiento del robot e incorpora el


cañón y el radar.

- Cañon: Apuntar y disparar.

- Radar: Detecta enemigos, a no ser


que se le diga lo contrario sigue el movimiento del cañón.
Mi primer robot

Robot/Editor/File/New Robot public void


onScannedRobot(ScannedRobotEvent e) {
Nombre y carpeta. fire(1);
package man;
}
import robocode.*;
}
public class MyFirstRobot extends Robot {

public void run() {

while (true) { Por último guardar y


ahead(100); compilar
turnGunRight(360); (Compiler/Compile)
back(100);

turnGunRight(360);

}
Física del Juego

-Coordenadas:
Sistema Cartesiano (x,y)
x = Anchura
y = Altura
-Dirección:
Se mide en grados

0/360 grados = Norte


90 grados = Este
180 grados = Sur
270 grados = Oeste
Física del Juego

-Tiempo y distancia:
El tiempo (t) se mide en "ticks". 1 tick = 1 turno
La distancia se mide en pixeles de precisión doble, es decir, un robot
se puede mover incluso una fracción de pixel.

- Movimiento del robot:


Aceleración(a): Un robot acelera a 1 pixel/turno y decelera a 2
pixeles/turno
Velocidad(v): v = at. La velocidad máxima son 8 pixeles/turno
Distancia(d): d = vt
Física del Juego

- Rotación del robot, cañón y radar:


Rotación del robot: (10 - 0,75*(velocidad)) grados/turno
Cuanto más rápido te muevas, más lento giras.
Rotación del cañón: 20 grados/turno. Se le añade a la rotación del
robot.
Rotación del radar: 45 grados/turno. Se le añade a la rotación del
cañón.

-Colisiones:
Con otro robot: Cada robot recibe 0,6 de daño
Con un muro: velocidad * 0,5 -1 (nunca menor que 0)
Física del Juego

- Balas:
Potencia del disparo: minimo = 0, maximo = 3.
Daño: 4 * potencia. Sí potencia > 1, se le suma 2*(potencia -1)
Velocidad: 20 - 30*potencia
Sobrecalentamiento: 1 + potencia / 5. Igual a 0 para disparar.
Disparar consume la potencia del disparo de tu propia energía.
Energía restaurada por impacto: 3 * potencia
Puntuaciones
Esta es la tabla de puntuaciones al terminar el juego:

- Total Score: La suma de todas las puntuaciones


- Survival Score: Cada robot vivo, gana 50 puntos por cada robot que muere
- Last Survival Bonus: El último robot vivo, gana 10 puntos por cada robot muerto antes
que el.
- Bullet Damage: 1 punto por cada punto de daño realizado a los enemigos
- Bullet Damage Bonus: Cuando matas un enemigo ganas un 20% de todo el daño que
le ha hecho.
- Ram Damage: 2 puntos por cada punto de daño realizado con impactos
- Ram Damage Bonus: Cuando matas un enemigo por impacto, ganas un 30% de todo el
daño que le has causado.
Un vistazo a la API
Funciones de la clase Robot: http://robocode.sourceforge.net/docs/robocode/
- void ahead (double distancia): Mueve el robot hacia adelante(a donde apunte).
- void back (double distancia): Lo mismo, pero hacia atrás.
- void fire (double potencia): Dispara con la potencia especificada.
- double getHeading(): devuelve la dirección a la que apunta el robot(en grados)
- double getX()/ double getY(): Devuelve la posición X (ancho) o Y(alto)
- void turnGunLeft(double grados): gira el cañón a la izquierda
- void turnGunRight(double grados): gira el cañon a la derecha
- void turnLeft(double grados): gira el robot a la izquierda
- void turnRight(double grados): gira a la derecha
- void turnRadarLeft(double grados): gira el radar a la izquierda
- void turnRadarRight(double grados): lo gira a la derecha
Un vistazo a la API

Seguimos con la clase Robot:


- void setAdjustGunForRobotTurn(boolean independiente)
- void setAdjustRadarForRobotTurn(boolean independiente)
Estas dos funciones hacen que el cañón o el radar se vuelvan independientes del
movimiento del robot, es decir, si el robot gira, el cañón/radar no gira.
- void setAdjustRadarForGunTurn(boolean Independiente): hace que el Radar sea
independiente del cañón.

- void scan(): vuelve a comprobar si detecta un robot (usada en la función


onScannedRobot hace que esta comience a ejecutarse de nuevo)
Un vistazo a la API

Eventos:

- void run(): Es el método principal, en el se ejecutan los movimientos básicos del robot

-void onScannedRobot(ScannedRobotEvent event): se llama cuando el radar detecta a


otro robot
- void onHitByBullet(HitByBulletEvent event): esta función se llama cuando el robot
recibe un impacto de bala.
- void onHitRobot(HitRobotEvent event): esta se llama cuando chocamos con un robot
- void onHitWall(onHitWallEvent event): se llama cuando el robot choca contra un muro
Ejercicio 1

- Robot kamikaze: Gira hasta que detecta un enemigo y cuando lo hace


se lanza a por él, y cuando choca comienza a disparar con la máxima
potencia.
Ejercicio 2

- Robot que avance hasta el muro superior y una vez llegue se desplace
a la derecha hasta que choque y se dé la vuelta, y así sucesivamente, el
cañón apuntará hacia abajo, para que dispare siempre que detecte un
enemigo.
Manejando eventos

En las funciones que reciben un evento como parámetro de entrada, podemos acceder a
los elementos de dicho evento para obtener información que nos pueda resultar
relevante, por ejemplo:
Clase HitRobotEvent
- double getBearing(): Devuelve la orientación del robot con el que hemos chocado, con
respecto a nosotros (-180 < getBearing < 180)
-double getEnergy(): Devuelve la energía del robot con el que chocamos
-boolean isMyFault(): Devuelve verdadero si hemos provocado el choque

Clase HitByBulletEvent
- double getBearing()
- double getPower(): Devuelve la potencia de la bala
- double getVelocity(): Devuelve la velocidad de la bala
Manejando eventos

El evento más usado, ya que es el que más posibilidades ofrece y donde se pueden
realizar más cálculos.

Clase ScannedRobotEvent
- double getHeading(): devuelve la orientación del robot detectado, en grados (0 <
getHeading < 360)
- double getBearing()
- double getDistance(): devuelve la distancia con el robot detectado
- double getEnergy(): devuelve su energía
- double getVelocity(): devuelve la velocidad del robot
Ejercicio 3

- Robot que dispare con más o menos fuerza (y por lo tanto menos o
más velocidad) según la distancia a la que esté el enemigo, asi como si
este se esta moviendo o no (si no se mueve podemos disparar más
lento). Además debemos tener en cuenta la energía del enemigo, si es
muy poca (menor de 3) no es conveniente desperdiciar energía con un
disparo de potencia mayor.
Ejercicio 4

- Igual que el ejercicio 3, pero además nuestro robot debe detectar la


dirección en la que se mueve el enemigo para girar el cañón en dicha
dirección.
Nota: no es necesario realizar cálculos complejos, basta con estimar a
ojo por donde estará el enemigo.
Ejercicio 5

- Mejora del kamikaze (ejercicio 1): vamos a reutilizar el robot que


realizamos en el primer ejercicio, pero esta vez controlaremos que el
robot solo avance lo necesario cuando embista a un enemigo, y que
además detecte si el golpe lo da o lo recibe, y en el caso de que lo
reciba se gire en la dirección en la que está el enemigo, y haga lo mismo
cuando le impacte una bala.

Pista: La función double getBearing() puede sernos muy útil, pues nos
da la orientación de nuestro enemigo, pero con respecto a nuestra
propia orientación.
Y ahora...

¡A COMBATIR!
Muchas gracias por vuestra atención!!
Este programa ha sido realizado con fi nanciación del Proyecto de Mejora Docente "Consolidación
de los conocimientos de programación mediante el desarrollo de videojuegos: una experiencia en el
año de Turing" (código AAA_13_019) de la Convocatoria de Actuaciones Avaladas para la Mejora
Docente, Formación del Profesorado y Difusión de Resultados de la Unidad de Innovación Docente
de la Universidad de Cádiz, Curso 2012/2013, cuyos fondos proceden de la Consejería de
Economía, Innovación, Ciencia y Empleo de la Junta de Andalucía.

También podría gustarte