Codingame - CODERS OF THE CARIBBEAN 参加記

 

 

CODERS OF THE CARIBBEAN、タイトルからして海を連想させますね。

今回は船から大砲を撃って敵を倒すゲームです。

今回の順位は世界66/3623位日本5/69位でした。

↓ゲーム画面

www.codingame.com

 

今回のゲーム

・2人プレイ、ターン進行系、六角形タイル状マップのゲーム

・1人で1〜3隻の船を操作する

・船は地雷の設置や大砲の発射、船自体を衝突させるなどができる

・船は常に燃料を消費し、尽きたら沈む

・海に散りばめられている樽を回収すると燃料が補充できる

・相手の船を全て沈めれば勝ち

というものです。

 

実装したアルゴリズム

基本方針

船1隻に対して個別に2ターン先までを全探索(残り1隻のときは3手先まで)。

1ターンで船1隻が行える行動は、待機、加速、減速、左旋回、右旋回、大砲の発射の計6パターンと見て実装。

最初は3隻の移動パターン全ての全探索(1ターン:6×6×6=216通り、2ターン:216×216=46656)を実装したが、処理制限時間である50msを越えてしまうため、このような(6×6×3(隻))^2=11664通りで省略する形となった。(1ターン先しか読まないと詰み攻撃を回避できないため、2ターン先読みは外せない)

 

移動系

基本は近い樽に向かって移動。燃料を相手より多く保持するかが重要なため、意図的に樽を入手するタイミングは遅らせたりしている。

次ターンで敵攻撃の被弾(地雷や大砲)が確定してしまうタイルには触れない。

樽を全て回収した後は、敵の船に近づかせる。

何かあった時すぐ移動できるように、船の前方は空きタイルを保つ。

マップの端にいるにも関わらず、船がマップ外の方向に向いていたらペナルティ。(逃げ道が確保できない)

 

攻撃系

大砲の発射は、敵がそのまま真っすぐ進んだ場合の場所を狙う。

地雷も設置出来るが、戦略的な重要性が良く分からず実装はやめた。

自分より相手の近くにある樽に対しても大砲で狙い、敵の樽回収を妨害する。

 

生贄

実は燃料を残したまま被弾して一気に燃料0になると、その場に樽を残していく。その樽をうまく回収すれば自分の燃料がまた増え、相手より長く生き続けられる。これを狙うためにわざと自分自身を攻撃してその場に樽を出現させる戦術がある。(生贄)

樽を全て回収した時点で相手の方が燃料が多かった場合、自分の船1隻を生贄に捧げる。

 

感想

コンテスト期間10日間中95時間もかけてこの結果なので、正直なところ惨敗という感じです。

シミュレーターのバグを除去することに手こずり、勝利要素の考察に時間を使っていませんでした。(結局コンテストが終わってもバグは無くならなかった)

ランキング上位の動きを見てみると、いかに詰み攻撃をするかという攻めの戦略をしてましたが、私が必死で実装してたのはどのように敵より長く生き残るかと言った守りの戦略でした。上位陣の試合は常に見れるはずなのに目の前のバグに四苦八苦して、考察を疎かにしたことが敗因です。

 

改善点を挙げるならば、目の前にあるバグを完全に除去することよりも新しい機能・戦術の実装を優先すべきである、といったところでしょうか。

次回も頑張ります。