【问题标题】:Math.random is creating infinite numbers, rather than just oneMath.random 正在创建无限的数字,而不仅仅是一个
【发布时间】:2021-12-28 17:24:05
【问题描述】:

什么问题导致我的函数 question()(在类 Enemy 中)中 num1 和 num2 的随机化代码无限重复?下面是 question() 中的相关代码,它分别正确生成了 0-30 和 0-15 之间的两个数字,但是是无限的。

    num1 = Math.floor(Math.random() * (31 - 0)) + 0;
    num2 = Math.floor(Math.random() * (16 - 0)) + 0;
    textSize(84);
    strokeWeight(1);
    fill('#1f7ac4')
    text(num1, 200, 170);
    text('x', 200, 270);
    text(num2, 200, 370); 
    text('= ???', 200, 470);

下面是运行 question() 的代码,基于玩家对象和敌人 1 之间的简单坐标碰撞检测。

function draw() {
  background(220);
  image(BG,0,0,width,height); 
  player.show();
  enemy1.show();
  collision();
}

function collision() {
  if (player.x >= 555 && player.y < 90 && player.x <= 605){
    enemy1.question();
  }

问题是,当我移动两个对象发生碰撞,并且执行 question() 时,这两行代码带有随机的num1 = Math.floor(Math.random() * (31 - 0)) + 0; num2 = Math.floor(Math.random() * (16 - 0)) + 0; 重复,而不仅仅是一次。我怎样才能让它只为这次碰撞吐出一个数字,然后移除enemy1对象? 谢谢。

【问题讨论】:

  • 在类构造函数中生成随机数,而不是在question()函数中,并将它们保存为对象属性。

标签: javascript math random


【解决方案1】:

您不会更改enemy1 对象的位置,也不会在 question() 函数之后或中删除它。这意味着每次调用 draw 时,它都会检测到碰撞并调用 question()。我还假设发生这种情况是因为您每秒在屏幕上多次绘制它,由于帧速率,我假设这是某种类型的游戏循环。

您应该在 question() 函数中或之后编写代码,在检测到碰撞后,您的敌人要么被删除,要么被移动到屏幕上的新位置(基本上“生成”一个新敌人而无需实际创建一个) .

【讨论】:

  • 我在 question() 的末尾给了敌人一个新的位置,所以现在它在给出问题框后正确地移动了敌人。如果答案正确,我怎样才能让它停止玩家,并要求它输入,然后移动敌人?我试过使用prompt(),但它会在数字显示在屏幕上之前询问它,尽管在问题()显示之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2019-09-01
相关资源
最近更新 更多