首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Robocode BasicBot到地图的中间...不

Robocode BasicBot到地图的中间...不
EN

Stack Overflow用户
提问于 2020-11-20 07:41:19
回答 1查看 59关注 0票数 0

这是一个经典的Robocode练习问题:转到地图的中间。我不想移动两次(一次用于x轴,一次用于y轴),而是将方向移到中间,并在设置机器人的方向后以一次运动的方式移动。

令我沮丧的是,它似乎不起作用。相反,我从机器人上观察到的行为是它们180度旋转,并向前移动,以'r‘的值,这是“三角形”朝向中间的斜边。每个循环的距离似乎都变小了,所以我认为'r‘的公式是正确的。我怀疑的是我写的setWest()setEast()方法。他们的目的是将机器人平行于水平方向,朝向东方或西方。然后,我再次使用theta (这是第二个不确定的部分)将机器人旋转到中间,并移动它。

Robocode中实现的方法非常简单明了,虽然不是我的。下面是我写的代码:

代码语言:javascript
复制
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()是机器人的主要方法;默认情况下会调用它。

EN

回答 1

Stack Overflow用户

发布于 2020-11-20 14:20:40

我会回答我自己的问题,以防有人想知道答案是什么。有几个修复:

  1. getHeading()返回一个介于0 <= getHeading() < 360度之间的值。我错误地将其中一个if条件设置为getHeading() < 0,这是不可能的。我还决定将标题存储在一个变量中,以避免多次调用getHeading()。以下是该部分的修复方法:

public void setWest(){ double heading = getHeading();//如果它正在寻找NW if(heading > 270.0 && heading < 360.0) turnLeft(getHeading() - 270);//如果它正在寻找SE或SW if(heading >= 90.0 && heading <= 270.0) turnRight(270 - getHeading());//如果它看起来是NE,否则If (标题>= 0.0 && heading < 90.0) turnLeft(90 + getHeading());//如果我的代码很糟糕,否则{ System.out.println("West | Error");}

这里的差异是360.0,第一次检查被更改为360.0 0。

  1. Theta是以弧度而不是度来存储的。turnLeft()turnRight()需要以度为单位的参数才能正常工作。放入弧度不会给你带来错误。它也不会像预期的那样工作。Theta也必须存储为正数,因为setWest()setEast()已经说明了方向。只需使用Math.abs()Math.toDegrees()就可以解决这个问题。如下图所示:

//找出角度相对于水平方向的abs值。theta = Math.abs(Math.toDegrees(Math.atan((Math.toRadians(y) / Math.toRadians(x)))));

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64921679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档