转向世界的边缘(Java)

时间:2015-10-03 23:25:54

标签: java object

我试图让一个物体随意地在世界各地游荡。 该物体有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();
        }
    }
}

2 个答案:

答案 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()也会导致演员移动,所以基本上你的演员会离开边缘。