这是经典的 Robocode 练习题之一:走到地图的中间。我不想移动两次(一次用于 x 轴,一次用于 y 轴),而是将方位向中间移动,并在设置机器人方位后单次移动。
令我沮丧的是,它似乎不起作用。相反,我从机器人观察到的行为是它们转动 180 度并向前移动以达到 'r' 的值,这是“三角形”向中间的斜边。每个循环的距离似乎越来越小,所以我认为“r”的公式是正确的。我怀疑是方法setWest()
,setEast()
我写了。他们的目的是将机器人设置为平行于面向东或西的水平面。然后我再次使用 theta(这是第二个不确定的部分)将机器人向中间旋转并移动它。
Robocode 中实现的方法是不言自明的,但不是我的。这是我写的代码:
public class MyFirstRobot extends Robot {
public void setWest(){
// If it's looking NW
if(getHeading() > 270 && getHeading() < 0)
turnLeft(getHeading() - 270);
// If it's looking SE or SW
else if(getHeading() >= 90 && getHeading() <= 270)
turnRight(270 - getHeading());
// If it's looking NE
else if(getHeading() >= 0 && getHeading() < 90)
turnLeft(90 + getHeading());
// If my coding is undercooked spaghetti
else {
System.out.println("Error");
}
}
public void setEast(){
// If it's looking NW
if(getHeading() > 270 && getHeading() < 0)
turnRight(450 - getHeading());
// If it's looking SE or SW
else if(getHeading() >= 90 && getHeading() <= 270)
turnLeft(getHeading() - 90);
// If it's looking NE
else if(getHeading() >= 0 && getHeading() < 90)
turnRight(90 - getHeading());
// If my coding is undercooked spaghetti
else {
System.out.println("Error");
}
}
public void run() {
double x = 0.0;
double y = 0.0;
double r = 0.0;
double theta = 0.0;
while (true) {
x = getBattleFieldWidth() / 2.0 - getX();
y = getBattleFieldHeight() / 2.0 - getY();
r = Math.sqrt(Math.pow(x,2) + Math.pow(y,2));
// Find the angle with respect to the horizontal.
theta = Math.atan((Math.toRadians(y) / Math.toRadians(x)));
/*
* Align tank towards the middle
* depending on the "quadrant" it's in.
*/
// 1st Quadrant
if(x < 0 && y < 0){
setWest();
turnLeft(theta);
}
// 2nd Quadrant
else if(x >= 0 && y < 0){
setEast();
turnRight(theta);
}
// 3rd Quadrant
else if(x >= 0 && y >= 0) {
setEast();
turnLeft(theta);
}
// 4th Quadrant
else if(x < 0 && y >= 0) {
setWest();
turnRight(theta);
}
// Move to the middle after the final rotation.
ahead(r);
}
}
请不要介意无限循环,这只是为了观察行为。run()
是机器人的主要方法;默认情况下调用它。