Công cụ thành viên

Công cụ trang web


script:feature:random_value_by_ratio

Kịch bản trả về giá trị ngẫu nhiên theo tỉ lệ xác định

Chức năng

  • Kịch bản cung cấp hàm trả về giá trị ngẫu nhiên với tỉ lệ được xác định

Chú ý:
- Kịch bản là một hàm chức năng có thể vận dụng cho nhiều trường hợp liên quan. Ví dụ mở rương thưởng, khối may mắn…
- Hàm chỉ áp dụng được khi đã nhập các giá trị cần thiết vào bảng và có hàm khác kích hoạt

Giải thích các dòng lệnh

local tab_note = {
    {rate=_},{rate=_},...
} 
  • Bảng nhập tỉ lệ kèm các thông tin khác liên quan (Tỉ lệ tuỳ chỉnh không bắt buộc theo dạng có tổng là 100)

local sumSoFar = 0
for index,tab in ipairs(tab_note) do
    sumSoFar = sumSoFar + tab.rate
    tab_note[index].rate = sumSoFar
end
  • sumSoFar: BIến gán giá trị tổng tỉ lệ
  • Vòng lặp nhằm đặt lại giá trị tỉ lệ trong bảng đã nhập cho thuận tiện xác định giá trị trả về ngẫu nhiên với tỉ lệ được xác định

local rand = math.random(1,sumSoFar)
    for index,tab in ipairs(tab_note) do
        if rand <= tab.rate then
            return ...
        end
    end
  • math.random(1,sumSoFar): Giá trị rand được gán cho số từ 1 đến giá trị tổng tị lệ
  • Vòng lặp kèm điều kiện nhằm xác định thông tin cần trả về

Dưới đây là bản mẫu

  • Chức năng: Người chơi nhấp vào khối chỉ định ( ID:140 ) sẽ nhận ngẫu nhiên 6 loại vật phẩm theo số lượng và tỉ lệ xác định


local tab_note = {
    {id=11570,count=10,rate=30},{id=11571,count=4,rate=25},{id=11575,count=2,rate=20},
    {id=11576,count=1,rate=15},{id=11597,count=1,rate=5},{id=11594,count=1,rate=5}
}
local sumSoFar = 0
for index,tab in ipairs(tab_note) do
    sumSoFar = sumSoFar + tab.rate
    tab_note[index].rate = sumSoFar
end
function getRandomId()
    local rand = math.random(1,sumSoFar)
    for index,tab in ipairs(tab_note) do
        if rand <= tab.rate then
            return tab.id, tab.count
        end
    end
end
--[[Hàm sự kiện]]--
local function lucky_block(event)
    if event.blockid == 140 then
        local id, count = getRandomId()
        Player:gainItems(event.eventobjid, id, count, 1)
    end
end
ScriptSupportEvent:registerEvent('Player.ClickBlock',lucky_block)

local tab_note = {
    {id=11570,count=10,rate=30},{id=11571,count=4,rate=25},{id=11575,count=2,rate=20},
    {id=11576,count=1,rate=15},{id=11597,count=1,rate=5},{id=11594,count=1,rate=5}
}
  • Bảng đã được thay đổi với tỉ lệ có tổng là 100
  • id: ID vật phẩm
  • count: Số lượng vật phẩm nhận được
  • rate: Tỉ lệ nhận được vật phẩm

return tab.id, tab.count
  • Thông tin được trả về: ID vật phẩm, Số lượng vật phẩm

Kịch bản tham khảo

local tab_note = {
    {rate=_},{rate=_},...
} – Bảng nhập tỉ lệ kèm các giá trị liên quan
local sumSoFar = 0 – Biến tổng
for index,tab in ipairs(tab_note) do – Thay đổi lại bảng cho phù hợp
    sumSoFar = sumSoFar + tab.rate
    tab_note[index].rate = sumSoFar
end
function getRandomId() – Hàm trả về kết quả theo tỉ lệ đã nhập
    local rand = math.random(1,sumSoFar)
    for index,tab in ipairs(tab_note) do
        if rand <= tab.rate then
            return ...
        end
    end
end

Cre:Nguyễn Khánh 2024/10/17 05:18


Nếu bạn có bất kỳ câu hỏi nào về Chế Độ DEV Nâng Cao, vui lòng tham gia
Mini World Developer Việt Nam chính thức của chúng tôi

script/feature/random_value_by_ratio.txt · Sửa đổi lần cuối: 2024/10/17 05:21 bởi leo