我正在尝试制作随机怪物遭遇。基本上,当按下“寻找战斗!”时按钮,我想返回一个随机怪物供玩家战斗。但问题是,我希望一些怪物有更多的机会然后出现,而有些则非常罕见。
我一直在想最好的方法,到目前为止,我想到了3种方法。
给每个怪物一个“重量”并将它们的重量除以列表中每个怪物的总重量,以给出一个被选中的机会百分比。优点:易于制作。缺点:如果我添加怪物,一些怪物可能会变得非常罕见,无法满足我的想法。
让每个怪物有机会遇到,然后以随机顺序将它们全部放入列表中。然后从列表中的第一个怪物开始,使用%偶然机会掷骰子。如果是,则选择怪物。如果为false,请转到列表中的下一个怪物。至少有一个怪物会有100%遇到机会确保发生遭遇。优点:似乎非常随机。缺点:与#1相同,可能有点太复杂了。
给每个怪物一个怪物类型(IE:正常,强壮,稀有),然后给每种类型一个%的机会被选中。然后滚动一个骰子,看看在遭遇中选择哪种类型,然后选择该类型的随机怪物。优点:容易做,会让稀有怪物保持我想要的机会百分比。缺点:不能让所有怪物都有自己的机会。
我的问题:最好的方法是什么?我说的方式之一还是有更好的方法呢?
这是一个网站,我正在使用asp.net,C#和sql server。 Javascript和jquery很好。如果您需要更多信息,我很乐意与您分享。
编辑:我想到了第四种方法。这将是1和3的混合。对每个怪物使用“重量”(1到1000之间)。然后滚动一个1000的骰子。然后对于每个生成骰子随机数的重量的怪物,将它们放入一个列表并在列表中挑选一个随机怪物。
答案 0 :(得分:1)
随机数生成器介于1 - 100之间
如果1 - 25怪物1
如果25 - 35怪物2
等。
答案 1 :(得分:1)
细分怪物遭遇表,看起来像这样:
答案 2 :(得分:0)
通常我实际上不会为某些内容键入代码,但我无法找到描述我正在考虑的方法的好方法,所以我只是在JavaScript中一起举了一个例子。我会留给你把它翻译成C#。基本思想是为每个可能的怪物建立一个带有加权条目的列表。然后,您生成一个从1到总重量的随机数(在我的示例中为maxKey
),并通过在列表上进行二进制搜索找出它对应的怪物。我认为这是相当动态的,仍然为您提供了所需的灵活性,但在内存中也不需要太大的数据结构。
<!-- language-all: lang-js -->
/** key-val pair constructor */
function KV(k,v) { return { 'key': k, 'val': v } }
/**
* Modified binary search
* Finds value for closest key >= k
*/
function findMatch(k, kvList) {
var h = 0
var i = Math.floor(kvList.length/2)
var j = kvList.length-1
while (j - h > 1) {
if (kvList[i].key == k) break
if (kvList[i].key < k) h = i
else j = i
i = Math.floor((h+j)/2)
}
if (kvList[i].key < k) i += 1
return kvList[i].val
}
// findMatch example:
xs=[KV(1,1),KV(2,2),KV(4,4),KV(8,8),KV(16,16)]
findMatch(5,xs) // => 8
monsters = [
{ 'name': 'Rat', 'freq': 100 },
{ 'name': 'Bear', 'freq': 10 },
{ 'name': 'Qilin', 'freq': 1 }
]
maxKey = 0
encounterList = new Array(monsters.length)
for (i=0; i<monsters.length; i++) {
maxKey += monsters[i].freq
encounterList[i] = KV(maxKey, monsters[i].name)
}
function randomEncounterMonster() {
r = Math.floor(Math.random()*maxKey+1)
return findMatch(r, encounterList)
}
// test
counts = { 'Rat': 0, 'Bear': 0, 'Qilin': 0}
for (i=0; i<1000; i++) counts[randomEncounterMonster()]++
// print counts to see results