【问题标题】:Looking for a random direction loop for an object寻找对象的随机方向循环
【发布时间】:2012-04-22 20:53:08
【问题描述】:

在 CS 课上,我们使用名为 greenfoot 的程序制作了一个简单的游戏。如果你熟悉的话,这个游戏很像“Frogger”游戏。我现在正在自己练习,想做一个类似的游戏。我的新游戏会有点接近吃豆人。我在控制需要到达屏幕顶部的火箭飞船之前制作的游戏。同时,我为墙壁弹跳的矩形随机选择了尺寸和速度。但是,我想让我的新游戏更有趣。我想要这些对象的循环,当它第一次符合时创建一个随机方向,然后墙壁反弹并继续朝那个方向前进,就像那个著名的屏幕保护程序反弹一样。这是我第一个游戏的代码,是这样的吗? 所以最终我的问题是,如何为随机方向编写循环。

public boolean canMoveRight() 
{
  if ( getX() + 1 < getWorld().getWidth() ) 
    return true;
  else
    return false;
}
public boolean canMoveLeft() 
{
  if ( getX() - 1 > 0 )
    return true;
  else 
    return false;
}

public void moveRight()
{
       setLocation( getX() + speed, getY() );
}
public void moveLeft() 
{
      setLocation ( getX() - speed, getY()  );
}  

    public void act() 
    {
    if (right==true) 
    {
    if (canMoveRight() )
    {
       moveRight();
    }
    else
    {
       right = false;
    }
  }
  else 
  {
     if( canMoveLeft() )
             moveLeft();
     else
            right = true;
  }
}

【问题讨论】:

  • 它有效吗?有什么问题?
  • 是的,这适用于我的第一场比赛。但是,我想要一个随机的新循环,而不是从左边开始,每次都向右。
  • 这可能有点无关,但我相信这接近于口袋妖怪风格的游戏玩法。您最好为瓷砖设置碰撞标志。这将启用动态区域。
  • 嗯,好的。我对 Java 还很陌生,我认为我还没有了解碰撞标志。

标签: java loops boolean greenfoot


【解决方案1】:

定义一个方向枚举 例如 上,右上,右...左上。

使用随机选择一个。 方向转换为 dX,dX 位置的变化,因此移动步长为 1 像素 UpLeft 为 -1,-1(原点左上角!) 然后在您的循环中,只需将 dx 添加到 X 并将 dy 添加到 Y。

【讨论】:

    【解决方案2】:

    我想,这些方法会起作用:

    Random random = new Random();
    
    int direction = random.nextInt(1); // gives 0 or 1 randomly
    if (direction == 0) {
       // move left
    } else {
       // move right
    }
    

    【讨论】:

    • 为什么不直接使用if(new java.util.Random().nextBoolean())if(Math.random() &gt;= 0.5)
    • @IchBinKeinBaum 是的,更好,无论如何。但是,由于 New2.java 是 Java 的新手 :) 并且正在使用 Greenfoot,我认为,如果代码或多或少是不言自明的,而不是高效的单行代码,可能会更好。
    【解决方案3】:

    您是否正在寻找类似的东西?

    int horz = ((Math.random() * 10) % 10) + 1; //I just choose 10 at random
    int vert = ((Math.random() *10) % 10) + 1;
    //You can use another random number to choose to negate either horz or vert if you want
    //You can also use random numbers to define the start location.
    
    public boolean canMoveHorz() 
    {
      if ( (getX() + horz < getWorld().getWidth() && horz > 0) || (getX() + horz > 0 && horz < 0)) 
        return true;
      else
        return false;
    }
    public boolean canMoveVert() 
    {
      if ( (getY() + vert > 0 && vert < 0) || (getY() + vert < getWorld().getHeight() && vert > 0))
        return true;
      else 
        return false;
    }
    
    
    public void act() {
       if(!canMoveHorz()) {
           horz *= -1;
       }
    
       if(!canMoveVert()) {
           vert *= -1;
       }
    
       setLocation(getX() + horz, getY() + vert);
    }
    

    这将需要一些调整,但它所做的是选择 2 个随机数来决定对象的速度(垂直和水平)。然后它在这些方向上移动对象,直到它到达世界的边缘,此时它抵消了速度,所以对象将向相反的方向移动。这与真正的墙壁反弹不同,因为我没有对击球的角度做任何事情来确定反弹的角度,但这应该能够让你开始。如果您想要更逼真的弹跳效果,则必须进行一些几何计算。

    【讨论】:

    • 是的!谢谢,这看起来不错。我会改变需要改变的东西,我相信它会起作用。谢谢!
    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多