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