编码随机遭遇

时间:2013-06-04 20:54:44

标签: database random

我正在尝试制作随机怪物遭遇。基本上,当按下“寻找战斗!”时按钮,我想返回一个随机怪物供玩家战斗。但问题是,我希望一些怪物有更多的机会然后出现,而有些则非常罕见。

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

  1. 给每个怪物一个“重量”并将它们的重量除以列表中每个怪物的总重量,以给出一个被选中的机会百分比。优点:易于制作。缺点:如果我添加怪物,一些怪物可能会变得非常罕见,无法满足我的想法。

  2. 让每个怪物有机会遇到,然后以随机顺序将它们全部放入列表中。然后从列表中的第一个怪物开始,使用%偶然机会掷骰子。如果是,则选择怪物。如果为false,请转到列表中的下一个怪物。至少有一个怪物会有100%遇到机会确保发生遭遇。优点:似乎非常随机。缺点:与#1相同,可能有点太复杂了。

  3. 给每个怪物一个怪物类型(IE:正常,强壮,稀有),然后给每种类型一个%的机会被选中。然后滚动一个骰子,看看在遭遇中选择哪种类型,然后选择该类型的随机怪物。优点:容易做,会让稀有怪物保持我想要的机会百分比。缺点:不能让所有怪物都有自己的机会。

  4. 我的问题:最好的方法是什么?我说的方式之一还是有更好的方法呢?

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

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

3 个答案:

答案 0 :(得分:1)

随机数生成器介于1 - 100之间

如果1 - 25怪物1

如果25 - 35怪物2

等。

答案 1 :(得分:1)

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

  • 80%:怪物转储:从不断增长的名单中抓取一个怪物。
  • 20%:具有相对“固定”遭遇概率的特殊怪物表。概率不受添加到另一个表中的怪物的影响。

答案 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