作者laechan (小太保)
看板mud_sanc
标题[wizs] 怪物掉落物机率设定
时间Fri Jan 16 17:06:27 2009
假设一只怪物,会掉 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
1F:→ laechan :对了补充一下,掉落机率应该会用千趴来算 01/16 17:08
2F:推 bahatest :靠单次random值决定掉落物的设定有那里不好吗? 01/16 17:18
3F:→ laechan :比较难改成「设定式」,你的方式比较适合程式撰写 01/16 17:20
4F:→ laechan :(就是用 select case 的方式去做) 01/16 17:20
5F:→ laechan :但如此一来1000只怪物就要写1000个这样的筛选程式 01/16 17:21
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)