CDW マップ戦略アルゴリズムを製作中


2021年 10月 1日
 
 
 まだ全部完成してないけどマップ戦略アルゴリズムを作ってる。

 つまり CPUの挙動。

 今作はマップ生成が一番難しいかと思ったけど、やっぱりこちらの思考ルーチンの方が難しかった。
 
 

 何手先とか何マス先のような複雑なものは難しくなるので、とりあえずやらない。
 
 
1、自領の行動順

 まず、その CPUプレイヤーの領土の行動順の順列を作る。

 各領土について、その隣接する敵国の数を調べて少ない順で登録する。

 つまり行動順は「隣接する国の少ない順」になる。
 
 

 lpd(n) = n国のプレイヤーNo.

 ldl(n) = n国の隣接する国の No.が格納されてる。

 ldlg = これまた 1次元配列で ldlを扱ってるので、1つのデータの量、長さ。

 各国づつ、隣接する敵国の数を調べたら、少ない順にソート(並べ替え)してる。
 
 
 
2、行動順に攻めるかどうか決める

 *strategyルーチンは次の通り。

 繰り返しには repeatではなくて while文を使ってる、これは繰り返しを抜ける条件を反映するため。

 つまり stf=1になったら抜ける。

 処理は順に「隣接国が 1国の場合」「2マス先が自領」「2マス先が後背地」「通常」で今の所行われる。
 
 
 
3、隣接国 1国の場合は攻める

 隣接 0国の場合は無視(continue)するとして、まず 1国の場合に攻められないか調べる。

 なぜかと言うと 1国なら相手国の戦力を凌駕すれば、元の国の防衛戦力を考えずに済む。


 
 

 ec = 隣接する敵国の数

 ep = 隣接する敵国の最大戦力

 ec = 1の時、つまり隣接する敵国が 1国の場合、関数 eld1_syoに飛ぶ。
 
 
 eld1_syoのソース

 冒頭の方に戦力評価をして、戦力があるかどうかを調べてる。

 当然攻め込む国よりダイス数が多く無いといけない、第一戦力というのはダイスウォーズにある、全戦力が全プレイヤー戦力の半数以上を占めた場合は、弱小国が連合を組むというもの。

 dcbhは補正で、最大ダイスが 9以上の場合は -1、16の場合は -2個、余計にダイスが無ければ攻め込まない、というような仕組みだけど、今の所全部 -1になってる、dcbはルール上ダイスの最大数。

 8以下は 0補正なので、8個ルールの場合は関係無し、このソースの場合、普通に攻め込む国よりダイスの数が多ければ攻め込む、つまり 8個までの場合は相手より 1個、9個以上の場合は相手より 2個ダイスが余計に無ければ攻め込まない、例外としてダイス数が dcbつまり最大数の場合は同数で攻め込む。

 元のダイスウォーズだと同数でも攻め込んでいるので、この辺のルールがどうなるかは調整次第。
 
 
 次の「攻め込んだ国の隣接する敵国の戦力」は、攻め込んだ国に隣接する敵国の最大戦力。

 その戦力より攻め込んだ後の戦力が低ければ攻め込まない。

 これは攻め込んだ後に、逆に攻め込まれないため。
 
 
 gosub *battleが戦闘処理、つまりダイスを転がして勝敗を決するルーチン。
 
 
今の所、戦闘画面はこんな感じ。


 
 
 
4、2マス先が自領

 2マス先が自領というのは、こういう場合もそうだが


 
 
 隣接の場合もそう

 つまり優先的に自領を繋げるような挙動になってる。

 これはなぜかと言うと、ダイスウォーズのルールでは飛び地はダイス増に計算されない、つまり 2国と 3国の飛び地があったとしてターンエンド時のダイスの増える量は 3個になる。

 なので、なるべく自領を繋げるようにした方が強くなる。
 
 
 調べる国の隣接地の各隣接領土数の少ない順を作る。

 順列は ldpc(n)になる。
 
 
 順列順に攻撃するかどうか判断する。

 そのルーチンは #deffunc attackになる。

 これは前半と後半に分かれている。

 前半はダイス最大数より 1個以上少ない国、つまり最大数が 8個なら 7個から少ない国を攻める。

 後半は ldpc順列の先頭を選んでいるが、最大数 8個である可能性の国を攻めてる。

 つまり最初に最大数より少ない国を攻め、無ければ最大数の国を攻めるような流れになってる。
 
 
 この判断の時に、攻め込む元の国の防衛戦力を考慮する、そのルーチンは #deffunc ads_calになる。

 この中で

  if btlf=2 : return ; 2マス先が自領の場合は計算しない

 というのがあるが、これが 2マス先が自領の時なので、実はこの場合防衛戦力は考慮されない、つまり積極的に攻めるだけ。

 btlf=3 つまり後背地の場合は、攻め元の国の隣接国が、攻め元の国のダイス数と同数以下なら防衛戦力有りとみなす、これは、その国を取られても折り返し戻っても勝てる可能性があると判断するため。

 btlf=4 つまり通常の場合は、攻め元の国の隣接国の最大ダイス数まで、攻め元の国のダイスが増えて埋められるまで攻め込まない、つまりもっとも防衛を重視した判断になる。

 いずれにしても判断の仕方は変更されるかもしれない。
 
 
 充分な戦力(ダイス)があると判断された場合、戦闘 gosub *battleになる。
 
 
 
5、2マス先が後背地

 後背地って何かと言われると、地政学的に言うと港背地というか、海のようなもので陸が終わってる「端の国」という事になるけど、例えば隣接国が 1国だけでその国が終端になってるような所。

 こんな感じで矢印の元になってる様な国の事

 地政学的に言えば、後背地を取って、その地を背景に攻めていけば、後面に戦力を置かなくて済むので有利になる。

 つまり後面にも敵が居れば、普通に考えて 2正面作戦となって戦力は半分になる。

 要するに、選択肢の内できるだけ後背地から取って行くようにしてるという事。

 しかしどの国が後背地なのか判別するのは意外に難しいので、適当に隣接国の少ない順にしてる。

 
 
 
6、通常

 残りを通常としているが、めったに無い。

 大体は 2マス先が自領でガンガン攻めるし、でなければ後背地を求めるので出番は少ない。

 この場合はもっとも防衛戦力を重視するので、大抵は最大ダイス 例えば 8個の時にストックダイス + ターンエンド時の増ダイスが 8個以上のような条件でないと攻め込まない。

 多いのは残り自領が 1国の時にジッとしてるような場合なので、これはこれで機能する。
 
 
 
 以上、まだザッと出来上がったくらいの状態だが、そもそも元祖ダイスウォーズには、そういうアルゴリズムが無くて、適当に敵国よりダイス数が同数以上なら攻めてるだけのような感じなので、これだとあるいはゲーム的に難しくなりすぎるかもしれない。

 その辺の調整も考えてはいる。

コメントを残す

メールアドレスが公開されることはありません。