見出し画像

[戦術研究:呪われし…戦]ドラクエ8 (PS2版) 制限4種(メタル、チーム、くちぶえ、リセット)


はじめに

2024年の6月ころ「呪われし・・・」戦の研究をしていました。この記事では
 主人公の「ため/ライデイン」の選択
について説明します。計算に使ったコードも置いておきます。(python)
(追記6/19 ) 一体、何を計算してるかについて、0.に説明を追加しました。
すべての種類のネタバレを含みます。ご注意ください。

この研究は、こちらのツイートで取り上げたものです。
動画もアップしました(5戦分。6/26)。


0.何を計算したのか

・2年ほど前から、制限4種(メタル、チーム、くちぶえ、リセット)でRTAをしています。
攻略のまとめはこちら→https://note.com/uniright2/n/nb34178cd600c

・このうちの「呪われしゼシカ」というボス戦を研究したものです。
・この戦闘では、「シャドー」が3匹ずつ、6匹まで呼ばれます。このシャドーから受けるダメージは大したことはありませんが、動く分だけタイムロスになります。
・駆除の担当は主人公です。「ライデイン」2発を要します。ただし1回でも「ため」ていれば、1発で倒せます。
・しかし1回ためてライデインを撃つのは、ボスに対するダメージ効率が良くありません。逆に3回ためて撃てばボスに対するダメージ効率は良いですが、その頃にはシャドーが増えすぎるかもしれません。
→つまり、「シャドーの数」と「ため回数」の組み合わせに応じ、最適な行動は変わってきそうです。トレードオフになっているのは「シャドーの行動回数」と「ボスへのダメージ効率」です。

結論

 シャドーの数が3段階、ため回数が4段階あるので、戦況は少なくとも12種あります。それぞれについて、行動を下表にまとめます。★は、どちらも大差ないという結論です。
 なお、仮にククールが「爆弾岩のカケラ」を使ってよいのなら、この★は効果的です。★でシャドー3匹が無傷のときは「主人公:ライデイン ククール:爆弾岩のカケラ」が、現時点では最善と考えています(6/19)

主人公の行動

検討に必要となる、情報の整理

戦力と前提
・主人公Lv26(賢さの種1個使用)、ライデインのダメージは52想定
・主人公は「目覚ましリング」装備
・主人公の先制率は(対ボス,対シャドー)=(1/4,1/3) つまりだいたい後行
・ボスの「シャドー呼び率」は40%/毎ターン
 数値は計算を簡単にするため、多少丸めています。

ダメージ効率と、シャドーの行動の換算:
 結論から言うと、「シャドーの行動1回減少」は「ボスへダメージ15」と同等とみています。
 シャドーの行動を3秒、この戦闘のダメージ蓄積は秒速4~5のため5で仮置き、3×5=15で換算。
 つまりこの15は雑な推定。なので、10-20までは評価の幅がありえそうと思い、数値を動かしグラフで見てみましたが、結論に対してあまり依存性は高くないようです(後述)。

考え方

ダメージの差分:
 ライデインで与えるダメージを、「ため」回数それぞれで比較すると、下の表のようになります(すべて期待値)。
なお、ダメージの推定は、以下の計算式で行っています。
 ボスへのダメージ = 基本値52 × (1 → 1.7 → 3 → 5)  + 6×(ため回数) 

「ため」という行為に、将来のダメージ増減を繰り入れる換算表
 

 この表の「いちばん右の列」の値が重要ですが、少々説明が必要だと思います。まず、列を左から見ていくと「ボスへのダメージ」は上の式で計算した通りです。「連打想定ダメージ」は、ためずにライデインを撃ち続けた場合の数値です。「増減」は、これら2つの差分です。ここまでは良いと思います。
 問題は、この「増減」がいつ発生すると考えるかにあります。たとえば3回ためてライデインの+70を、撃った瞬間に生じると考えるのが自然ではあるのですが、そうするとその原因となった3ターン前の「ため」から遠くなり、計算が複雑になるばかりか、15ターン程度で戦闘そのものが終わってしまうので、打ち切りによる評価のずれも無視できなくなります。
 そこで、「ため」によるダメージ増減は、その「ため」という行為そのものに繰り入れる方法をとります。たとえば、T_0からの1回目のためは、その時点で「仮に次にライデインを撃った場合、連打想定より、10損する」ため、この行為は「マイナス10」です。これだと3回ためてライデインなら、
 -10 + 22 + 58 = 70で、3回の「ため」に差分は分配された形となります。

戦況のとりうる状況(15通り):
 シャドーのダメージ状況により、実は3匹、6匹の場合は細分化されます。ライデイン1発では倒せないためです(下表)。
 ちなみに、表の「右上」ほど有利な戦況であり、逆に「左下」ほど不利な戦況です。

戦況の15通りと、ライデインで固定とした9か所

「そこはライデインでしょ」と思う、黄色い9か所①~⑨:
 たとえば上表の①は、さすがにライデインだと思います。というか、ここで撃たなければいつ撃つのかという話になります。②③も同様です(補足:③に関しては詳細に検討すると「てんばつの杖」がなくもないが、ライデインよりやや劣る上、持たせる手間があるので却下)。
 次に⑧⑦④を考えると、やはりライデイン一択と思われます。というのも、ここで「ためる」なら、「ライデイン」と比較してシャドーが6回多く動くことが確定し、6回×15=90ダメージ損失と換算できます。一方、「ため」の生む増加は高々58(T_20のとき)なので、「ため」の負けです。
 同様に⑤⑥も(ためずに)ライデイン連打するのが、シャドー駆除の面でも、ボスへのダメージ効率の面でも、最適となります。⑨も同様です。
 以上より、15か所のうち、9か所は「ライデイン」固定でよさそうです。

結局、計算した32通り(4×8):
 残った6か所に、「あ~か」、とふってみました。

計算した6か所と、「ため」の遷移方向

 6か所残っているので、2^6=64通りの「ライデインorため」の組み合わせがあるかと思われますが、あ→い→う については、これ以外のパスが存在しないので、たとえば、「あ:ライデイン」→「い:ため」という組み合わせは考えても意味がありません。意味があるのは4通りだけです。
 これに対し、え、お、か、は「そのひとつ左」の選択には関係なく、「ライデイン/ため」の両方を考慮したほうがよさそうです。こちらは2^3=8通り、考えておきます。
 こうして、この4×8=32通りに関しては、計算(マルコフ連鎖)で、期待値を求めました。
(補足:この32通りにも意味のないものが6通りふくまれ、意味があるのは26通りのはず。だが、除外するより計算してしまったほうが早い)。

結論のために見た数値

 まず、「シャドーなし」のとき(上記、あ、い、う)は「ため」続けるのがよいです。そして「シャドー3匹」のとき(上記、え、お、か)次の2つが僅差でした。

爆弾岩のカケラを使わない場合の、トップ2

シャドー行動1回=15ダメージ?

 この数値設定に恣意性があるので、10~20まで変えながら、「シャドー3匹」のときの「えおか」の行動セット8通りを、グラフにしてみました。
 上の表の結論となった、「赤」と「オレンジ」の線は、10~20の範囲でおおむね最適戦術といえそうです。

総合評価:シャドー行動1回の「ダメージ換算」を10-20で変動させ、俯瞰

「爆弾岩のカケラ」の、つかいどころ

 ここからは、おまけ的な話です。「ライデインorため」という制約を少しだけ外して考えてみます。
 上表の僅差の2つ、どちらにしても「シャドー3匹無傷、ため0回(*)」のときは、シャドーをそのターンで倒せないので、この3匹の行動はそのターンに3回、次のターンに2回の、合計5回が期待値となりロスは大きいです。
(補足:「6匹無傷、ため0回」という戦況はさらに悪いですが、戦術上これは発生しません。また「6匹無傷ではない、ため0回」になる際には必ず(*)を経由するため、やはり(*)での対処のほうが優先課題です)。
 そこで、この(*)場合は「ライデイン+ククール(爆弾岩のカケラ)」と動くことを想定してみました。なお、ククールは必ずシャドーに先行する想定です。
 こうすると、
・爆弾岩のカケラは、ボスへのダメージ期待値は54
・シャドーを倒せる確率は2/3程度。ライデインを加えれば必ず倒せる
→ シャドー残り期待値1匹×主人公の後行率2/3= 行動2/3回
となり、5回から2/3回ですから4.33回減で、ダメージ65に相当(1回15換算) します。
 つまり、このククールの一手は、54+65=119ダメージもの価値があります。これなら調達コストを考えても十分にペイしそうです。
 なお「シャドー3匹無傷、ため0回(*)」の発生期待値は0.5ターンほどなので、個数は大丈夫です。これはそもそも(*)の戦況がレアなためです(発生条件は、ライデインを撃つターンに主人公がボスに先行し、かつ、ボスが仲間を呼ぶ)

 さて、この条件で再度、計算したところ、今度は次の2つが僅差でした。

戦況(*)で「ライデイン+ククール爆弾岩のカケラ」の、トップ2

 総合評価は一気に55ほど上昇しています。(*)の戦況に付けられた評価が119ほど増加するはずで、その発生が0.5ターンですから、概算にも合致した変動です。
 また「ため2回、T_20」の戦況で、「ため」でなく「ライデイン」がありえる(というかむしろ少しだけ評価が高い)のも大きな変動です。一般に「ライデイン」を撃つほど(*)の戦況は発生しやすいため、もともとは控えめに撃つ戦術が高評価されていたのですが、「爆弾岩のカケラ」を使うなら一転して(*)は良い戦況といえるため、ここを経由しやすい戦術が高評価となってきたといえます。(実際(*)の発生ターン数は、上表の上で0.52、下で0.43)。
 まとめると、上の戦術は「爆弾岩のカケラ」の消費個数期待値が0.09個増えて、ちょっとだけ総合評価が高い、ということです。
 今度は調達コスト、40.5Gとの兼ね合いに・・・というのは冗談で、もはや誤差の範囲なので、ここで終わりにしたいと思います。

 なお以上の計算は、以下のコードを適当に実行すれば出てきます。ご自由にお使いください。

#ここから下がコード(とコメント)

1.行動:遷移ベクトルの定義

import numpy as np
 
# 1.行動:遷移ベクトルの定義
# 行動の定義
# u_ ライデインを撃つ
# t_ ため
# s_ てんばつの杖
###
# A,B,C は、それぞれ、シャドー0,3,6匹
# シャドー数でA,B,Cの各列の状態数は、4,5,6。合計15状態
# A,AA,AAA,AAAA, B,Bb,BB,BBB,BBBB, C,Cc,Ccc,CC,CCC,CCCC
# AAA は、Aでため2回、の意味
# Bは、シャドー3匹いて無傷。Bbは、3匹にダメージあり
# Cも同様。Ccは3匹にダメージあり。Cccは6匹にダメージあり
# 小文字のついた戦況、つまりBb,Cc,Cccのときは、ライデインを撃つのみ
### 
# 前提:
# ・主人公Lv26、ライデイン52想定
# ・先制率は(対ボス,対シャドー)=(1/4,1/3)
# ・シャドー呼び率は40%/ターン
### 
# 典型的な確率:
# ・ためてライデインを撃ったあと無傷のシャドーが残るのは、10%
#    「ボスに先行」かつ「仲間呼び」= 1/4 * 4/10 = 1/10 計算しやすい
### 
# ダメージの評価法
# ・ライデインを撃った場合との比較で評価
# ・「ため」た時点で、その評価を繰り入れる、「その次にライデインを撃ったらどうなるか」を評価
#    結果として、1ため:-10、2ため:+22、3ため:+58 という評価になる
#   (1ためると10損する。2回目でそれを相殺しトータルで+12になる。以下略)


##### 撃つほう 2回以上のためても、1回と遷移ベクトルは同じ
# A列
u_A   = np.array([ 6,0,0,0,  1,3,0,0,0, 0,0,0,0,0,0])/10
u_AA  = np.array([ 9,0,0,0,  1,0,0,0,0, 0,0,0,0,0,0])/10
u_AAA = u_AAAA = u_AA

# B列
u_B   = np.array([ 0,0,0,0,  0,6,0,0,0, 0,1,3,0,0,0])/10
u_Bb  = u_A
u_BB  = u_AA
u_BBB = u_BBBB = u_BB

# C列
u_C   = np.array([ 0,0,0,0,  0, 0,0,0,0, 0,0,10,0,0,0])/10
u_Cc  = np.array([ 0,0,0,0,  0,10,0,0,0, 0,0, 0,0,0,0])/10
u_Ccc = np.array([10,0,0,0,  0, 0,0,0,0, 0,0, 0,0,0,0])/10
u_CC  = u_Ccc
u_CCC = u_CCCC = u_CC

##### ためるほう Cは必ず撃つので、ない
t_A   = np.array([ 0,6,0,0,  0,0,4,0,0, 0,0,0,0,0,0])/10
t_AA  = np.array([ 0,0,6,0,  0,0,0,4,0, 0,0,0,0,0,0])/10
t_AAA = np.array([ 0,0,0,6,  0,0,0,0,4, 0,0,0,0,0,0])/10

t_B   = np.array([ 0,0,0,0,  0,0,6,0,0, 0,0,0,4,0,0])/10
t_BB  = np.array([ 0,0,0,0,  0,0,0,6,0, 0,0,0,0,4,0])/10
t_BBB = np.array([ 0,0,0,0,  0,0,0,0,6, 0,0,0,0,0,4])/10

### 天罰の杖 結局使っていない
s_AAA = np.array([ 0,0,0,10,  0,0,0,0,0,  0,0,0,0,0,0])/10
s_BBB = np.array([ 0,0,0,0,   0,0,0,0,10, 0,0,0,0,0,0])/10

2.戦略セットを定義する

Aで4通り、Bで8通りになる
ダメージの増減についてもここで
シャドーの行動回数もここで

## 戦略セットの定義 
## A の場合のセット、4通りある。ため回数の0-3の4段階に対応
# 名前 0
# 戦略 1-3
# 戦略によるダメージ増減 4-6
# シャドーの期待行動回数 7-9
list_of_tactics_A = [
    ["撃",     u_A, u_AA, u_AAA,   0, 0, 0,  0, 0, 0] ,
    ["た撃",   t_A, u_AA, u_AAA, -10, 0, 0,  0, 0, 0] ,
    ["たた撃", t_A, t_AA, u_AAA, -10,22, 0,  0, 0, 0] ,
    ["たたた", t_A, t_AA, t_AAA, -10,22,58,  0, 0, 0] ,
]
## 戦略セットの定義 
## B の場合のセット、8通り考えとく。Aとの兼ね合いで縮退するのはあるけど。

list_of_tactics_B = [
    ["撃撃撃", u_B, u_BB, u_BBB,   0, 0, 0,  3, 2, 2] ,
    ["た撃撃", t_B, u_BB, u_BBB, -10, 0, 0,  3, 2, 2] ,
    ["撃た撃", u_B, t_BB, u_BBB,   0,22, 0,  3, 3, 2] ,
    ["たた撃", t_B, t_BB, u_BBB, -10,22, 0,  3, 3, 2] ,
    ["撃撃た", u_B, u_BB, t_BBB,   0, 0,58,  3, 2, 3] ,
    ["た撃た", t_B, u_BB, t_BBB, -10, 0,58,  3, 2, 3] ,
    ["撃たた", u_B, t_BB, t_BBB,   0,22,58,  3, 3, 3] ,
    ["たたた", t_B, t_BB, t_BBB, -10,22,58,  3, 3, 3] ,
]

3.戦略の実行

32通りを代入しながら計算


## 一気に32通り

#何ターンまで見るか
N_turns = 15

#シャドーの行動1回の、ダメージ換算した値
cost_of_shadow =15

# コストのグラフ取得用
list_of_score_with_each_cost = []

# Aのループ
for tactics_A in list_of_tactics_A:

    # Bのループ
    for tactics_B in list_of_tactics_B:
        # 行列をつくる
        # A,AA,AAA,AAAA, B,Bb,BB,BBB,BBBB, C,Cc,Ccc,CC,CCC,CCCC
        P = np.array([
            tactics_A[1], 
            tactics_A[2], 
            tactics_A[3], 
            u_AAAA,

            tactics_B[1],
            u_Bb,
            tactics_B[2],
            tactics_B[3],
            u_BBBB,

            u_C, u_Cc, u_Ccc, u_CC, u_CCC, u_CCCC
            ])

        # P^nを計算。l_p[n] = P^(n+1) となる。l_pは、「累乗の結果のリスト」
        l_p = []
        P_tmp = P
        for i in range(20): # とりあえず20ターンまで計算
            l_p.append(P_tmp)
            P_tmp = np.dot(P_tmp, P)

        ## ここおまでで行列計算はおしまい。あとは情報を取り出す作業
        # print("検算:1か?",l_p[N_turns][0].sum())

        #場合分け
        print("戦術 ( A:",tactics_A[0], " / B:",tactics_B[0],")",end="\t")

        #凡例の表示
#        print()
#        print("発生ターン数:A,AA,AAA,AAAA, B,Bb,BB,BBB,BBBB, C,Cc,Ccc,CC,CCC,CCCC")

        # 1.各戦況の、発生回数を計算
        list_of_expectation = []
        for k in range(len(l_p[0])): #行列の次元数をとっているだけ
            # それぞれの状態ごとに、1ターン目から発生確率の和をとる
            tmp = sum([l_p[i][0][k] for i in range(N_turns)])
            list_of_expectation.append(tmp)
#            print(tmp.round(2),end=" ")
#        print()

        # 2.ダメージの増減を計算する
        # 各状態ごと、その戦略でのダメージの増減を、リストに
        list_of_damages = np.array([
                tactics_A[4], tactics_A[5], tactics_A[6], 0, 
                tactics_B[4], 0, tactics_B[5], tactics_B[6], 0, 
                0,0,0,0,0,0
            ])
        # 単に掛け算して、和をとるだけ
        total_damage = (list_of_damages * list_of_expectation).sum().round(1)
        
        # 3.シャドーの行動回数を計算する
        # 各状態ごと、その戦略での行動回数を、リストに
        list_of_shadows = np.array([
                tactics_A[7], tactics_A[8], tactics_A[9], 0, 
                tactics_B[7], 2, tactics_B[8], tactics_B[9], 2, 
                6,5,4,4,4,4
            ])
        # 単に掛け算して、和をとるだけ
        total_shadow = (list_of_shadows * list_of_expectation).sum().round(2)

        # 4.総合評価
        total_score = (total_damage - total_shadow * cost_of_shadow).round(1)
        print( "総:",total_score,"\tダ:",total_damage, "\tシ:",total_shadow)

#        print()

        # コストを変えて、評価する 10-20、11通り
        tmp_name_A = str(tactics_A[0])
        tmp_name_B = str(tactics_B[0])
        tmp_list = [ tmp_name_A , tmp_name_B ] # その戦略での11通りを記録
        for tmp_cost in range(10,21,1):
            tmp_score = (total_damage - total_shadow * tmp_cost)
            tmp_list.append(tmp_score)
        list_of_score_with_each_cost.append(tmp_list)


戦術 ( A: 撃  / B: 撃撃撃 )	総: -237.0 	ダ: 0.0 	シ: 15.8
戦術 ( A: 撃  / B: た撃撃 )	総: -238.8 	ダ: -13.3 	シ: 15.03
戦術 ( A: 撃  / B: 撃た撃 )	総: -237.0 	ダ: 0.0 	シ: 15.8
戦術 ( A: 撃  / B: たた撃 )	総: -249.7 	ダ: 2.9 	シ: 16.84
戦術 ( A: 撃  / B: 撃撃た )	総: -237.0 	ダ: 0.0 	シ: 15.8
戦術 ( A: 撃  / B: た撃た )	総: -238.8 	ダ: -13.3 	シ: 15.03
戦術 ( A: 撃  / B: 撃たた )	総: -237.0 	ダ: 0.0 	シ: 15.8
戦術 ( A: 撃  / B: たたた )	総: -241.4 	ダ: 24.8 	シ: 17.75
戦術 ( A: た撃  / B: 撃撃撃 )	総: -216.1 	ダ: -62.5 	シ: 10.24
戦術 ( A: た撃  / B: た撃撃 )	総: -216.7 	ダ: -70.0 	シ: 9.78
戦術 ( A: た撃  / B: 撃た撃 )	総: -255.5 	ダ: -1.1 	シ: 16.96
戦術 ( A: た撃  / B: たた撃 )	総: -260.4 	ダ: -0.0 	シ: 17.36
戦術 ( A: た撃  / B: 撃撃た )	総: -216.1 	ダ: -62.5 	シ: 10.24
戦術 ( A: た撃  / B: た撃た )	総: -216.7 	ダ: -70.0 	シ: 9.78
戦術 ( A: た撃  / B: 撃たた )	総: -227.7 	ダ: 73.9 	シ: 20.11
戦術 ( A: た撃  / B: たたた )	総: -229.2 	ダ: 81.3 	シ: 20.7
戦術 ( A: たた撃  / B: 撃撃撃 )	総: -133.5 	ダ: 24.6 	シ: 10.54
戦術 ( A: たた撃  / B: た撃撃 )	総: -133.1 	ダ: 19.3 	シ: 10.16
戦術 ( A: たた撃  / B: 撃た撃 )	総: -176.9 	ダ: 61.3 	シ: 15.88
戦術 ( A: たた撃  / B: たた撃 )	総: -182.0 	ダ: 59.9 	シ: 16.13
戦術 ( A: たた撃  / B: 撃撃た )	総: -115.1 	ダ: 92.5 	シ: 13.84
戦術 ( A: たた撃  / B: た撃た )	総: -114.5 	ダ: 88.9 	シ: 13.56
戦術 ( A: たた撃  / B: 撃たた )	総: -138.8 	ダ: 178.4 	シ: 21.15
戦術 ( A: たた撃  / B: たたた )	総: -140.2 	ダ: 182.5 	シ: 21.51
戦術 ( A: たたた  / B: 撃撃撃 )	総: -38.2 	ダ: 122.4 	シ: 10.71
戦術 ( A: たたた  / B: た撃撃 )	総: -36.7 	ダ: 119.0 	シ: 10.38
戦術 ( A: たたた  / B: 撃た撃 )	総: -84.6 	ダ: 153.0 	シ: 15.84
戦術 ( A: たたた  / B: たた撃 )	総: -88.2 	ダ: 153.9 	シ: 16.14
戦術 ( A: たたた  / B: 撃撃た )	総: -30.1 	ダ: 177.3 	シ: 13.83
戦術 ( A: たたた  / B: た撃た )	総: -29.1 	ダ: 175.0 	シ: 13.61
戦術 ( A: たたた  / B: 撃たた )	総: -65.3 	ダ: 243.4 	シ: 20.58
戦術 ( A: たたた  / B: たたた )	総: -67.4 	ダ: 246.5 	シ: 20.93

4.シャドーのコストを動かしてみる

10-20で

import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib
# Aたたた、のみ、グラフにしてみる
plt.figure(figsize=(10,8))
l_c = ["blue","blue","gray","gray","red","orange","green","green"]
l_s = ["-","--","-","--","-","-","-","--"]

for l,c,s in zip(list_of_score_with_each_cost[-8:], l_c, l_s):
    plt.plot(range(10,21,1), l[2:], "o", ls=s, c=c ,label=l[1])

#plt.plot([15,15],[50,-240],c="red",ls="--")
plt.legend(fontsize=15)
plt.xticks(range(10,21,1),fontsize=15)
plt.xlabel("シャドーの行動1回を、ダメージ換算した値",fontsize=15)
plt.show()

さいごに

 個人的にはちゃんと計算した部類の作業になったので、残しておこうと思ったのですが、説明をまとめるのが大変そうで、その予定が今のところないので、コードだけでもアップしておきます。
 世界で3人くらいの方の役に立つのかなあ…という温度感です。
では、またどこかで。
 2024.6.16 右弐

追記:6/19:
 説明を大幅に追加しました。「何を計算したのか」および「その前提」は、わかるようになったと思います。「どう計算したのか」は、コードをご覧ください。

追記:6/18: 「爆弾岩のカケラ」をつかう場合
「シャドー3匹ダメージなし、ため0」のときは、
主人公ライデイン、ククール爆弾岩のカケラ
と行動する場合、下のように変更し、3.以降を実行すれば計算できる。
なおこのとき「主人公ため、ククール爆弾岩のカケラ*」は、計算できない(シャドーが1,2匹という単位で残ることがあるため)。
ただ、普通に考えれば*の動き方が最善にはならないだろう。


#B列
#u_B  = np.array([ 0,0,0,0,  0,6,0,0,0, 0,1,3,0,0,0])/10
u_B   = np.array([ 6,0,0,0,  1,3,0,0,0, 0,0,0,0,0,0])/10 # カケラ使用なら


## 3匹無傷で、「ライデイン撃つならカケラを使用」する場合! 
# カケラ54、シャドー動くのは、残る期待値が1匹(48-96で、63以下で残る)で、後行が2/3だから。
## Bの戦略セット 

list_of_tactics_B = [
    ["撃撃撃", u_B, u_BB, u_BBB,  54, 0, 0,2/3, 2, 2] ,
    ["た撃撃", t_B, u_BB, u_BBB, -10, 0, 0,  3, 2, 2] ,
    ["撃た撃", u_B, t_BB, u_BBB,  54,22, 0,2/3, 3, 2] ,
    ["たた撃", t_B, t_BB, u_BBB, -10,22, 0,  3, 3, 2] ,
    ["撃撃た", u_B, u_BB, t_BBB,  54, 0,58,2/3, 2, 3] ,
    ["た撃た", t_B, u_BB, t_BBB, -10, 0,58,  3, 2, 3] ,
    ["撃たた", u_B, t_BB, t_BBB,  54,22,58,2/3, 3, 3] ,
    ["たたた", t_B, t_BB, t_BBB, -10,22,58,  3, 3, 3] ,
]


追記の追記:6/17 
追記6/16の懸念は、あたらなかった。
・シャドー6匹を先手で倒しても、ボスに仲間呼びを選択されるケースは見られず(5回試した)
・ゲモンと同じく「仲間呼び」の可否は、ターンの最初で判定していると思われる。

追記:6/16:
「ターン開始でシャドーが6匹いる場合、そのターンはシャドーを呼ばない」という計算になっている(仮に先手で倒して、呼ぶスペースができても)。これは間違いかもしれない。確認して、必要なら再計算。
その時の修正は、u_Ccと、u_Cccの10を、9と1に振り分ければいい。

参考情報

チラ裏DQ8攻略Wiki - テンション
http://dq8.gamedb.info/wiki/?%A5%C6%A5%F3%A5%B7%A5%E7%A5%F3テンションを上げてのダメージ計算の参考にしました。

著作権情報

このページで利用している株式会社スクウェア・エニックスを代表とする共同著作者が権利を所有する著作物及びスギヤマ工房有限会社が権利を所有する楽曲の転載・配布は禁止いたします。
© 2004 ARMOR PROJECT/BIRD STUDIO/LEVEL-5/SQUARE ENIX All Rights Reserved.
© SUGIYAMA KOBO
(公式ガイドライン http://www.dragonquest.jp/guideline/dq8/ps2/)


この記事が気に入ったらサポートをしてみませんか?