2018年08月03日

diplomacy移動判定プログラム3(ループ移動の罠編)

これのつづきです。いよいよラスト。
現在のフローチャートをおさらいです。

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

三角支援ユニット、被輸送支援ユニット以外の
すべての支援ユニットに対して支援を適用する。

輸送を行うユニットに関して、行動解決を行う。
このとき、被輸送支援ユニットが支援するユニットが、
輸送経路上のユニットDの位置に移動を試みている場合、
解決を行わず、後回しにする。

Dが存在せず輸送ルートが存在する場合、Dを通らない輸送ルートが存在する場合
→輸送は成功し、上記ユニットの支援はカットされる。
Dを通る輸送ルートのみが存在する場合
→輸送阻止支援ユニットの支援はカットされない。Dについて行動解決を行い、輸送の成否を判定する。
輸送ルートが存在しない場合
→輸送は失敗となる。支援はカットされない。

被輸送支援ユニットの支援結果を適用する。

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

三角支援ユニットの支援結果を適用する。

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


んで、今回は太字の部分についてのお話です。

太字の部分は一見簡単に見えますが、実は落とし穴があります。
ユニットが維持を行っている地域、またユニットが存在しない地域への移動は、
問題ありません。移動のパワーを算出して、一番大きいユニットが存在する権利を得ます。

ただし、自軍のユニットを追放することはできません。
自軍のユニットが維持を行っている地域への移動はすべてキャンセルされます。

移動したい地域のユニットが移動を試みている場合は、その移動が解決するまで解決することができません。
つまり、移動先のユニットが移動するか否かが解決している移動から、順に解決を行う必要があるわけです。

ですが、このルーチンでは解決できない移動が存在します。
それはループする形です。
最も単純なループは相互に移動を試みる形です。この場合はパワーの大きい方の移動のみが成立します。
パワーが等しい場合はSOとなります。

それでは、3つ以上の地域が回し合う場合はどうでしょうか。
実はこの移動は、パワーに関係なくすべての移動が成立します。
このようなループは別々に処理しなくてはなりません。

…ふぅ、これですべてのロジックが実装できた、と思いたい、です。
この文章が誰かの参考になれば。
ウド | 2018/08/03 19:20| Comment(0) | 日記
この記事へのコメント
コメントを書く
コチラをクリックしてください