Игровые события
Игровые события - это перевод случайных чисел с плавающей запятой в понятный результат, специфичный для игры. Это включает в себя все, от результата броска кости до порядка карт в колоде или даже местоположения каждой бомбы в игре в минеры.
В нашей версии кости мы охватываем возможный диапазон бросков от 00.00 до 100.00, что составляет 10 001 возможных результатов. Перевод игрового события осуществляется путем умножения числа с плавающей запятой на количество возможных результатов и затем деления на 100, чтобы полученное число соответствовало диапазону нашей кости.
// Game event translation
const roll = (float * 10001) / 100;
В игре Limbo мы используем двухступенчатый процесс. Сначала мы умножаем число с плавающей запятой на максимальный возможный множитель и домкрат. Затем, чтобы сгенерировать игровое событие с вероятностным распределением, мы делим максимальный возможный множитель на результат первого шага, чтобы создать игровое событие в виде точки краха.
// Game event translation with houseEdge of 0.99 (1%)
const floatPoint = 1e8 / (float * 1e8) * houseEdge;
// Crash point rounded down to required denominator
const crashPoint = Math.floor(floatPoint * 100) / 100;
// Consolidate all crash points below 1
const result = Math.max(crashPoint, 1);
В любой игре Plinko сгенерированный результат основан на пути падающей шарика. Игровое событие определяет направление падающего шарика на каждом уровне процесса падения. Игроки могут выбрать от 8 до 16 шариков, что определяет количество игровых событий, необходимых для генерации полного пути сверху вниз. Поскольку есть только два возможных направления (влево или вправо), перевод осуществляется путем умножения каждого числа с плавающей запятой на 2, что соответствует следующему индексу:
// Index of 0 to 1 : left to right
const DIRECTIONS = [ left, right ];
// Game event translation
const direction = DIRECTIONS[Math.floor(float * 2)];
Наша рулетка основана на европейской версии игры, где колесо состоит из 37 возможных разных карманов, от 0 до 36. Игровое событие рассчитывается путем умножения числа с плавающей запятой на 37 и затем перевода в соответствующий карман с использованием следующего индекса:
// Index of 0 to 36
const POCKETS = [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36
];
// Game event translation
const pocket = POCKETS[Math.floor(float * 37)];
Традиционные игры Keno требуют выбора 10 возможных игровых событий в виде попаданий на доске. Для этого мы умножаем каждое число с плавающей запятой на количество возможных уникальных квадратов. После того, как попадание было сделано, оно не может быть выбрано снова, что изменяет размер пула возможных результатов. Это делается путем вычитания размера возможных максимальных результатов на 1 для каждого итерации результата игрового события, сгенерированного с использованием соответствующего числа с плавающей запятой, используя следующий индекс:
// Index of 0 to 39 : 1 to 40
const SQUARES = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40
];
// The fisher-yates shuffle implementation is utilised to prevent duplicate possible hits being generated.
const hit = SQUARES[Math.floor(float * 40)];
Игра с минами генерируется с 24 отдельными игровыми событиями в виде мин на доске. Каждое число с плавающей запятой умножается на количество возможных уникальных клеток, которые остаются на доске. Это делается путем вычитания 1 из количества оставшихся клеток при каждой итерации результата игрового события, сгенерированного с использованием соответствующего числа с плавающей запятой. Местоположение мины определяется с помощью координатной сетки, начиная слева направо, сверху вниз. Для предотвращения дублирования возможных попаданий используется алгоритм перемешивания Фишера-Йетса. Используются от 1 до 24 результатов игровых событий, в зависимости от выбранных настроек.

