0

ランダムなモンスターとの遭遇を生み出そうとしています。基本的には「バトルを探す!」を押すと ボタン、プレイヤーが戦うためにランダムなモンスターを返したい. しかし、問題は、一部のモンスターが他のモンスターよりも出現する機会が多く、一部のモンスターが非常にまれであることです。

最善の方法を考えていて、今のところ3つの方法を考えています。

  1. すべてのモンスターに「重量」を与え、それらの重量をリスト内のすべてのモンスターの合計重量で割って、選択される可能性を % にします。長所:簡単に作れます。短所: モンスターを追加すると、一部のモンスターがレアになりすぎて、私が望むものになる可能性があります。

  2. すべてのモンスターに % の確率で遭遇し、それらすべてをランダムな順序でリストに入れます。次に、リストの最初のモンスターから始めて、遭遇する % の確率を使用してサイコロを転がします。true の場合、モンスターを選択します。false の場合、リスト内の次のモンスターに移動します。少なくとも 1 体のモンスターは 100% の確率で遭遇し、確実に遭遇します。長所: 非常にランダムに見えます。短所:#1と同じですが、その価値に対して少し複雑すぎるかもしれません.

  3. すべてのモンスターにモンスター タイプ (IE: ノーマル、ストロング、レア) を与え、次にすべてのタイプに % の確率で選ばれるようにします。次にサイコロを振って遭遇時にどのタイプが選択されるかを確認し、そのタイプのモンスターをランダムに選択します。長所: やりやすく、レア モンスターが望む % の確率を維持します。短所: すべてのモンスターに独自の % チャンスを持たせることはできません。

私の質問: それを行う最善の方法は何ですか? 私が言った方法の1つ、またはそれを行うためのより良い方法はありますか?

それはウェブサイト用で、私はasp.net、C#、およびSQLサーバーを使用しています。Javascript と jquery は問題ありません。さらに情報が必要な場合は、喜んで共有します。

編集:それを行う4番目の方法を考えました。これは 1 と 3 の混合になります。すべてのモンスターに「重み」(1 から 1000 の間) を使用します。次に、1000 のサイコロを振ります。次に、生成されたサイコロの乱数未満の重量を持つモンスターごとに、それらをリストに入れ、リストからランダムなモンスターを選びます。

4

3 に答える 3

1

1 ~ 100 の乱数ジェネレータ

if 1 - 25 モンスター 1

if 25 - 35 モンスター 2

など。

于 2013-06-04T20:57:09.313 に答える
1

モンスター遭遇表を次のように細分化します。

  • 80%: モンスター ダンプ: 増え続けるリストからモンスターを取得します。
  • 20%: 遭遇確率が比較的「一定」の特別なモンスター テーブル。確率は、他のテーブルに追加されたモンスターの影響を受けません。
于 2013-06-04T21:07:16.417 に答える
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 に答える