Math.floor(Math.random()) не отображает случайные числа после первого использования

Я программирую эту действительно простую игру и хочу, чтобы урон, наносимый каждым игроком, был случайным при каждом ударе. По какой-то причине первое попадание имеет случайное значение, но следующие за ним значения точно такие же. Это похоже на то, как функция Math.floor(Math.random()) запускается один раз, затем останавливается и использует значение, которое ей было присвоено в первый раз.

Вот код:

this.attackpoints=Math.floor((Math.random()*10)+5);

this.attack=function(opponent) {

    opponent.hitpoints-=this.attackpoints;
    console.log(this.name + " has " + this.hitpoints + " hitpoints and " + this.energy + " energy.");
    console.log(this.name + " just hit " + opponent.name + ".");

}

person Tobias Birkeland    schedule 06.02.2014    source источник
comment
Это похоже на то, как функция Math.floor(Math.random()) запускается один раз, затем останавливается и использует значение, которое ей было присвоено в первый раз. Бинго. Он работает только тогда, когда вы его вызываете. Откуда он мог знать, что вы не хотите удерживать исходное случайное значение? Каждый раз, когда вам нужно случайное число, вам нужно его сгенерировать.   -  person cookie monster    schedule 06.02.2014


Ответы (4)


Вы запускаете Math.random только один раз, когда вы инициализируете значение this.attackpoints.

Вместо этого вы можете сделать это:

this.getAttackPoints = function() {
  return Math.floor((Math.random()*10)+5);
}

this.attack=function(opponent) {
    opponent.hitpoints-=this.getAttackPoints();
    console.log(this.name + " has " + this.hitpoints + " hitpoints and " + this.energy + " energy.");
    console.log(this.name + " just hit " + opponent.name + ".");

}
person Tibos    schedule 06.02.2014
comment
Спасибо, это помогло! :) - person Tobias Birkeland; 06.02.2014

Используйте функцию -

this.attackpoints= function () {
  return Math.floor((Math.random()*10)+5);
};

Затем получите новое случайное значение, вызвав вашу функцию -

opponent.hitpoints-=this.attackpoints();
person John Strickler    schedule 06.02.2014

К сожалению, вы не разместили код, где мы могли бы видеть, где вызывается ваш код выше, но я предполагаю, что вы вызываете только

this.attackpoints=Math.floor((Math.random()*10)+5);

один раз, а затем вы используете только переменную точек атаки, которая остается неизменной все время.

person morten.c    schedule 06.02.2014

Это потому, что вы всегда вызываете переменную Attackpoints вашего объекта. Вместо этого вы должны вызвать метод, который снова вычисляет точки атаки, а не берет их из переменной.

person Mathias G.    schedule 06.02.2014