こんにちは
先日amazonで『スコットランドヤード』というボードゲームを買ってみたのですが、
思った以上に面白いゲームでした。
感想をまとめると、
セットの中に視線を隠すための帽子が入っていたり、かなりユニーク
最低2人でも遊べるので、意外と手軽
ロンドンの地形を元にしてマップが作られているので、リアリティがある
マップが双方向グラフにしか見えねぇ!!
というわけで、とりあえずルール説明をば
ルール説明
警察5人(ここでは仮に 0~4 の番号を付けておく)が Mr.X を追いつめるゲームです。
人数によっては、複数人の警察を1人でこなす必要があります。
決められた18ヶ所の地点から、ランダムに各プレイヤーの初期位置を決めます。
交通機関には、タクシー・バス・地下鉄があり、対応するチケットを使うことで利用できます。
各プレイヤーは毎ターンに一度、チケットを使って移動します。
Mr.X → 警察0 → 警察1 → 警察2 → 警察3 → 警察4 の順に行動します。
警察同士でチケットの交換等をしてはなりません。
警察は使ったチケットを Mr.X に渡します。
Mr.Xは BLACK TICKETを使えば「船」に乗れるだけでなく、タクシー・バス・地下鉄のいずれにも乗ることが出来ます。
Mr.Xは DOUBLE MOVE TICKET を使えば2回移動をすることができます。
(「警察全員を一回休みにすることができる」と言い換えられます。)
各プレイヤーは移動が可能な場合は移動をし、その場にとどまることは出来ません。
警察同士が重なってはいけません。
警察と Mr.X が重なれば逮捕したことになり、警察側の勝利となります。
22 + (DOUBLE MOVEの使用回数)ターン後に Mr.X が捕まっていなければ、Mr.X の勝利となります。
(「警察全員が移動不能になったとき」とほぼ同義)
3,8,13,18,24 ターン目に、Mr.X は移動後の位置を警察に知らせなければならなりません。
チケットの種類と、最初に各警察・Mr.X に配られる枚数は、
TICKETの種類 | 警察 | Mr.X |
---|---|---|
TAXI | 10 | 4 |
BUS | 8 | 3 |
UNDERGROUND | 4 | 3 |
BLACK | 0 | 5 |
DOUBLE MOVE | 0 | 2 |
となっています。
ルールブックを読み込んで上げてみました。こっちの説明の方が分かりやすいかもです。
ルールブック1 ルールブック2 ルールブック3 ルールブック4 ルールブック5このコンテストについて
双方向グラフを見つめていると、無性にAI作成がしたくなってきました。
とはいうものの、僕にはあまり技術もないですし、
作っても相手がいないというのは寂しいですし、
なにより他人の作るAIに興味があるので、
AIを募集します!!
どんな方でも、是非とも奮ってご参加ください!
優秀なAIを作られた方には何かある(かも)!?
競技方法
警察の部・Mr.Xの部 に分かれ、リーグ戦を行い、
それぞれの部門ごとに順位を決めます。
詳細は後ほど・・・
締め切り
締め切りは、一応ないです。 いつでもあなたのご参加お待ちしております!
仕様
ダブルムーブを使うとよろしくないことが起きるので、ダブルムーブは使わないでね☆
言語はC++です。
AIはクラスで実装して下さい。ターンごとに呼び出されます。
Mr.X、警察のどちらとも、使用メモリは32MB、各呼び出し毎の実行時間は1秒 が目安です。
(↑場合によっては、「負け」「失格」となります。)
以下ではマップを双方向グラフだと考え、頂点に 1~N の番号を付けることにします。
簡潔のため、
タ:TAXI(TICKET)、バ:BUS(TICKET)、鉄:UNDERGROUND(TICKET)、
船:船、ブ:BLACK TICKET、D:DOUBLE MOVE(TICKET)
と略すことにします。
変数名は変えていただいても構いません。
Mr.X
クラス名 : Mr_X (publicで)
メソッド名 : Mr_X_AI
引数 : 配列やvectorは参照渡しで与えられます。
型 | 引数名 | 説明 |
---|---|---|
int | N | 頂点の数 |
int | S | 初期位置の候補の個数 |
vector<int> | WAY[4][200] | 各頂点から タ,バ,鉄,船 のそれぞれによって移動できる頂点 |
vector<int> | START | 初期位置の候補 |
int | TURN | 現在のターン数 |
int | X_POS | 現在の Mr.X の位置 |
int | P_POS[5] | 現在の警察0~4 の位置 |
int | X_TICKET[5] | Mr.X が持っている タ,バ,鉄,ブ,D それぞれの枚数 |
int | P_TICKET[5][3] | 警察0~4 が持っている タ,バ,鉄 それぞれの枚数 |
返り値:vector<int>
要素数は 2 か 5
通常
{移動先, 使用チケット(タ:0, バ:1, 鉄:2, ブ:3)}
DOUBLE MOVEを使う場合
{0, 1回目の移動先, 1回目の使用チケット, 2回目の移動先, 2回目の使用チケット}
移動手段がない場合
{-1, -1}
※2回目の移動手段がない場合は、DOUBLE MOVE を使うことは出来ません。
警察
クラス名 : POLICE (publicで)
メソッド名 : POLICE_AI
引数 : 配列やvectorは参照渡しで与えられます。
型 | 引数名 | 説明 |
---|---|---|
int | N | 頂点の数 |
int | S | 初期位置の候補の個数 |
vector<int> | WAY[4][200] | 各頂点から タ,バ,鉄,船 のそれぞれによって移動できる頂点 |
vector<int> | START | 初期位置の候補 |
int | TURN | 現在のターン数 |
int | X_POS | 現在の Mr.X の位置 (3,8,13,18,24ターン目でなければ0) |
int | X_USED_TICKET[24] | Mr.X が使ったチケット(タ:0, バ:1, 鉄:2, ブ:3, 移動不可:-1) |
int | P_POS[5] | 現在の警察0~4 の位置 |
int | X_TICKET[5] | Mr.X が持っている タ,バ,鉄,ブ,D それぞれの枚数 |
int | P_TICKET[5][3] | 警察0~4 が持っている タ,バ,鉄 それぞれの枚数 |
返り値:vector<int>
要素数は 10
通常
{警察0の移動先, 警察0使用チケット, ・・・ , 警察4の移動先, 警察4使用チケット}
警察iの移動手段がない場合
警察iの移動先, 警察i使用チケット をともに -1 とする。
他に Xの出現ターンを const int APPEAR_TURN[5] = {3,8,13,18,24}; と定義してあるので、使っていただいても構いません。
参考までに補足しておくと、UNDERGROUNDでの移動方法がある地点には必ず、BUSでの移動方法があり、BUSでの移動方法がある地点には必ず、TAXIでの移動方法があります。
サンプル
main.cpp(本体&サンプルAI)
main.cpp(人間Mr.X VS AI警察)
main.cpp(AI Mr.X VS 人間警察)
in(入力データ)
※実行ファイルと同じディレクトリに「in」を置いて下さい。
提出方法
githubにアップし、そのURLをメールもしくはtwitterのDMで
ソースコードをそのまま貼付けて、メールで
githubの場合は、URLを省略・変換等せずにそのまま貼付けて下さい。
添付データでは送らないでください。
ソースコードを公開するかどうかを書いて下さい。
メールはこちら(メーラーが起動します)
twitterはこちら
その他
質問・要望・訂正等、お問い合わせはこちら(メーラーが起動します)
もしくは僕のtwitterへ