2015-02-01 2 views
0

Я пытаюсь закодировать игру в кости в javascript, используя Math.random() для генерации значений костей и массива для хранения текущих значений каждого индивидуальная смерть.for loop, Math.random() не работает по назначению

Проблемы, с которыми я столкнулся, - это 1), массив заканчивается с шестью числами, и цикл работает только пять раз, и 2) я не могу понять, как получить Math.random(), чтобы возвращать разные числа на каждом броске кубиков.

Вот рассматриваемая функция:

var array = [] 

function rollDice() { 
    for (var i = 0; i <= 4; i++) { 

     var roll = Math.floor(Math.random() * 6) + 1; 

     array[i] = roll; 
     //array.splice(i, 1, roll); 
    } 
} 

Вы можете увидеть, что «я» итерацию от нуля до четырех в цикле (который равен пять циклов), и на каждом цикле другое случайное число генерируется и вставляется в массив в эквивалентном месте.

Что касается количества элементов в массиве: если я запустил код, как написано выше, я получу что-то вроде этого: [1, 2, 3, 4, 5, undefined]. Если я запустил его, используя прокомментированную строку с функцией «сращивания» (которая должна удалить значение, сохраненное в месте «i», и заменить его новым значением), я получу [1, 2, 3, 4, 5 , 6]. Как это происходит, если цикл работает только пять раз?

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

var roll; 
while (roll === hand[i] || roll === null) { 
    roll = Math.floor(Math.random() * 6) + 1; 
} 

... в надежде, что «бублик» будут держать вращающиеся случайные числа, пока они не появятся с другим, но не кубиками. У кого-нибудь есть предложения?

EDIT: Я добавил явное объявление массива, так как не дал достаточно ясного представления о том, что мой массив был явно объявлен ранее.

+1

Попробуйте 'array [array.length] = roll;'. Кроме того, перед циклом вам не хватает строки 'var array = [];'. Вместо этого используйте 'for (var roll = i = 0, array = []; i <= 4; i ++)', что является предпочтительным способом. И удалите 'var' на' var roll = [...]; '. –

+0

Ваш код выглядит хорошо, проверьте его на [скрипке] (http://jsfiddle.net/8gaq9q4u/) –

+0

Вам нужно убедиться, что вы объявляете свой массив; вы не опубликовали эту часть своего кода. Цикл 'while' не работает, вероятно, потому, что' roll' начнется как 'undefined', а не' null', поэтому цикл не будет запущен вообще. – Pointy

ответ

1

Я заработал так, как вы планировали.

Ошибки в коде:

  1. array неопределен Он объявлен вне
  2. Вы определяете свойства на undefined переменной.
  3. Вы используете действительно плохо свой цикл while.
  4. Ваша функция ничего не возвращает. Поскольку это объявлено снаружи, это ненужная (правильная) точка.

Вот код, используя for:

function rollDice() { 
    for (var i = 0, array = []; i <= 4; i++) 
    { 
     array[array.length] = Math.floor(Math.random() * 6) + 1; 
    } 
    return array; 
} 

Изменения:

  1. Удалены бесполезные roll переменной.
  2. Подержанные объекты length для установки следующей позиции (похожие на array.push(value), но быстрее).
  3. Заявленный недостающее array
  4. Возвращается значение

Использование do ... while цикла:

function rollDice() { 
    var array = []; 
    do 
    { 
     array[array.length] = Math.floor(Math.random() * 6) + 1; 
    } 
    while (array.length < 5); 
    return array; 
} 

Отличия:

  1. Переменная i больше не требуется.
  2. Прямая декларация и приращение array.length
  3. Youonly проверить длину в конце, который один меньше бесполезный чек
  4. Это быстрее !!!

Что касается редактирования:

НЕ ДЕЛАЙ, ЧТО !!!

Нельзя получить доступ к переменной, объявленной , за пределами функции.

Это самый распространенный способ сделать это!

+0

-.- Ухаживать за нижним листом? –

+0

Внизу я не делал. Или, если это было, это было сделано по ошибке. Я еще не тестировал ваш код в моем проекте. Один момент. – bmurrell30

+0

@ bmurrell30 Не спешите. И, пожалуйста, отредактируйте свой вопрос с тем, что вы сказали в комментариях. –

0

Для возврата 5 уникальных чисел от 1 до 5 случайным образом:

var array = [1,2,3,4,5] 

function rollDice() { 
    array.sort(function(){ 
     return Math.random() - 0.5; 
    }); 
} 

Fiddle: http://jsfiddle.net/1wrgrr0v/1/

0

Теперь, когда вы выяснили, что вы хотите, что последовательные вызовы roll() не будет повторять значение в этот конкретный слот в массиве, вы можете сделать это с этим:

function rollDice() { 
    var roll; 
    for (var i = 0; i <= 4; i++) { 
     // keep generate a new random value until it is different 
     // than what was in this slot of the array before 
     while ((roll = Math.floor(Math.random() * 6) + 1) === array[i]) {} 
     array[i] = roll; 
    } 
} 

Работа демо: http://jsfiddle.net/jfriend00/frh3dyvd/

Смежные вопросы