Java 去机器人世界地图的中心

Java 去机器人世界地图的中心,java,robocode,Java,Robocode,我想直接去地图的中心。这意味着不要转向地图高度的中心,然后是地图宽度的中心,我想开始,面向中心,然后去那里。一旦我到了那里,我想停下来。我觉得我应该做的,但它不能正常工作 1) 我走对了吗 2) 直接去中心有没有更方便的方法?像是一种拼写坐标的方法 到目前为止,我已经: public void run() { // Initialization of the robot should be put here setColors(Color.black,Color.blue,Col

我想直接去地图的中心。这意味着不要转向地图高度的中心,然后是地图宽度的中心,我想开始,面向中心,然后去那里。一旦我到了那里,我想停下来。我觉得我应该做的,但它不能正常工作

1) 我走对了吗

2) 直接去中心有没有更方便的方法?像是一种拼写坐标的方法

到目前为止,我已经:

public void run() {
    // Initialization of the robot should be put here
    setColors(Color.black,Color.blue,Color.orange, Color.orange, Color.cyan); // body,gun,radar

    double xMiddle = getBattleFieldWidth() / 2;
    double yMiddle = getBattleFieldHeight() / 2;
    double directionToTurn = 0;

    // Robot main loop
    while(true) {

        if( (int)getX() != xMiddle && (int)getY() != yMiddle ){
            if ( (int)getX() > xMiddle && (int)getY() > yMiddle ) { //Quadrant 1
                directionToTurn = (int)getHeading() - 225;
                System.out.println("Quadrant: ONE ");
            } else if ( (int)getX() < xMiddle && (int)getY() > yMiddle ) { //Quadrant 2
                directionToTurn = (int)getHeading() - 135;
                System.out.println("Quadrant: TWO ");

            } else if ( (int)getX() < xMiddle && (int)getY() < yMiddle ) { //Quadrant 3
                directionToTurn = (int)getHeading() - 45;
                System.out.println("Quadrant: THREE ");

            } else if ( (int)getX() > xMiddle && (int)getY() < yMiddle ) { //Quadrant 4
                directionToTurn = (int)getHeading() - 315;
                System.out.println("Quadrant: FOUR ");

            } else if ( (int)getX() > xMiddle && (int)getY() == yMiddle ) { // Right Center
                directionToTurn = (int)getHeading() - 270;
                System.out.println("Quadrant: Right Center ");
            } else if ( (int)getX() < xMiddle && (int)getY() == yMiddle ) { // Left Center
                directionToTurn = (int)getHeading() - 90;
                System.out.println("Quadrant: Left Center ");
            } else if ( (int)getX() == xMiddle && (int)getY() > yMiddle ) { // Top Center
                directionToTurn = (int)getHeading() - 180;
                System.out.println("Quadrant: Top Center ");
            } else if ( (int)getX() == xMiddle && (int)getY() < yMiddle ) { // Bottom Center
                directionToTurn = (int)getHeading() - 0;
                System.out.println("Quadrant: Bottom Center ");
            }
            turnLeft( directionToTurn );
            System.out.println("Position: ("+(int)(getX())+", "+(int)getY()+"), Facing: "+(int)getHeading() );
            ahead(1);
        }
    }
}
public void run(){
//机器人的初始化应该放在这里
设置颜色(颜色.黑色,颜色.蓝色,颜色.橙色,颜色.橙色,颜色.青色);//车身,枪,雷达
double xmidle=getBattleFieldWidth()/2;
double ymidle=getBattleFieldHeight()/2;
双向旋转=0;
//机器人主回路
while(true){
如果((int)getX()!=xmidle&&(int)getY()!=ymidle){
如果((int)getX()>xMiddle&&(int)getY()>yMiddle){//象限1
directionToTurn=(int)getHeading()-225;
System.out.println(“象限:1”);
}如果((int)getX()yMiddle){//象限2
directionToTurn=(int)getHeading()-135;
System.out.println(“象限:2”);
}如果((int)getX()xMiddle&&(int)getY()xMiddle&&(int)getY()==yMiddle){//右中
directionToTurn=(int)getHeading()-270;
System.out.println(“象限:右中心”);
}如果((int)getX()yMiddle){//Top-Center
directionToTurn=(int)getHeading()-180;
System.out.println(“象限:顶部中心”);
}如果((int)getX()==xMiddle&&(int)getY()
您要计算的是轴承。方位是你的航向(你面对的方向)和目标方向之间的差异。如果你按方位转动,那么你将面对目标

我已经很久没有玩过机器人代码了,所以我不记得确切的API了。以下是草图(因此未经测试)。在编译之前,您必须修复函数名和类型

// heading (or course) [0, 2pi): 0 is up, rotation is clock-wise
// bearing (-pi, pi]: positive is clock-wise

// convert angle to (-pi, pi]
double norm(double a) {
  // do something smarter with modulus (%) here
  while (a <= -Math.PI) a += 2 * Math.PI;
  while (Math.PI < a) a -= 2 * Math.PI;
  return a;
}

// get bearing in radians to a target(x,y) from the current position/heading
double getBearing(int x, int y) {
  // can rotate the coordinate system to avoid the addition of pi/2 if you like 
  double b = Math.PI/2 - Math.atan2(y - robot.y(), x - robot.x());
  return norm(b - robot.getHeadingRadians());
}

// then bearing to centre is
double bearingToCentre = getBearing(xMiddle, yMiddle);
//航向(或航向)[0,2pi):0向上,按时钟旋转
//轴承(-pi,pi):正向为时钟方向
//将角度转换为(-pi,pi]
双范数(双a){
//在这里用模数(%)做一些更聪明的事情

而(a如果有人需要:

private void moveTowardsCenter() {
    double centerAngle = Math.atan2(getBattleFieldWidth()/2-getX(), getBattleFieldHeight()/2-getY());
    setTurnRightRadians(Utils.normalRelativeAngle(centerAngle - getHeadingRadians()));
    setAhead(100);
}

这是@Adam burry解释的,但经过测试和编译:D

你是否被限制在8个基本方向?你能用静态数学方法计算一个角度并取一个航向,例如203?这样你就有了一个方法calcheding()并去掉所有这些条件。你熟悉
atan2()吗
?@nexus\u 2006不,我不限于8个方向。我想这就是我在这里要做的,就是计算我应该进入的方向。谢谢,似乎方向就是我要找的。robot.headingRad()应该以弧度获取标题吗?