首页 文章

随机指示

提问于
浏览
1

您好我正忙着学习Java而我正在忙着创建一个pacman游戏,但现在我需要让鬼魂在“随机”方向上移动,所以现在这个方向必须垂直/水平改变,反之亦然

此刻鬼魂从左到右,从右到左 . 负责此操作的代码如下:(忽略pacman绘图部分见下面// ghost运动)

DrawPacMan pacman = new DrawPacMan();
DrawGhost ghost = new DrawGhost();

int g1x = 0;
boolean g1r = true;

public void paintComponent(Graphics g) {

    super.paintComponent(g);
    // pacman movement
    diameter = 25;   
    pacman.drawPacMan(g, getHorPlaats(), getVerPlaats(), diameter, getView(), Color.yellow);

    // ghosts movement
    g1x += ghostSpeed * (g1r? 1 : -1);

    // check direction
    if (g1x >= 500) { g1x = 500; g1r = false; }
    else if (g1x <= 0) { g1x = 0; g1r = true; }

    ghost.drawGhost(g, g1x, 40, diameter, Color.red);

}

现在我不知道如何创建随机方向或使用哪些函数 . 有人可以给我一些提示/帮助,如果可能的话,我可以进一步研究一些例子吗?如果你想看到更多的代码或东西请问,我会发布:)

3 回答

  • 2

    Math.random()是您正在寻找的功能 . 这个函数本身生成一个从0到1的随机双精度数 .

    伪代码:

    double randomDirection = Math.random();
    
    if (direction > 0.25) {
     // move left if possible
    } else if (direction > 0.5) {
     // move right if possible
    } else if (direction > 0.75) {
     // move down if possible
    } else {
     // move up if possible
    }
    
  • 2

    试试这个:

    g1x += ghostSpeed * (Math.random() > 0.5? 1 : -1);
    

    甚至更简单:

    g1x += ghostSpeed * Math.signum(Math.random() - 0.5);
    

    这利用了Math.random()[0, 1) 中返回均匀分布值的事实 .

    但是你会很快意识到这样的算法会导致鬼从左到右不规则地移动 . 你需要更优雅的东西 . 例如 . 如果幽灵向左移动,让他以75%的概率继续或以25%的概率改变方向 . 我会让你解决这个问题 .

  • 1

    对于像这样简单的东西,我会生成一个随机数,0,1,2或3.这将为您提供所需的所有方向:向上,向下,向左和向右 .

    import java.util.Random;
     // create a random number generator
     Random randomGen = new Random();
     // generate a random number, between 0 and n-1 (0,1,2,3 in this case)
     int theRandomNumber = randomGen.nextInt(4);
    
     public void setRandomGhostDirection() {
    
         switch(theRandomNumber) {
         case 0:
             moveUp();
             break;
         case 1:
             moveLeft();
             break;
         case 2:
             moveRight();
             break;
         case 3:
             moveDown();
             break;
         }
    
     }
    

    您可以通过将方向数定义为 final int DIRECTION_UP = 0 等来清理它 .

相关问题