Aprender a programar en Java es más divertido con este motor avanzado de simulación sobre batalla de robots
Robocode es un simulador de batalla de robots fácil de utilizar que funciona a través de todas las plataformas que soporten Java 2. Creas un robot, lo ponés sobre un campo de batalla, y lo dejas luchar contra otros robots creados por otros competidores. Robocode viene con un conjunto de robots prefabricados para comenzar a practicar, pero una vez que los derrotes, puedes incorporar tu creación contra cualquiera de los robots de las ligas que son formadas por todo el mundo.
Cada participante de Robocode crea su propio robot usando los elementos del lenguaje de Java, permitiendo una amplia gama de desarrolladores -- desde principiantes a los hackers avanzados -- participar en la diversión. Los Principiantes en Java que comienzan a programar pueden aprender los fundamentos: llamando el código del API, leyendo Javadocs, herencia, clases internas, el acontecimiento que dirige, y similares. Los desarrolladores avanzados pueden templar su habilidad de programación en un desafío global para construir el mejor robot utilizando incluso fundamentos de IA.
En este artículo, te introduciremos a Robocode y te guiaremos en la construccion de tu primer robot de Robocode.
Descargando e Instalando Robocode
Robocode es creacion de Mathew Nelson, Ingeniero en Software en Tecnologia Avanzada, División de Internet en IBM.
Primero, Aquí encontrarás los executables más nuevos del sistema de Robocode. Una vez que hayas descargado la distribución, que está en un archivo autónomo de la instalación, puedes utilizar el comando siguiente para instalarlo en tu sistema (si se asume que tienes una Java VM (JDK 1.3.x) instalada previamente en tu máquina, por supuesto):
java -jar robocode-setup.jar |
Durante la instalación, Robocode te preguntará si quisieras utilizar esta Java VM para las compilaciones de los robots. La otra alternativa es el recopilador de Jikes que se provee como parte de la distribución de Robocode. Después de tu instalación, puedes comenzar el sistema de Robocode del shell script (robocode.sh), del archivo (robocode.bat), o del icono en el tablero del escritorio. A este punto, el campo de batalla aparecerá. De aquí, puedes invocar al editor y al compilador de los robots que usa el menú.
Instalación y presentación del entorno.
Para instalar el programa solo tenemos que hacer java –jar robocode-setup-1.2.6.
Si queremos cambiar el directorio de instalación solo tenemos que pulsar en la opción no e introducir el directorio deseado. Después basta seguir los sencillos pasos. Si no contamos con ningún editor el programa instalará su propio editor, aunque posteriormente podemos cambiarlo en la Option-Preferences-Development Options.

Una vez ejecutemos el programa nos encontramos un menú superior con las siguientes opciones:

En el menú battle tenemos las siguientes funciones:
New para iniciar nuevas batallas.
Open para abrir ficheros de batallas.
Save y Save as para guardar las batallas.
Exit para salir del programa.
En la opción robot tenemos el editor de robots, de equipos y la posibilidad de importar nuevos robots.
En options presenta las opciones preferentes donde podemos configurar todo lo referente a la configuración grafica y de sonido. También tenemos la función para ver el ranking de cómo van las batallas.
En la opción help tenemos el típico menú con preguntas frecuentes sobre el programa, la versión, los desarrolladores…
En la parte inferior tenemos un menú que nos permite controlar las batallas con opciones como stop, restart, replay, pause, next turn (para ir paso a paso) y un menú deslizante que nos permite controlar la velocidad en la que se desarrolla la lucha.
Otra Forma de Instalacion
Descomprimir el archivo jar con un descompresor (winzip o winrar), luego descomprimir el nuevamente el archivo extract y por ultimo ejecutar el archivo robocode.bat
Componentes del sistema de Robocode
Cuando inicias Robocode, verás dos ventanas correlacionadas del GUI, que forman el IDE de Robocode:
El campo de batalla
El editor del robot
El cuadro 1 demuestra el campo de batalla y el editor de robots.

El Battlefield es donde ocurren las batallas entre los robots. Contiene el motor principal de la simulación y permite que crear, guardar, y abrir nuevas o existentes batallas. Pueden detenerse batallas e iniciarse mas tarde, terminar la batalla, destruir cualquier robot individual, o conseguir la estadística de cualquier robot usando los controles disponibles en la arena. Además, puedes activar el editor de robots desde esta pantalla. El editor de robots es un editor de textos modificado con requisitos particulares para corregir los archivos fuente de Java que componen un robot. Integra al compilador de Java (para el código de compilación de robots) y el paquete de librerias de Robocode. Cualquier robot creado con el editor y compilado con éxito está en una posicion de ejecucion para el campo de batalla. Un robot en Robocode consiste en unas o más clases de Java. Estas clases se pueden archivar en un paquete JAR. La ultima versión de Robocode proporciona a “empaquetardor de robots” que puede ser activado dedes la ventana del GUI del campo de batalla.
La anatomía de un robot de Robocode
A la hora de esta escritura, un robot de Robocode es un tanque gráfico.
El cuadro 2 ilustra un robot típico de Robocode.
Observar que el robot tiene un arma que rota, y encima del arma ademas hay un radar que gira. El vehículo del robot, el arma, y el radar pueden rotar independientemente.
Por defecto, estos partes estan alineadas, hacia el frente en la dirección del movimiento del vehículo.
Comandos de los robots
El sistema de los comandos para un robot de Robocode se encuentra documentado en el Javadoc del Robocode API. Los encontrarás como métodos públicos del robocode. Clase de los robots. En esta sección, cubriremos cada uno de los metodos disponibles, por categoría. Movimientos del robot, del arma, y del radar.
Moviendo el robot, el arma y el radar
Comencemos con los comandos básicos de movemiento del robot:
- turnRight(double degree) y turnLeft(double degree) gira el robot hacia un grado especifico.
- ahead(double distance) y back(double distance) mover el robot a la distancia especificada en pixel; se finalizan estos dos métodos si el robot golpea una pared u otro robot.
- turnGunRight(double degree) y turnGunLeft(double degree) gira el arma independientemente del la direccion del vehiculo.
- turnRadarRight(double degree) y turnRadarLeft(double degree) gira el radar independientemente del arma y del vehiculo.
Ningunos de estos comandos volverán el control al programa hasta que finalicen. Además, cuando se da vuelta el vehículo, la dirección del arma (y del radar) también se moverá, a menos que se indique especificamente llamando a los métodos siguientes:
- setAdjustGunForRobotTurn(boolean flag): Si esta bandera esta puesta en verdadero, el arma permanecera en la misma direccion mientras el vehiculo gira.
- setAdjustRadarForRobotTurn(boolean flag): Si la bandera esta en verdadero, el radar permanecera en la misma direccion mientras el vehiculo (y el arma) gira.
- setAdjustRadarForGunTurn(boolean flag): Si la bandera esta en verdadero, el radar permanecera en la misma direccion mientras el arma gira, esta tambien actua si el metodo setAdjustRadarForRobotTurn(verdadero) ha sido invocado.
Obteniendo información del Robot
Muchos métodos existen para conseguir información sobre el robot. Aquí está una lista corta de los metodos usados con mas frecuencia:
- getX() y getY() obtiene las coordenadas del robot.
- getHeading(), getGunHeading(), y getRadarHeading() obtiene la direccion actual del vehiculo, el arma y el radar en grados.
- getBattleFieldWidth() y getBattleFieldHeight() obtiene las dimensiones del campo de batalla.
Comandos de Disparo
Una vez que hayas dominado cómo mover el robot y su armamento, es un buen momento para considerar las tareas de disparo y daño. Cada robot comienza por defecto con un “nivel de energía,” y se considera destruido cuando su nivel de energía baja a cero. Cuando se realiza el disparo, el robot puede utilizar hasta tres unidades de energía. Más energía proveída al disparo, más daño infligirá en el robot contrario.
fire(double power) and fireBullet(double power) son utilizados para disparar una bala con una energia especifica (fire power).
Eventos
Siempre que el robot se mueva o de vueltas, el radar siempre esta activo, y si detecta algun robot dentro de su rango, un evento es disparado. Como el creador del robot, puedes elegir que ocurran varios acontecimientos durante la batalla. La clase básica (Robot) tiene por defecto varios acontecimientos. Sin embargo, puedes sobreescribir algunos de estos metodos poner tus propias acciones en ejecución. Aquí están algunos de los acontecimientos usados con más frecuencia:
- ScannedRobotEvent: maneja el ScannedRobotEvent sobreescribiendo el metodo onScannedRobot() este metodo es llamado cuando el radar detecta un robot.
- HitByBulletEvent. maneja el HitByBulletEvent sobreescribiendo el metodo onHitByBullet() este metodo es llamado cuando el robot es golpeado por una bala.
- HitRobotEvent. maneja el HitRobotEvent sobreescribiendo el metodo onHitRobot()este metodo es llamado cuando el robot golpea a otro robot.
- HitWallEvent. Maneja el HitWallEvent. sobreescribiendo el metodo onHitWall() este metodo es llamado cuando tu robot golpea un muro.
Esto es todo lo que necesitamos para crear robots. Puedes encontrar el resto del API del Robocode en el Javadoc, el cual puede ser accesado desde el menu de ayuda de la aplicacion del Robocode o desde el editor.
Creando un Robot
Para crear un nuevo robot, iniciar el Editor del Robocode y seleccionar File->New->Robot. Deberas seleccionar un nombre para el robot, el cual sera el nombre de la clase en Java. Ingresa por ejemplo DWStraight. Luego deberas ingresar una iniciales, las cuales seran utilizadas para el nombre del paquete del robot (y tambien para el archivo JAVA) el cual residiran en el. Ingresa dw en el cuadro de texto.
El Editor de Robocode mostrará el código de java que necesitas escribir para controlar el robot. Lo siguiente es un ejemplo de lo que veras.
Listing 1. Robocode-generated Robot code
package dw;
import robocode.*;
/**
* DWStraight - a robot by (developerWorks)
*/
public class DWStraight extends Robot
{
... // <<Area 1>>
/**
* run: DWStraight's default behavior
*/
public void run() {
... // <<Area 2>>
while(true) {
... // <<Area 3>>
}
}
... // <<Area 4>>
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}
} |
Las Areas rojas son zonas donde puedes agregar codigo para controlar el robot:
Area 1
En este espacio podemos declarar variables de la clase y fijar su valor. Estarán disponibles dentro del método run() del robot así como cualquier otro método que puedas crear.
Area 2
El método run() es llamado por el manejador de batalla para iniciar la vida del robots. Este consiste en dos áreas (señaladas el área 2 y el área 3 en el ejemplo 1) donde puedes agregar código. El área 2 es donde pondrás el código que funcionará solamente una vez por cada instancia del robot. Es frecuentemente usado para que el robot se inicie en un estado predeterminado antes de iniciar una acción repetitiva.
Area 3
Es la segunda parte del metodo implementado run(). Aqui, con un mientras, programaremos una accion repetitiva
Area 4
Ésta es el área donde agregas los métodos auxiliares para el robot utilizado dentro la lógica del metodo run(). Es también cuando agregas algun evento manejador que desees sobreescribir. Por ejemplo, el código en el ejemplo 1 maneja el acontecimiento de ScannedRobot y lo inicia directamente en el robot siempre que otro tanque sea detectado por el radar.
Para nuestro primer robot, DWStraight, actualizaremos el codigo como se muestra en rojo en el Ejemplo 2.
Ejemplo 2. Nuevo Codigo para el DWStraight robot
package dw;
import robocode.*;
public class DWStraight extends Robot
{
public void run() {
turnLeft(getHeading());
while(true) {
ahead(1000);
turnRight(90);
}
}
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(180);
}
} |
|
|
|
Aqui esta lo que hace el robot area por area:
Area 1
No especificaremos ninguna variable global para este robot.
Area 2
Para colocar al robot en un estado inicial, pondremos que se ubique a 0 grados utilizando turnLeft(getHeading()).
Area 3
En esta seccion que se repetira, moveremos el robot utilizando ahead(1000). Este se detendra cuando golpee un muro u otro robot. Entonces giraremos utilizando turnRight(90). Como este es repetitivo, el robot básicamente se alejara de las paredes hacia la derecha.
Area 4
Aqui, agregamos el evento ScannedRobot y realizamos un disparo al robot que se encuentra directamente en el radar. Tambien detectamos el evento HitByBullet y giramos 180 grados (hacia la derecha e izquierda alternadamente) cuando recibimos un impacto de bala.
Compilando y Probando el Robot
Desde el menu Editor del Robocode seleccionamos Compiler->Compile para compilar el codigo de tu robot. Ahora estamos listos para nuestra primer batalla. Vuelve hacia el campo de batalla y selecciona desde el menu Battle->New
para mostrar un dialogo similar al de la figura 3.
Figura 3 Dialogo de una Nueva Batalla.

Agregar nuestro robot, dw.DWStraight a la batalla, después agregar un robot opuesto, tal como sample.SittingDuck. Cliquear Finish, y la batalla comenzará. Obviamente, una batalla con SittingDuck no es demasiado emocionante, pero consigues ver lo que hace el robot de DWStraight por defecto. Experimenta con otros robots de la colección de ejemplo, y ve cómo DWStraight se va contra ellos.
Cuando estes listo para examinar el codigo de otros robots, chequea el codigo del robot dw.DWRotater que se encuentra abajo en el Ejemplo 3:
Ejemplo 2. Nuevo Codigo para el DWStraight robot
package dw;
import robocode.*;
/**
* DwRotater - a robot by (developerWorks)
*/
public class DwRotater extends Robot
{
static double midX;
static double midY;
static double leadAngle[] = {3,6, 10 };
static int idx = 0;
/**
* run: Comportamiento por default de DwRotater
*/
public void run() {
midX = getBattleFieldWidth()/2;
midY =getBattleFieldHeight()/2;
double myX = getX();
double myY = getY();
turnLeft(getHeading());
if( myY < midY)
ahead(midY - myY);
else {
turnLeft(180);
ahead(myY - midY);
turnLeft(180);
}
turnRight(90);
if( myX < midX)
ahead(midX - myX);
else {
turnLeft(180);
ahead(myX - midX);
}
while(true) {
turnGunRight(360);
}
}
/**
* onScannedRobot: Que es lo que haces cuando ves a otro robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
turnGunRight(leadAngle[idx]);
fire(1);
}
/**
* onHitByBullet: Que es lo que haces cuando eres gopeado por una bala
*/
public void onHitByBullet(HitByBulletEvent e) {
ahead(100);
back(100);
}
// Ajusta el angula si fallas
public void onBulletMiss(BulletMissedEvent e) {
idx = idx++ % leadAngle.length;
}
}
} |
Este robot hara lo siguiente:
Se movera al centro del campo de batalla.
Movera su arma hasta que detecte un robot.
Dispara al robot detectado, tratando a diferentes angulos en cada momento.
Se moverá rapidamente hacia atras y adelante siempre que una bala lo golpee.
Clases Adicionales
Mientras que seas más competente en el diseño de los robots, el cuerpo del código que puedes incluir en el robot puede aumentar substancialmente. Una manera modular de manejar el código es descomponerla en las clases separadas de Java y después agruparlas en un solo paquete (archivo .Jar). Robocode encontrará automáticamente clases del robot dentro de los paquetes puestos en el directorio de los robots.
Otras Subclases de Robot
Cualquiera puede crear subclases de la Clase Robot y agregar nuevas funcionalidades que pueden ser utilizadas para crear robots.
Adaptado y Traducido por Raul Espinola del documento:
Rock 'em, sock 'em Robocode! de http://www-128.ibm.com/developerworks/java/library/j-robocode/
Autor: Sing Li |