我试图让一个物体随意地在世界各地游荡。
该物体有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();
}
}
}
答案 0 :(得分:0)
看起来以下条件被写入两次。如果你面临出界,你不会做360而不是180吗?我会删除后两个if语句。
if ((this.getGridY() == this.getWorld().getHeight()) &&
(this.getGridX() == this.getWorld().getWidth()))
{
this.turnAround();
this.move();
}
答案 1 :(得分:0)
假设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();
}
删除该行。因为当达到这个陈述时,你的演员可能处于边缘并面临空虚 - 而你实际上是在告诉它继续前进。
相反,删除该行并调用changeDirection()
,这将导致actor转180度。我看到changeDirection()
也会导致演员移动,所以基本上你的演员会离开边缘。