[wizs] 怪物掉落物機率設定

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間17年前 (2009/01/16 17:06), 編輯推噓1(104)
留言5則, 2人參與, 最新討論串1/1
假設一隻怪物,會掉 a 物品 k%, b 物品 m%, c 物品 n% 一、k + m + n 不一定要等於 100 二、判斷時沒有一定的標準順序。 以上面來看,較簡易的寫法就是... drop_chance = ({"a物品", k, "b物品", m, "c物品", n }) j=sizeof(drop_chance); for(i=0;i<j;i=i+2) { if(random(100)<drop_chance[i+1]) { 執行 drop_chance[i] 物品的掉落; break; // 跳出迴圈 } } 這樣的設定方式,好處是較容易掉的東西本來就應該挪到越前面判斷, 而越難掉的東西挪到越後面就越難取得(因為它要經過幾次的迴圈)。 而實際取得機率應該會是曲線遞減式,即設定越前面的物品其取得機率 期望值其實大於設定值,而設定越後面的物品之取得機率期望值其實小 於設定值(例如設在第 5 件的物品設取得機率 10%,實際上「極小於10 %」) 例子.. drop_chance = ({"a物品", 50, "b物品", 30, "c物品", 10 }) 則只有 a 物品的取得機率是 50%,b 物品則是 (1-50%) x 30% = 15% ,c 物品則是 (1 - 50%) x (1 - 30%) x 10% = 3.5% 因此,假若我們希望 b 物品依舊是 30%,c 物品依舊是 10%,則要使 用反設定.. 若 b 物 30% = (1 - 50%) x m% ==> m = 60 若 c 物 10% = (1 - 50%) x (1 - 60%) x n% ==> n = 50 也就是實際上要這樣子設.. drop_chance = ({"a物品", 50, "b物品", 60, "c物品", 50 }) 但是實作上,還是要以方便設定者為主,也就是說當設定者設 50,30, 10 時,其真實機率也應該是 50, 30, 10。 j=sizeof(drop_chance); total=100; for(i=0;i<j;i=i+2) { k=drop_chance[i+1]; if(random(total)<k) { 執行 drop_chance[i] 物品的掉落; break; // 跳出迴圈 } total=total-k; } 第一輪時:random(100) < k=50 才會掉 a 物 第二輪時:random(50) < m=30 才會掉 b 物 (實際機率 (1-50%)x60% = 30% ) 第三輪時:random(20) < m=10 才會掉 c 物 (實際機率 (1-50%)x(1-60%)x50% = 10% ) 這個我看晚上有沒有空完成。(今天一整天都在公司忙) 屆時這個也一併交給 highelf 管理,怪物掉落物系統與虛擬物品系統 結合後,就可以模擬 RO 的怪物掉落物品,初期會先選幾個區域來測 試。 Laechan -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.131.227.206

01/16 17:08, , 1F
對了補充一下,掉落機率應該會用千趴來算
01/16 17:08, 1F

01/16 17:18, , 2F
靠單次random值決定掉落物的設定有那裡不好嗎?
01/16 17:18, 2F

01/16 17:20, , 3F
比較難改成「設定式」,你的方式比較適合程式撰寫
01/16 17:20, 3F

01/16 17:20, , 4F
(就是用 select case 的方式去做)
01/16 17:20, 4F

01/16 17:21, , 5F
但如此一來1000隻怪物就要寫1000個這樣的篩選程式
01/16 17:21, 5F
baha 所舉的方式類似底下... select(random(100)) { case 0..49: 掉 a 物; break; case 50..79: 掉 b 物; break; case 80..89: 掉 c 物; break; } 一、1000隻怪物,得寫 1000 個上面的東西。 二、它不容易擴充。例如說我們要為這怪物「再加上兩項物品」,   為此得去改程式,並重新計算 m..n 的數值。 三、它也不容易管理。為什麼呢?因為你無法寫程式去讀「某怪物   掉的 a 物品的機率是多少」。 四、實務上,最容易掉的東西是 a 物品,所以只要越高機率的物品   挪到越前面,迴圈實際被執行的次數,在大部份的情況下就會集   中在 1~2 次(例如以上例,80% 的機率只會執行最多 2 次),而   且怪物的陣亡頻率也在可接受範圍內。 以後用物件式是主流,因為以後不希望收了 wiz 之後該 wiz 還得花 時間在程式寫作上,以後應該減少寫程式的情況,要盡量多以物件資 料的管理為主。 Laechan ※ 編輯: laechan 來自: 220.131.227.206 (01/16 17:28)
文章代碼(AID): #19S4uMwd (mud_sanc)
文章代碼(AID): #19S4uMwd (mud_sanc)