0

我试图产生一个随机的怪物遭遇。基本上,当按下“寻找战斗!” 按钮,我想返回一个随机怪物供玩家战斗。但问题是,我希望一些怪物比其他怪物有更多的机会出现,而有些则非常罕见。

我一直在考虑最好的方法,到目前为止,我想到了 3 种方法。

  1. 给每个怪物一个“权重”,然后将它们的重量除以列表中每个怪物的总重量,从而获得被选中的 % 机会。优点:很容易制作。缺点:如果我添加怪物,一些怪物可能会变得太稀有,而不是我想要的。

  2. 让每个怪物都有 % 的机会遇到,然后将它们全部按随机顺序放在一个列表中。然后从列表中的第一个怪物开始,使用 % 遭遇几率掷骰子。如果为真,则选择怪物。如果为假,则转到列表中的下一个怪物。至少一个怪物将有 100% 的遭遇机会来确保遭遇发生。优点:看起来很随意。缺点:与 #1 相同,对于它的价值来说可能有点过于复杂。

  3. 给每个怪物一个怪物类型(即:普通、强、稀有)然后给每个类型一个 % 的机会被选择。然后掷骰子看看会在遭遇中选择哪种类型,然后选择该类型的随机怪物。优点:容易做到,会使稀有怪物保持我希望它们成为的 % 几率。缺点:不能让所有怪物都有自己的 % 几率。

我的问题:最好的方法是什么?我说的一种方法还是有更好的方法?

这是一个网站,我正在使用 asp.net、C# 和 sql server。Javascript 和 jquery 都很好。如果您需要更多信息,我很乐意分享。

编辑:我想到了第四种方法。这将是 1 和 3 的混合。为每个怪物使用“权重”(1 到 1000 之间)。然后掷1000个骰子。然后对每一个重量低于骰子随机数的怪物,将它们放入一个列表中,并在列表中随机选择一个怪物。

4

3 回答 3

1

细分怪物遭遇表,使其看起来像这样:

  • 80%:怪物转储:从不断增长的列表中抓取一个怪物。
  • 20%:遇到概率相对“固定”的特殊怪物表。概率不受添加到另一张表的怪物的影响。
于 2013-06-04T21:07:16.417 回答
1

1 - 100 之间的随机数生成器

如果 1 - 25 怪物 1

如果 25 - 35 怪物 2

等等。

于 2013-06-04T20:57:09.313 回答
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
于 2013-06-04T22:12:12.623 回答