簡體   English   中英

在robocode中轉到地圖的中心

[英]Going to the center of the map in robocode

我正嘗試直接轉到地圖的中心。 因此,這意味着您不必轉向地圖高度的中心,而是轉向地圖寬度的中心,我想開始並面對中心然后去那里。 一旦我在那里,我想停下來。 我覺得我應該做的事,但無法正常工作。

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);
        }
    }
}

您要計算的是方位角。 方位角是您的前進方向(朝向的方向)與到達目標的方向之間的差。 如果轉動軸承的角度,則您將面對目標。

自從使用Robocode以來已經有很長時間了,所以我不記得確切的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);

萬一任何人需要此:

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

@ Adam-burry解釋的內容,但經過測試並編譯了:D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM