Programación de agentes con Robocode API

| 0 comentarios

Introducción
Con el lema "Buir the best - destroy the rest" fue desarrollado el juego Open Source llamado Robocode; iniciado por Mathew Nelson y que hasta la fecha se mantiene vigente debido a las contribuciones de la comunidad y el auspicio de SourceForge. Este juego fue diseñado para ayudar a las personas a programar en el lenguaje Java y de paso divertirse con esta experiencia.

Básicamente consiste en escribir código Java en base a la API proporcionada de tal grado que mejor se defienda y sobreviva un tanque robot 'agente inteligente' del resto, obviando que las batallas se puedan dar en equipos, uno contra uno, o todos contra todos.

Entorno e instalación
Como requisitos:

  • Tener instalado al menos la versión 5 de java que incluya JRE Y JDK; preferentemente el de SUN
  • Tener correctamente configurada la variable del sistema JAVA_HOME

Resulta sencillo ir al sitio oficial del proyecto, descargarse el JAR de la ultima versión y ejecutarlo desde la línea de comandos con:

java -jar robocode-setup-x.y.z.jar



Anatomía del Robocode

imagenConsta de tres partes:
  • Cuerpo - Lleva el arma con el radar en la parte superior. El cuerpo es utilizado para mover el robot hacia adelante y hacia atrás, así como girar a la izquierda oa la derecha.
  • Arma - Utilizado para disparar balas de energía. El cañón puede girar a la izquierda o a la derecha.
  • Radar - Se utiliza para buscar otros robots cuando se mueven. El radar puede girar a la izquierda oa la derecha. El radar genera eventos onScannedRobot cuando se detectan los robots.

Otras de sus características:
  • Tiene ciertas reglas físicas, como movimiento, apuntar, velocidad, que debes tomar en cuenta a la hora de atacar y defenderte
  • Tiene sensores que debes programar para ver a tus objetivos
  • Hay obstáculos contra los que tu tanque puede chocar.
En sí su comportamiento es igual al de un agente inteligente, puesto que cumple con la siguiente definición propuesta por Hayes-Roth:
Los agentes inteligentes continuamente ejecutan tres funciones: perciben las condiciones dinámicas del entorno, actúan para afectar condiciones en el entorno, y razonan para interpretar percepciones, resolver problemas, trazar inferencias, y determinar acciones
por sí esto fuera poco la programación en estos puede ser genética.

Arquitectura del engine de simulación del Robocode



Técnicas, tips y trucos
Resumo algunas técnicas utiliazadas por los maestros del robocode:

  • Evitar la pared factor - Utilizado para evitar que el bot quede atrapado entre las paredes o se desvíe mucho de una dirección
  • Movimiento antigravedad - Consiste en algoritmos para definir algunos puntos en el mapa para así poder evitarlos y crear patrones de movimientos.
  • Objetivos predictivos - Algoritmo que es utilizado para determinar las posiciones del enemigo con mayor precisión y poder realizar disparos más eficaces.

Creación del robot

Para programar un robot acceder al menú Robot>Editor> posteriormente en el editor de robot File>New>Robot. Especificar el nombre del robot (Clase java) y el paquete al que pertenece. Prácticamente hay que extender de una clase llamada Robot (No es más que un hilo) y generar aquellas porciones de código en base a las técnicas, habilidades y trucos existentes, más detalles en la API. Posteriormente guardar y compilar la clase desde Compiler>compile


package robot1;
import robocode.*;
//import java.awt.Color;

/**
* Exterminador - a robot by (Gabriel Mtz.)
*/
public class Exterminador extends Robot
{
/**
* run: Exterminador's default behavior
*/
public void run() {
// After trying out your robot, try uncommenting the import at the top,
// and the next line:
//setColors(Color.red,Color.blue,Color.green);
while(true) {
// Replace the next 4 lines with any behavior you would like
ahead(100);
turnGunRight(360);
back(100);
turnGunRight(360);
}
}

/**
* onScannedRobot: What to do when you see another robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}

/**
* onHitByBullet: What to do when you're hit by a bullet
*/
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(90 - e.getBearing());
}

}



Test