RoboCodeBasicBot在Map中间不

bakd9h0s  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(256)

这是一个经典的机器人代码练习问题:去Map的中间。我不想移动两次(一次用于x轴,一次用于y轴),而是将方向角移向中间,在设置好机器人的方向角后,再移动一次。
令我沮丧的是,它似乎不起作用。相反,我从机器人身上观察到的行为是,它们转180度,朝着“r”的值前进,即“三角形”的斜边朝中间移动。每圈的距离似乎越来越小,所以我认为r的公式是正确的。我怀疑这些方法 setWest() 以及 setEast() 我写道。他们的目的是使机器人与水平面平行,面向东方或西方。然后我再次使用θ(第二个不确定的部分)将机器人向中间旋转并移动它。
在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() 是机器人的主要方法;默认情况下会调用它。

c9x0cxw0

c9x0cxw01#

我会回答我自己的问题,以防有人想知道答案是什么。有一些修正: getHeading() 返回一个介于0<= getHeading() <360度。我错误地设置了一个if条件 getHeading() < 0 ,这是不可能的。我还决定将标题存储在一个变量中,以避免调用 getHeading() 多次。以下是该部分的修复方法:

public void setWest(){  
 double heading = getHeading();
 // If it's looking NW           
 if(heading > 270.0 && heading < 360.0)
     turnLeft(getHeading() - 270);
 // If it's looking SE or SW
 else if(heading >= 90.0 && heading <= 270.0)
     turnRight(270 - getHeading());
 // If it's looking NE
 else if(heading >= 0.0 && heading < 90.0)
     turnLeft(90 + getHeading());
 // If my coding is god awful
 else {
     System.out.println("West | Error");
 }

这里的差值是0.0,第一次检查更改为360.0。
θ以弧度而不是度数存储。 turnLeft() 或者 turnRight() 需要以度为单位的参数才能正常工作。输入弧度不会给你一个错误。它也不会像预期的那样工作。θ也必须存储为正数,因为 setWest() 以及 setEast() 已经说明了方向。它只是通过使用 Math.abs() 以及 Math.toDegrees() . 如下图所示:

// Find the abs value of the angle with respect to the horizontal.
     theta = Math.abs(Math.toDegrees(Math.atan((Math.toRadians(y) / Math.toRadians(x)))));

如果你对此有一些挥之不去的问题,我希望这会有所帮助。

相关问题