かがみのくに

ゲームを中心にかがみさんの興味の対象を適当に。

全自動PBeMディプロマシー卓命令判定プログラムについて考えてみる(1)

2004年11月29日 18時35分43秒 | アナログゲーム
さて、本稿ではディプロマシーの自動判定スクリプトの作成についてまじめに検証していくことにする。

実は既に先人が同様のことをしているわけだが、あくまでローカルで稼動するアプリケーションに過ぎず、行動計画の提出と判定の間にどうしても人の手の介在を必要とする。
これは私が目的とする全自動PBeMディプロマシーの理念にはそぐわない、web上で稼動するにはCGI、PHPなどでの構築が必要である。よって上記のアプリケーションのことは今回は忘れていただきたい。英語読めないし。


さて、早速アルゴリズムの話に取り掛かりたいところではあるが、その前に下準備が必要である。すなわち、エリア同士の接続関係を設定するマップを用意しなければならない。ここでいうマップとは絵地図のことではなく、プログラムに読み込むための記号の羅列のことを指す。
これは、各エリアに番号を振り(アルファベット順が妥当であろうか)、それにエリア略称、エリア名、接続するエリアの番号等を関連付ければよいだろう。
純粋な接続マップのほかに、陸軍から見た接続マップ、海軍から見た接続マップもそれぞれ用意する必要がある。
陸軍はこれで問題ないが、海軍には例外となるエリアが3つ存在する。すなわち、南岸と北岸に分かれるスペイン、サンクトペテルブルグ、ブルガリアの3カ国に関しては、若干特殊な処理が必要になる。ここでは各エリアの南岸と北岸を別のエリアとして扱い、それぞれのエリアを元のエリアに関連付けすることにする。


下準備が完了した所でいよいよアルゴリズムの検証に取り掛かろう。
まずは何はともあれ無効な命令を判別し、キャンセルしなければならない。
維持・輸送に関しては、ここでは矛盾の判定は行わない。なぜならば、維持はそもそも矛盾の起こりようがないし、輸送は輸送されるユニットの移動命令に関連して判定されるべきだからである。
移動・支援に関しては、ありえない場所への移動、ありえない場所への支援をキャンセルしなければならない。ガミラス戦法は許されないのである。
「ありえない」移動や支援のチェック方法は前述の下準備で作成したマップデータを使用する。そのユニットの移動できる隣接エリアにしか移動、支援を行うことができない、というルールであるので、マップを参照し「命令を受けたユニットの影響先が移動できないエリアであったら、命令をキャンセルして維持に変更」とすればよい。
ここでひとつ問題がある。輸送を介して移動する陸軍である。輸送を介して移動する陸軍は海を越えて移動し、輸送を介して移動する陸軍を支援するユニットは海を越えた陸軍ユニットを支援先のユニットの移動元として指定しなければならない。
これらの命令が矛盾しているかどうかを判別するには、輸送を介して移動しようとしているユニットの移動先までの移動経路が、本当に完成しているかどうかを判別せねばならない。

輸送経路の可否は以下の手順で判定することができる。
まず輸送される陸軍ユニットに隣接する海軍の存在する海域エリアをリストアップし、その海軍ユニットが輸送される陸軍ユニットを隣接エリアに輸送する命令を出していればその隣接エリアを参照し、それが沿岸エリアなら輸送経路が完成、海域エリアならその海域エリアに海軍がいれば・・・を、沿岸にたどり着くか輸送線が途切れるまで続ける。途切れていれば輸送失敗。沿岸までつながっていれば輸送成功(の可能性がある)である。
輸送に失敗していればその陸軍の移動命令はキャンセルされ、維持状態となる。

以上のアルゴリズムで陸軍の状態が決定したら、続いてその陸軍を支援しているユニットの状態を決定する。すなわち、支援範囲外の維持状態の陸軍を支援していればその支援は失敗し、維持状態となる。


そろそろげんなりしてきたが、この程度で挫折しているようでは全自動PBeMディプロ卓の野望の成就はおぼつかない。断固たる意志を持って次の命令の解決のプロセスに進もうと思う。

命令は基本的に、維持、移動、支援、輸送のうち、他の命令に影響されない場所から順に解決していく流れになる。が、ほとんどの命令は他の命令の結果如何によって影響を受ける。このため、単種の命令でも命令書から読みとれる状況によって細分化し、十数ステップ、あるいは数十ステップに分けて解決することにしよう。

では、最初に解決すべき命令はなんだろうか。4種の命令の中で、もっとも確実に実行されるのは移動である。移動は将来的に行動の成否にかかわらず、移動自体は確実に行われる(例外もあるが)。そして移動にもっとも影響を受けるのは支援である。移動の成否にかかわらず支援命令を受けているユニットが攻撃を受けた場合、支援命令はキャンセルされる(これにも例外がある)。
以上の2点より、最初に支援命令が無効になるかどうかの判定を行うことにする。

上で「移動先に指定されたエリアにいる支援命令を受けているユニットの支援はキャンセルされる」と書いたが、これには3つの例外となるルールが存在する。すなわち、

味方ユニットに攻撃を受けた場合、移動命令はキャンセルされ、サポートカットされない。

というルールと、

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

そして、

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

の3つである。
こうち後の2つは支援の可否の判定が他の部分の判定に依存するため、後のステップで行わなければならない。

以上より、支援命令を受けているユニットは、

1.味方の移動先に存在する支援命令を受けたユニット。

2.輸送された陸軍の移動先に指定された、左記の陸軍を輸送する海軍ユニットに対して移動命令を受けているユニットに対して支援命令を受けているユニット。

3.上記以外の輸送された陸軍の移動先に指定されたエリアにいる支援命令を受けたユニット。

4.自身が支援しているユニットが移動先に指定しているエリアに存在するユニットの移動先として指定されているユニット。

5.その他の支援命令を受けているユニット。

の5種類に分類しなければならないもうやめていいですか。

だいぶ厭になったので今日はここまで。多分続く!

コメント   この記事についてブログを書く
« web上でディプロマシーを主催... | トップ | もはや歴史フェチなのか・・。 »
最近の画像もっと見る

コメントを投稿

アナログゲーム」カテゴリの最新記事

関連するみんなの記事