在世界的边缘掉头(Java)

在世界的边缘掉头(Java),java,object,Java,Object,我想让一个物体在世界上随意游荡。 这个物体有25%的机会左转,25%的机会右转,50%的机会直线移动。 我必须确保所选择的随机方向不会使对象超出边界。我使用getGridX()和getGridY()检查当前对象的坐标位置,以确定它是否位于边缘。我只积极考虑过世界上的两个角落。 然而,它不断被强迫离开世界 我的代码做错了什么 import sofia.micro.*; import sofia.util.Random; //-----------------------------------

我想让一个物体在世界上随意游荡。 这个物体有25%的机会左转,25%的机会右转,50%的机会直线移动。 我必须确保所选择的随机方向不会使对象超出边界。我使用
getGridX()
getGridY()
检查当前对象的坐标位置,以确定它是否位于边缘。我只积极考虑过世界上的两个角落。 然而,它不断被强迫离开世界

我的代码做错了什么

import sofia.micro.*;

import sofia.util.Random;

//-------------------------------------------------------------------------

public class Food extends SimpleActor
{

    //~ Constructor ...........................................................

    /**
     * Creates a new Food object.
     */
    public Food()
    {
        super();
    }


    //~ Methods ...............................................................

    // ----------------------------------------------------------
    /**
     * 25% chance of turning left 
     * 25% chance of turning right
     * 50% chance of moving forward
     */
    public void act()
    {
        int value = Random.generator().nextInt(100);
        this.changeDirection();
        if (value < 25)
        {
            this.turn(LEFT);
            this.changeDirection();
        }
        else if (value < 50)
        {
            this.turn(RIGHT);
            this.changeDirection();
        }
        else
        {
            this.move();
            this.changeDirection();
        }
    }
    /**
     * make a U-turn
     */
    public void turnAround()
    {
        this.turn(RIGHT);
        this.turn(RIGHT);
    }
    /**
     * detects edge condition and moves away
     */
    public void changeDirection()
    {
        if ((this.getGridY() == this.getWorld().getHeight()) || 
        (this.getGridX() == this.getWorld().getWidth()))
        {
            this.turnAround();
            this.move();
        }
          if ((this.getGridY() == 0) || (this.getGridX() == 0))
        {
            this.turnAround();
            this.move();
        }
        if ((this.getGridY() == this.getWorld().getHeight()) && 
        (this.getGridX() == this.getWorld().getWidth()))
        {
            this.turnAround();
            this.move();
        }
          if ((this.getGridY() == 0) && (this.getGridX() == 0))
        {
            this.turnAround();
            this.move();
        }
    }
}
import sofia.micro.*;
导入sofia.util.Random;
//-------------------------------------------------------------------------
公共类食品扩展SimpleActor
{
//~z~建造师。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
/**
*创建一个新的食物对象。
*/
公共食品
{
超级();
}
//~方法。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
// ----------------------------------------------------------
/**
*有25%的机会左转
*右转的几率为25%
*50%的前进机会
*/
公共无效法
{
int值=Random.generator().nextInt(100);
这个。changeDirection();
如果(值<25)
{
这个。左转;
这个。changeDirection();
}
否则如果(值<50)
{
这个。右转;
这个。changeDirection();
}
其他的
{
这个。移动();
这个。changeDirection();
}
}
/**
*掉头
*/
公共空间扭转()
{
这个。右转;
这个。右转;
}
/**
*检测边缘条件并移开
*/
公共空间更改方向()
{
如果((this.getGridY()==this.getWorld().getHeight())|
(this.getGridX()==this.getWorld().getWidth())
{
这是一个转折点;
这个。移动();
}
if((this.getGridY()==0)| |(this.getGridX()==0))
{
这是一个转折点;
这个。移动();
}
如果((this.getGridY()==this.getWorld().getHeight())&&
(this.getGridX()==this.getWorld().getWidth())
{
这是一个转折点;
这个。移动();
}
if((this.getGridY()==0)和&(this.getGridX()==0))
{
这是一个转折点;
这个。移动();
}
}
}

下面的条件似乎被写入了两次。如果你面对的是出界,你会做360而不是180吗?我将删除后两个if语句

if ((this.getGridY() == this.getWorld().getHeight()) && 
(this.getGridX() == this.getWorld().getWidth()))
{
    this.turnAround();
    this.move();
}

假设
turn()
方法得到了正确实现(我在代码中没有看到),我发现了一个问题:

if (value < 25)
{
    this.turn(LEFT);
    this.changeDirection();
}
else if (value < 50)
{
    this.turn(RIGHT);
    this.changeDirection();
}
else
{
    this.move();            //  < --- You shouldn't be using this here
    this.changeDirection();
}
if(值<25)
{
这个。左转;
这个。changeDirection();
}
否则如果(值<50)
{
这个。右转;
这个。changeDirection();
}
其他的
{
this.move();//<---您不应该在此处使用此选项
这个。changeDirection();
}
拆下那条线。因为当达到这一点时,你的演员可能处于边缘,面朝虚无——而你实际上是在告诉他继续前进


相反,删除该行,只需调用
changeDirection()
,这将导致参与者旋转180度。我看到
changeDirection()
也会导致演员移动,因此基本上你的演员会从边缘移开。

你说得对,我清理了我的代码以避免重复动作。但当我运行它时,它仍然会被强迫出界。我觉得这是因为我没有实现任何考虑对象所面临方向的方法。我开始考虑如何添加一些东西来检查对象所面临的方向。我将尝试在turnbound()方法中添加一个if语句。另外,如果我删除后两个if语句,我如何确保它在东南角和(0,0)处不会超出边界?我的意思是,不管它是什么,它都会掉下来,但我认为一旦我添加了方向声明,它应该会修复一切。有一个getDirection()方法返回它当前面对的指南针方向(北、南、东或西)。