script:feature:random_value_by_ratio
Mục lục
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