ROBOCODE - FASE#1 Carlos Andres Barrios Gonzalez
[email protected] Ing. Huber Flores
Guatemala, Guatemala Universidad de San Carlos de Guatemala Facultad de Ingenier´ıa. Escuela de Ciencias y Sistemas. Junio, 2009
1
Resumen
RoboCode es un simulador de combates entre tanques desarrollado por IBM Alphaworks. Esta escrito en lenguaje java y es open source. El simulador proporciona un API con una serie de objetos y m´etodos para programar el tanque. El jugador debe elegir la mejor estrategia para controlar el tanque y vencer a los dem´ as robots en la arena de combate.
2
Abstract
RoboCode is a robot combat simulator developed by IBM Alphaworks. It is written in java language and it is open source. The simulator provides an API with a series of objects and methods to program the tank. The player should select the best strategy to control the tank and conquer the other robots in the combat arena.
1
3
ROBOCODE - Introducci´ on
Build the best. Destroy the rest Robocode es un entorno gratuito de simulaci´on de guerras de tanques robots, desarrollado por un ex programador de IBM, Mathew Nelson, fan´atico de Java y los robots en Alphaworks de IBM. Los tanques rob´oticos son programados en java y posteriormente son cargados en un simulador donde se desarrolla el combate. Existen dos modos de juego: • Batalla individual: en el que cada robot lucha contra todos los dem´as. • Batalla en equipo: en el que un ej´ercito de robots lucha por la victoria de modo colaborativo. El simulador proporciona un API con una serie de objetos y m´etodos para programar el tanque. El jugador debe elegir la mejor estrategia para controlar el tanque con desplazamientos, giros, control de radar, control de ca˜ n´on y disparo. Adem´ as debe controlar todos los eventos que se producen como ser impactado, detectar a un enemigo, chocar contra una pared, etc. ASPECTOS REALISTAS • Las actuaciones llevan tiempo; mientras rotas te pueden disparar. • Las balas tardan en llegar. • El sensor unidireccional debe apuntar al adversario para verlo. • El ca˜ n´ on se calienta al disparar y debe enfriarse antes del pr´oximo disparo. • Chocar contra los obst´aculos debilita. ASPECTOS NO REALISTAS: • Los sensores y el resto de los componentes son silenciosos. 2
• Los sensores detectan velocidad, posici´on, orientaci´on y energ´ıa restante. • Los combates tienen lugar en un entorno plano 2D y cerrado.
4
ANATOMIA DE ROBOCODE
4.1
TANQUE
Cada robot esta formado de tres partes: • Veh´ıculo • Arma • Radar
Figure 1: Tanque
4.2
ARENA
Se presenta en un plano cartesiano con el origen en la esquina inferior izquierda. • Las coordenadas son expresadas como (x,y). • Siempre son positivas • El origen de coordenadas esta en (0,0)
3
Figure 2: Tanque
5
SINTAXIS Y COMANDOS PARA EL ROBOT
Cada robot se programa en lenguaje Java, la clase que representa al robot debe implementar la clase robot y debe de importar el paquete robocode.* • run():La clase robot de la que heredamos implementa la clase Runnable, por lo que se debe implementar el m´etodo run():Este m´etodo se estar´a ejecutando durante toda la vida del robot. • Cada robot es un thread de java, que responde ante distintos eventos.
4
5.1
METODOS DE LA CLASE ROBOT
• Void ahead(double distance): Mueve el robot hacia delante con la distancia medida en p´ıxeles • Void back(double distance): Se mueve hacia atr´as cierta distancia medida en p´ıxeles • Void doNothing(): Ese turno no realiza acci´on, salta ese turno. • Void fire(double power): Dispara un proyectil • Bullet fireBullet(double power): Dispara un proyectil • double getBattleFieldHeight(): Devuelve la altura del campo de batalla • double getBattleFieldWidth(): Devuelve el ancho • double getEnergy(): Devuelve la energ´ıa actual del robot • double getGunHeading(): Devuelve la orientaci´on del arma en grados, relativo a la posici´ on del tanque • double getHeading(): Devuelve la orientaci´on del tanque en grados • int getOthers(): Retorna la cantidad de oponentes que hay en el campo de batalla • int getNumRounds(): Devuelve la cantidad de rondas que se pelearan. • double getRadarHeading(): Devuelve la orientaci´on del radar en grados • int getRoundNum(): Retorna el round actual • long getTime(): Devuelve el tiempo de juego actual en el round, que es igual al turno actual • double getVelocity(): Devuelve la velocidad del robot medida en p´ıxeles/turno • double getWidth(): Devuelve el ancho del robot medida en pixeles • double getX(): Devuelve la posici´on en el eje x del robot, seg´ un el eje de robocode. • double getY(): Devuelve la posici´on en el eje x del robot, • void setAdjustGunForRobotTurn(boolean independent): Establece que el arma gire independientemente del giro del tanque • void setAdjustRadarForGunTurn(boolean independent): Establece que el radar gire independientemente del giro del arma • void setAdjustRadarForRobotTurn(boolean independent): Establece que el radar gire independientemente del giro del cuerpo del tanque 5
5.2
MOVIMIENTOS DEL ROBOT:
Metodos que cambian la direcci´on y desplazamiento del robot: • turnRight(double degree) • turnLeft(double degree) • ahead(double distance) • back(double distance) • turnGunRight(double degree) • turnGunLeft(double degree) • turnRadarRight(double degree) • turnRadarLeft(double degree) • setAdjustGunForRobotTurn(boolean flag) • setAdjustRadarForRobotTurn(boolean flag) • setAdjustRadarForGunTurn(boolean flag)
5.3
OBTENCION DE INFORMACION:
Metodos para obtener informaci´on: • getX() • getY() • getHeading() • getGunHeading() • getRadarHeading() • getBattleFieldWidth() • getBattleFieldHeight()
5.4
EVENTOS:
• ScannedRobotEvent: se dispara cuando el radar detecta un robot a su paso por una zona angular. • BulletHitEvent: se lanza cuando nuestro robot alcanza con un disparo a uno de los enemigos. • HitRobotEvent: se lanza cuando nuestro robot colisiona con un robot enemigo. 6
• HitWallEvent: se dispara cuando el robot choca contra un muro de los que limitan el campo de batalla. • HitByBulletEvent: se lanza cuando nuestro robot es alcanzado por un disparo. • Clase ScannedRobotEvent: • public double getBearing(): Devuelve el ´angulo (en grados) del enemigo en relaci´ on al ´ angulo que apunta tu tanque/robot. Devuelve valores entre -180o a 180o • public double getDistance(): Devuelve la distancia al enemigo. Clase BulletHitEvent: • public double getEnergy(): Devuelve la energ´ıa restante del adversario descontada. Clase HitRobotEvent: • public double getBearing(): Devuelve el ´angulo (en grados) del enemigo contra el que se ha chocado en relaci´on al ´angulo que apunta tu tanque/robot. • public double getEnergy(): Devuelve la energ´ıa del enemigo tras la colisi´ on. Clase HitWallEvent: • public double getBearing(): Devuelve el ´angulo (en grados) del obst´aculo con el que se colisionaen relaci´on al ´angulo que apunta el tanque/robot. Clase HitByBulletEvent: • public double getBearing(): Devuelve el ´angulo (en grados) del enemigo en relaci´ on al ´ angulo que apunta EL tanque/robot.
7
6
EJEMPLO: Creaci´ on de un Robot
6.1
INSTALACION DE ROBOCODE:
• Descargar robocode de: http://robocode.sourceforge.net/ • Para iniciar la instalaci´on, ejecutar desde consola: java - jar robocode-1.7.1.3-Beta-setup.jar
6.2
CREACION DE UN ROBOT:
• Ejecutar robocode
• En el men´ u ROBOT, seleccionar EDITOR.
8
• En la ventana de ROBOT EDITOR, seleccionar NEW, Robot. • Ingresar el nombre del robot y los datos para generar la clase de java. • Se generara autom´ aticamente el c´odigo para un robot b´asico, en este se deber´ a de programar los movimientos, acciones, eventos, etc del robot.
• Seleccionar en el men´ u Compilar para comprobar el c´odigo del robot.
9
6.3
CREACION DE UNA BATALLA:
• En el men´ u de Robocode, seleccionar BATTLE, New para un nuevo combate.
• Agregar los robots para la batalle y configurar la arena.
10
6.4
ARENA:
Vista de la Arena de Batalla:
Resultados de la Batalla:
7
Conclusiones 1. Robocode es un entorno gratuito de simulaci´on de guerras de tanques robots, desarrollado por un ex programador de IBM, Mathew Nelson. 2. Esta escrito en lenguaje java y es open source. 3. El simulador proporciona un API con una serie de objetos y m´etodos para programar el tanque. 4. Los tanques rob´ oticos son programados en java y posteriormente son cargados en un simulador donde se desarrolla el combate. 5. Existen dos modos de juego: batalla individual y batalla en equipo.
11
6. Cada robot se programa en lenguaje Java, la clase debe implementar la clase robot y debe de importar el paquete robocode.* 7. La clase robot de la que heredamos implementa la clase Runnable, por lo que se debe implementar el m´etodo run().
8
Bibliograf´ıa [1 ]: ”Rock ’em, sock ’em Robocode!”. By Sing Li (
[email protected]). [2 ]: ”http://www.it.uc3m.es/jvillena/” By Julio Villena Rom´an. [3 ]: ”Robocode: un juego para aprender”. By R. Espinola. [4 ]: ”Robocode Argentina” By Robocode Argentina. [5 ]: http://dailaguna.blogspot.com/2008/01/robocode-aprende-java-jugando.html
12