Вопрос или проблема
У меня есть система выпадения предметов, но я хочу, чтобы у игрока было больше удачи
const blocks = [
{
name: "Железо",
ratio: 1 / 2,
},
{
name: "Золотой слиток",
ratio: 1 / 4,
},
{
name: "Зеленый амулет",
ratio: 1 / 10,
},
{
name: "Красный драгоценный камень",
ratio: 1 / 20,
},
{
name: "Алмаз",
ratio: 1 / 100,
}
]
const totalRatio = blocks.reduce((sum, item) => sum + item.ratio, 0);
function rollItem(luckIncreasePercentage = 0) {
const luckboost = (1000 * Math.random());
let roll = Math.random();
let cumulativeChance = 0;
for (let i = 0; i < blocks.length; i++) {
cumulativeChance += blocks[i].ratio / totalRatio;
if (roll <= cumulativeChance) {
return blocks[i];
}
}
}
Я хочу иметь возможность добавлять процент повышения удачи, например, на 10% больше удачи, каким-то образом. Я уже сделал что-то, что выполняло больше Math.random и брало наивысший, но меня не устраивает это решение, потому что если у вас бесконечное количество удачи, это начинает тормозить
Вы можете возвести roll
в степень, которая меньше 1. Чем ниже степень, тем больше roll
будет стремиться к 1 (это “повышение”).
Таким образом, вы можете сделать следующее:
let roll = Math.random() ** ((100 - luckIncreasePercentage) / 100);
Таким образом, если luckIncreasePercentage
равно 0 (что означает отсутствие повышения), это упростится до Math.random() ** 1
, т.е. Math.random()
. С другой стороны, если luckIncreasePercentage
равно 100 (максимальное повышение), roll
будет равно 1, независимо от того, что было Math.random()
, поскольку оно было возведено в степень 0.
Ответ или решение
Вопрос о том, как добавить удачу в систему выпадения предметов на JavaScript, заслуживает внимательного подхода и обширного объяснения. Рассмотрим детали реализации улучшенной системы выпадения с учетом коэффициента удачи.
Основная Система Выпадения Предметов
Исходя из предоставленного вами кода, у вас уже есть система, основанная на иерархии элементов, каждый из которых имеет свое вероятностное соотношение (ratio). Следующий шаг — внедрить элемент улучшения удачи.
Подход к Улучшению Удачи
Вы отметили, что текущая реализация, основанная на многократном выпадении Math.random()
, является неэффективной, особенно при больших значениях удачи, что может вызывать замедление работы программы. Мы можем избежать этого, применяя метод с использованием степени для Math.random()
.
Формула Увеличения Удачи
Предложенная формула для изменения значения roll
выглядит следующим образом:
let roll = Math.random() ** ((100 - luckIncreasePercentage) / 100);
- Когда
luckIncreasePercentage
равен 0,roll
будет равенMath.random()
, и функция будет работать как обычно. - При
luckIncreasePercentage
в 100, результат будет всегда равен 1, что обеспечивает максимальную удачу.
Какие Преимущества Дает Этот Подход?
- Эффективность: Вы избегаете многократных вызовов
Math.random()
, что улучшает производительность. - Гибкость: Можно легко регулировать коэффициент удачи, изменяя всего лишь одно значение.
- Ширина скорее всего: Значение
roll
, которое было изменено с помощью степени, всё ещё остается равномерно распределенным в пределах от 0 до 1, что обеспечивает правильную случайность в выборе предметов.
Обновленный Функционал
Теперь давайте рассмотрим полный код с внесенными изменениями:
const blocks = [
{ name: "Iron", ratio: 1 / 2 },
{ name: "Gold nugget", ratio: 1 / 4 },
{ name: "Green Amulet", ratio: 1 / 10 },
{ name: "Red Gem", ratio: 1 / 20 },
{ name: "Diamond", ratio: 1 / 100 }
];
const totalRatio = blocks.reduce((sum, item) => sum + item.ratio, 0);
function rollItem(luckIncreasePercentage = 0) {
let roll = Math.random() ** ((100 - luckIncreasePercentage) / 100);
let cumulativeChance = 0;
for (let i = 0; i < blocks.length; i++) {
cumulativeChance += blocks[i].ratio / totalRatio;
if (roll <= cumulativeChance) {
return blocks[i];
}
}
}
Вывод
Данная методика значительно улучшает удобство использования вашей системы выпадения предметов. Путем включения коэффициента удачи через степень, вы сможете управлять вероятностями более эффективно без негативного влияния на производительность. Этот подход будет полезен как для улучшения игрового процесса, так и для создания привлекательного ощущения у игроков.
Если у вас появятся дополнительные вопросы или необходимость в дальнейших улучшениях, всегда рад помочь!