2018年08月03日

diplomacy移動判定プログラム

めもがてら。ついき




diplomacyの移動裁定をプログラムで行うことを考える。

dipにおいて、ユニットが可能な行動は4つ。
・移動(Move)
・維持(Hold)
・支援(Support)
・輸送(Convey)

dipの判定規則は以下。
・すべての判定は同時に行われる
・説明のため、各ユニットの持つパワーを1とする。

移動について
・移動はその名の通り、他の地域に移動しようとする行為である。
・移動が可能な地域は、いまいる地域に隣接する地域である(後述の輸送の場合を除く)
・移動先のユニットが支援を行っている場合は、それをキャンセルできる(後述)
・隣接する地域とは、陸軍は隣接する陸地、海軍は隣接する海域または海岸沿いの陸地である。(詳しいルールはここでは省略)

維持について
・維持はその地域に留まろうとする行為である。

支援について
・支援は、ある行為のユニットがもつパワーを高める行為である。
・支援を受けるユニットは、ユニットのもつ力を1高める。
・ユニットAが支援をする条件は、支援するユニットBのいる地域に移動可能なことである。
 ユニットBが移動をしている場合は、Bの移動先に、Aが移動可能なことである。
・支援をするユニットはまた、その地域を維持しようとする。
・支援、または輸送するユニットも、維持と同じように支援が可能である。
・支援するユニットがいる地域に、他のユニットが移動しようとしている場合、
 その支援は無効となり、維持となる。


輸送について
・輸送は、陸軍を海を挟んだ地域へと移動させる行為である
・輸送が出来る条件は、移動元から順次移動可能なすべての海域に海軍が存在し、
 かつそれらの海軍が輸送を行うことである。
・輸送するユニットはまた、その海域を維持しようとする。
・支援と異なり、輸送する海軍に移動する軍がいても、追放されない限り輸送は成功する。
・輸送ルートを複数指定した場合、それらのどれか一つが成立すれば、輸送は成功する。

成否判定について
・ある地域に存在しようとするユニットが2つ以上ある場合は、一番パワーの高いユニットが勝利し、存在する権利を得る
・もともとその地域に存在するユニットが敗北した場合には、その地域を追放される
・パワーの高いユニットが2つ以上ある場合は、すべての移動はキャンセルされる(これをスタンドオフという)
 もともとその地域にユニットが存在する場合は、追放されない。

追放について
・追放されたユニットは、調整フェイズに於いて、撤退先を選択するか、ユニットの解体をしなければならない。
・撤退が可能な地域は移動に準ずる。ただし、追放の原因になったユニットの移動元に撤退することはできない。
・撤退可能な先が存在しない場合には、強制的に解体される。

建造について
・秋の調整フェイズ終了後、各国が専有する都市の数だけユニットの数を調整する。
・現在のユニット数より専有都市数が多ければ建造し、少なければ解体する。
 ただし、+1の場合に、1軍解体し2軍建造する、ということは不可。

これをもとにプログラムの実装を考えてみる。
追放、建造にはさしたる問題はないだろう。問題は行動の成否判定。

まず、無効な行動を排除しなければならない。
・隣接地域以外への移動(ただし、輸送の場合があるから、この判定は慎重になる必要がある)
・無効な地域への支援
・海岸沿い以外への地域への輸送
これらをキャンセルして、維持に置き換える必要がある。
ただ、このような行動をする理由は通常皆無であるから、
これは入力時にエラー判定して、入力しなおさせるかどうか聞けば良い。

いよいよ成否の判定に入れる。まず支援カットを考えてみよう。
侵入を受けたユニットは支援をカットされる。これは移動の成否に左右されない。


…が、実は例外がある。(参考)いわく、
味方ユニットに攻撃を受けた場合、移動命令はキャンセルされ、サポートカットされない。

というルールと、

支援先に指定しているユニットの移動先のエリアに存在するユニットからの攻撃を受けた場合、撃退されない限りサポートカットされない。

そして、

輸送される陸軍の移動先に存在するユニットが移動に使用する海軍ユニットに対する攻撃を支援している場合、輸送される陸軍はこれをサポートカットできない。
ただし、別のルートでの輸送経路が有効であるなら輸送された経路とは別の経路の輸送ユニットを攻撃するユニットを支援するユニットのサポートをカットすることができる。


文章だとなんのこっちゃなので図解していこう。

[画像1]
まずひとつめ。これはわかりやすい。
この移動が成立することはない。まぁ普通は維持支援をするだろう。
プログラム的には、移動先にいるユニットが移動ユニットと同国かどうかをみてやればいい。難しくない。

[画像3]
先にみっつめ。これは文章で書くと長いが、図にしてみるとそこまで複雑でもない。
成立する輸送経路を判定して、輸送経路に存在するユニットへのカットは無効だと判定してあげればいい。
…ただ、さらっと言ったが、実装は結構大変そう。
輸送が成立しない場合は、そもそも移動が成立しない。

[画像2]
最後に二つ目。これが非常にややこしい。
というのも、支援カットの判定より先に、支援するユニットの存在地域における移動判定を行わなくてはならないからだ。
このような支援ユニットはピックアップして、先に判定しなくてはならない。
なお、支援ユニットが他の地域からも移動を受けている場合は、支援はカットされる。

これで支援カットに対する裁定は以上。今の所のフローチャートを簡単に図示する。

すべての輸送を用いて移動するユニットに対して、輸送経路を確定する

支援するユニットAをピックアップし、Aのいる地域に移動を試みるユニットBがある場合、
Aの支援をキャンセルする。ただし
「Aのいる地域に移動するユニットが、Aと同じ国のユニットであった場合」
「Aが支援するユニットCが、Bの輸送経路に移動を試みている場合」
「Aが支援するユニットCが、Bのいる位置に移動を試みており、なおかつB以外に移動を試みるユニットがない場合」
を除く。3つめに関して、ユニットAを記録し、便宜上「三角支援ユニット」とよぶ。

三角支援ユニット以外のすべての支援ユニットに対して支援を適用し、ユニットのパワーを算出する。

三角支援ユニットのいる地域の行動解決を行う。

三角支援ユニットの支援結果を適用し、ユニットのパワーを算出する。

すべての地域に対して行動解決を行う。

まだ考えるべきことはあるのだが、今回はここまで。


ウド | 2018/08/03 17:19| Comment(0) | 日記
この記事へのコメント
コメントを書く
コチラをクリックしてください