Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Roblox studio (программирование)

Михаил Юшин Ученик (72), на голосовании 4 дня назад
Напишите пожалуйста как сделать шансы на разные события в игре по типу "игрок активировал триггер на монстра и скрипт выбирает монстра учитывая шансы каждого" шансы могут быть написаны просто цифрами по типу:
local Monster1 = 110
local Monster2 = 350
local RareMonster = 10
Без всяких границ от нуля до единицы и т.д. либо напишите как сделать что-то похожее, нечто большее чем обычный math.random(x,y). В ответе напишите что где к чему.
Голосование за лучший ответ
ivan866_z Просветленный (20101) 1 месяц назад
вот можно так сделать
 local playersSvc = game:GetService('Players')  

local RND = Random.new()

local MONSTER_PROPS = {
{['prob'] = 110, ['model'] = workspace["Monster 1"]},
{['prob'] = 350, ['model'] = workspace["Monster 2"]},
{['prob'] = 10, ['model'] = workspace["Rare Monster"]}
}

local PROB_TOTAL = 0
for k, v in pairs(MONSTER_PROPS) do
PROB_TOTAL = PROB_TOTAL + v['prob']
end
for k, v in pairs(MONSTER_PROPS) do
v['prob_ratio'] = v['prob'] / PROB_TOTAL
end

table.sort(MONSTER_PROPS, function(a, b)
return(a['prob_ratio'] > b['prob_ratio'])
end)

local COLOR_IDLE = BrickColor.new('Sand green').Color
local COLOR_ANGRY = BrickColor.new('Really red').Color
local function paint_red(model, flag:boolean)
for k, v in pairs(model:GetDescendants()) do
if v:IsA('Part') or v:IsA('MeshPart') then
if flag then
v.Color = COLOR_ANGRY
else
v.Color = COLOR_IDLE
end
end
end
end

local trigger = workspace.trigger
local MONSTER_BUSY = false
local HANDLER = function(hit)
local success, error = pcall(function()
hit.Parent.HumanoidRootPart:IsA('Part')
for k, v in pairs(playersSvc:GetPlayers()) do
if v.Character == hit.Parent then
break
end
end
end)
if success and not MONSTER_BUSY then
trigger.Color = COLOR_ANGRY

local spawn_prob = RND:NextNumber()
local spawn_model = nil
for k, v in pairs(MONSTER_PROPS) do
if spawn_prob <= v['prob_ratio'] then
spawn_model = v['model']
end
end
if spawn_model then
MONSTER_BUSY = true
paint_red(spawn_model, true)
local hum = spawn_model.Humanoid
hum:MoveTo(hit:GetPivot().Position)

hum.MoveToFinished:Connect(function()
MONSTER_BUSY = false
trigger.Color = BrickColor.new('Lime green').Color
paint_red(spawn_model, false)
end)
end
end
end
HANDLER_HOOK = trigger.Touched:Connect(HANDLER)
Рустам Абдрашитов Мыслитель (8541) 1 месяц назад
 local Monsters = { 
{name = "Monster1", weight = 110},
{name = "Monster2", weight = 350},
{name = "RareMonster", weight = 10}
}

local function calculateTotalWeight(monsters)
local totalWeight = 0
for _, monster in ipairs(monsters) do
totalWeight += monster.weight
end
return totalWeight
end

local function getRandomMonster(monsters)
local totalWeight = calculateTotalWeight(monsters)
local randomValue = math.random(1, totalWeight)
local cumulativeWeight = 0

for _, monster in ipairs(monsters) do
cumulativeWeight += monster.weight
if randomValue <= cumulativeWeight then
return monster.name
end
end
end

-- Пример использования:
local selectedMonster = getRandomMonster(Monsters)
print("Выбранный монстр: " .. selectedMonster)
Похожие вопросы