タスク: 行動順決定アルゴリズムをCWに近づける

Issue #188 new
k4nagatsuki repo owner created an issue

HAND氏の次の実験結果により、現在のアルゴリズムはCWとはかなり異なる結果が出る事が分かります。

  1. https://twitter.com/hand_cw/status/535793956496211968
  2. https://twitter.com/hand_cw/status/535794154723225600
  3. https://twitter.com/hand_cw/status/535804761430179841
  4. https://twitter.com/hand_cw/status/535796179049525248

4.の他に読み取れる事は、

  1. おそらく、計算式上は、6点以上能力値が離れた時には100%高い方が先手を取る(1D6を使用?)。
  2. その上で、クリティカルかファンブルがある。Aの方がBより6点以上能力が高い時、Bが先手を取る確率は1/36に一致する。

そこで次のような実験コードを書いてみましたが、傾向としては近いものの、結果は微妙に異なるようです。

vocations = [
    ( 6, 12),
    ( 6, 11),
    ( 6, 10),
    ( 6,  8),
    ( 6,  6),
    ( 6,  4),
    ( 6,  2),
    ( 6,  0),
    (-4, -2),
    ( 6,  8),
]

def calc_order(vocation_val):
    d = diceroll(1, 6)
    value = vocation_val + d
    return value

import random
def diceroll(n=2, side=6):
    sum = 0
    for x in xrange(n):
        sum += int(random.randrange(1, side+1))
    return sum

for x in vocations:
    count = 0
    for i in xrange(500):
        if calc_order(x[0]) >= calc_order(x[1]) and diceroll(2, 6) < 12:
            count += 1

    print "%2d:%2d -> %3d" % (x[0], x[1], count)

出力結果は例えば次のようになります。どうもAが先手を取る事が多すぎるようです。

 6:12 ->   0
 6:11 ->   8
 6:10 ->  42
 6: 8 -> 132
 6: 6 -> 280
 6: 4 -> 405
 6: 2 -> 477
 6: 0 -> 492
-4:-2 -> 137
 6: 8 -> 140

Comments (8)

  1. k4nagatsuki reporter

    ところで今のアルゴリズムではAが6でBが0の能力値の時にBが先手を取る事が多くなります。これは明らかにおかしいので当面の対策として上の式に差し替えておきます。

  2. hand.onlooker

    データを提供します。規則性はいまいちわかりません。 検証時にPCを行動不能にして実験しましたが、 それでもPCが干渉している可能性があります。

    実験状況 A,B はレベル1、敏捷以外は身体6、慎重/大胆以外は精神0 500ラウンド試行し、Aの先取回数を数える。

    Aの敏捷+大胆:Bの敏捷+大胆->Aの先取回数

     6:13->  0
     6:12->  0
     6:11->  3
     6:10-> 24
     6: 9-> 59
     6: 8->103
     6: 7->188
     6: 6->235
     6: 5->300
     6: 4->376
     6: 3->428
     6: 2->451
     6: 1->483
     6: 0->487
     6:-1->497
     6:-2->500
    
    10:17->  0
    10:16->  0
    10:15-> 11
    10:14-> 45
    10:13-> 63
    10:12->143
    10:11->178
    10:10->257
    10: 9->335
    10: 8->388
    10: 7->431
    10: 6->464
    10: 5->489
    10: 4->493
    10: 3->496
    10: 2->498
    10: 1->500
    
  3. k4nagatsuki reporter

    ありがとうございます。もっと差を大きくするとB先手500回に到ってしまうのですね。ということは1/36に見えたのは偶然で、クリティカルは無いと考えたほうがよさそうです。

    1D6でも説明がつかなそうなので根本的に考え方を変える必要があるのかもしれません。

  4. hand.onlooker

    上記のデータですが、行動不能PCの影響がありました。完全なタイマン(PC一人・敵一人)の場合、「PCの(敏捷+大胆)+1d6<敵の(敏捷+大胆)+1d6ならば敵が先攻、そうでなければPCが先攻」となるようです。

    PC一人の場合も、PCの敏捷+大胆が全ての敵でのそれより5大きければPC先攻確定、6小さければ敵先攻確定のようです。

    検証シナリオ:http://www.geocities.jp/handmademidis/cdwirth/koudou.zip

    また、敵同士の行動順の判定で、 https://twitter.com/hand_cw/status/650156704085078016 https://twitter.com/hand_cw/status/650044542075310080 のようにPCに影響される場合があります(後者は左右の敵のどちらが先攻するかを比較してます)。

  5. k4nagatsuki reporter

    ありがとうございます。

    手札選択と同じく、後から判定した方が前の値を超えるか以上であれば先に動くという事のようですが、行動不能でも影響があるというのがどうも不可解です。そのようなロジックであれば行動不能者が影響できるはずがありません。

    敵を5体並べた時に2番めが最も遅くなるというのも謎……もしかするとハッシュテーブルのような不確定な順序のデータ構造を使って判定ループを回しているのではないかとも疑ってしまうくらいですが、何かうまい説明ができないものでしょうか。

  6. Log in to comment