[wizs] 怪物掉落物機率設定
假設一隻怪物,會掉 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
01/16 17:18, 2F
→
01/16 17:20, , 3F
01/16 17:20, 3F
→
01/16 17:20, , 4F
01/16 17:20, 4F
→
01/16 17:21, , 5F
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)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
15
19