Other JVM Languages

From Robowiki
Revision as of 16:12, 24 January 2010 by Duyn (talk | contribs) (New page. Added Scala section.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Robocode is not limited to Java robots! Since Robocode allows you to load classes on the CLASSPATH, you can code robots in any language that can produce compiled CLASS files. Support for languages which don't have a compiler will require changes to Robocode which nobody has yet volunteered to implement.

The easiest way to add a language's runtime to Robocode's CLASSPATH is to edit the starter script.

Scala

You need to add scala-library.jar to Robocode's CLASSPATH.

java -Xmx512M -Dsun.io.useCanonCaches=false -cp libs/robocode.jar;_SCALA_HOME_/lib/scala-library.jar robocode.Robocode %*

Once that is done, you can code robots in Scala just as you would in Java:

// ScalaDemo.scala
package wiki

import robocode._
import robocode.util.Utils

/*
	A small demo to test robot coding in Scala.
*/
class ScalaDemo extends AdvancedRobot {

	// Main thread of robot
	override def run {
		setAdjustGunForRobotTurn(true)
		while (true) {
			// If we're not going anywhere, move randomly around battlefield
			if (Math.abs(getDistanceRemaining) < Rules.MAX_VELOCITY
					&& Math.abs(getTurnRemaining) < Rules.MAX_TURN_RATE)
			{
				setAhead((Math.random*2-1)*100)
				setTurnRight(Math.random*90-45)
			}
			// Tell RADAR to spin
			if (getRadarTurnRemaining == 0)
				setTurnRadarRightRadians(4)
			// Carry out pending actions
			execute
		}
	}

	// Picked up a robot on RADAR
	override def onScannedRobot(e : ScannedRobotEvent) {
		// Absolute bearing to detected robot
		val absBearing = e.getBearingRadians + getHeadingRadians

		// Tell RADAR to paint detected robot
		setTurnRadarRightRadians(3*Utils.normalRelativeAngle(
			absBearing - getRadarHeadingRadians ))

		// Tell gun to point at detected robot
		setTurnGunRightRadians(Utils.normalRelativeAngle(
			absBearing - getGunHeadingRadians ))

		// Tell robot to shoot with power 2
		setFire(2)
	}

	// Robot ran into a wall
	override def onHitWall(e : HitWallEvent) {
		// Turn in opposite direction to wall
		setTurnRightRadians(Utils.normalRelativeAngle(
			e.getBearingRadians + Math.Pi))
	}
}