2015-11-18 1 views
0

Я строю генератор персонажа Pathfinder, но изо всех сил стараюсь, чтобы статистика была достаточно высокой. Поэтому я хотел бы рассказать об этом, если общий модификатор не будет выше 10.Выбор случайных чисел до тех пор, пока число не будет достаточно [javascript]

Кубики скатываются 4 раза, а три самых высоких рулона добавляются, чтобы сделать один стат. Шесть характеристик подаются в массив, из которого можно работать. Общий модификатор рассчитывается путем суммирования всех шести статистических данных, вычитания 60 и деления этого числа на 2. Таким образом, у меня есть все, что показано здесь.

Я предполагаю, что теперь я ищу статуту if/else, где если checkModifier() < 10, то запустите rollStat() еще раз, двигайтесь вперед. Но я не уверен, как это будет выглядеть. Или было бы лучше упростить все это в одну функцию, а затем запустить ее как заявление while?

EDIT: возникла проблема с кодом, производящим те же шесть номеров статусов. Я исправил это.

function makeDie(sides) { 
    var die = function() { 
     return 1 + Math.random() * sides | 0; 
}; 

die.times = function (count) { 
    var rolls = []; 
    for(var i = 0 ; i < count ; i++) { 
     rolls.push(this()); 
    } 
    return rolls; 
}; 

return die; 
} 

var rollStat = function() { 
    var dieRolls = makeDie(5).times(4) 
    for (a in dieRolls) { 
     dieRolls[a] += 1; 
    } 
var sortedRolls = dieRolls.sort(); 
    var singleStat = 0; 
     for (b = 1; b < sortedRolls.length; b++) { 
      singleStat += sortedRolls[b]; 
     } 
    return singleStat; 
} 

var sixStats = function() { 
    var ss = []; 
     for (var c = 0; c < 6; c++) { 
      ss.push(rollStat()); 
     } 
    return ss; 
} 

var stats = sixStats(); 
var stats = stats.sort(function (a, b) { 
    return a - b; 
}); 

var checkModifier = function() { 
    var total = 0; 
     for (var d in stats) { 
      total += stats[d]; 
} 
return (total-60)/2; 
}; 
+0

Haven't смотрел на весь код, но статистика является массив всегда одних и тех же значений, что предполагаемого поведения? Кроме того, в функции rollStat у вас есть цикл под var dieRolls = makeDie (5). × (4); что ничего не делает, почему? – juvian

+1

, если вы генерируете «случайные» числа, где минимальное допустимое число равно десяти, а затем просто добавьте десять. –

+0

@juvian добавляет по 1 к каждому случайному числу, чтобы получить число от 2 до 6. И теперь, когда я набираю это, я понимаю, что, вероятно, лучший способ сделать это. Что касается массива: я упростил код и понял, что я удалил функциональность, чтобы получить 6 разных случайных чисел. – Alicia

ответ

0

Here's a fiddle с решением, которое я дам после просмотра вашего редактирования.

var createStats = function() { 
    var stats = sixStats(); 

    stats = stats.sort(function (a, b) { 
     return a - b; 
    }); 

    var total = 0; 
     for (var d in stats) { 
      total += stats[d]; 
     } 
    var totalModifier = (total-60)/2; 
    if (totalModifier < 10) { 
     return createStats(); 
    } else { 
     return totalModifier; //of course, ultimately you will probably want to return stats, not the totalModifier, but this is here for debugging purposes. 
    } 

}; 

Вы можете увидеть this fiddle как доказательство концепции.

Другой, возможно, аккуратнее решение:

var genStats = function() { 
    var stats = sixStats(); 

    stats = stats.sort(function (a, b) { 
     return a - b; 
    }); 

    return stats; 
}; 

var totalMod = function (stats) { 
    var total = 0; 
     for (var d in stats) { 
      total += stats[d]; 
     } 
    var totalModifier = (total-60)/2; 
    return totalModifier; 
}; 

var createStats = function (minMod) { 
    var stats = genStats(); 
    if (totalMod(stats) < minMod) { 
     return createStats(minMod); 
    } else { 
     return stats; 
    } 

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