◇◇Code Royale 参加記◇◇


CodinGameで2018/04/21~2018/04/30の10日間にわたって行われたオンラインコンテスト「Code Royale」に参加しました!

☆結果

世界47位/2120人、日本3位/60人(Legend league)でした。 前回は日本11位/90人だったので成長を感じますね。

☆ゲームの概要

自分のQUEENに毎ターン行動の指示を出して

のどちらかを達成すれば勝ちになります。

☆戦略

基本的な流れとしては、 この試合が分かりやすいです(負けてますが)。 基本的には試合終了まで耐え切る型ではなく、相手のQUEENのHPをゼロにして勝利することを目指しました。QUEENの動き方には、3つのモードを用意しました。

○開拓モード

開拓モードは、フィールドに戦争の土台を構築するモードです。この試合では、開拓モードの終了とほぼ同時に試合終了しているので、実際にどのような動きであるか理解しやすいと思います。このモードは

を毎回行うひとまとまりの処理として埋め込んでしまおうというもので、3つのステップで進行します(下図参照)

・開拓モードでの立ち回り

試合が開始したら、まず真横に走りながらMINE→MINE→BARRACKS-KNIGHTのような順番で通りかかったサイトに建設していきます。フィールドは毎回ランダムで、真横に走りながら通りかかるサイトの数も違っているので、MINEの数などはある程度融通を利かせてあります(ステップ①)。次に、フィールドの真ん中あたりまで来たら折り返します。敵も速攻戦略をとってきていた場合、このあたりで自分のKNIGHTが敵QUEENに到達すると同時に敵のKNIGHTも自分のQUEENに到達することが多いです。QUEENの初期HPが小さい場合は、折り返し地点を少し手前にしてコンパクトな軌道で開拓モードを終えることを目指しました(ステップ②)。そして最後に、上下のサイトをすべてTOWERにしながらフィールド中段を走り抜けます。このとき敵のKNIGHTに追われているという想定なので、TOWERの攻撃範囲を拡張することにはこだわらず、とにかくすばやく大量のTOWERを立てて追っ手を殲滅することを優先します(ステップ③)。追っ手がいないようなら、自陣奥側にはTOWERではなくMINEを立てたりもしました(ステップ③)。以上が、開拓モードの一連の流れになります。開拓モード全体を通して工夫した点は、ただ真横に走るだけだと(特にステップ①で)自分のサイトに引っかかって大幅にタイムをロスしてしまうので、サイトのふちをかするような軌道で走る処理を実装しています。

○平常モード

平常モードは、開拓モードが終了したあと、敵のKNIGHTが近くにいない場合に発動する最も基本的なモードです。QUEENはニュートラルなサイトに新しい施設を作ったり、既にあるMINEやTOWERをメンテナンスしたりと平和に過ごします。このモードに入るということは早期決着に失敗しているということなのですが、その場合開拓モードで一度前線に出ているぶん相手よりHPが少ない状態であることが多いです。よって、守りに徹する立ち回りはせずに相手の防衛を崩すことを考えて行動することになります。

・平常モードでの立ち回り

平常モードでは、次にアクセスするサイトを決めるとき、常に自分のQUEENに近い順にサイトを見ていきます。最も近い順にサイトを調べて、それがすでに敵の施設があるサイトだったり、敵のTOWERの射程圏内だった場合は候補から除外します(QUEENで潰せる施設なら潰しに行く処理も入れたのですが、あまり発動する機会がなかった印象です)。自分の施設のあるサイトだった場合、それがTOWERやMINEであればメンテナンスをしますが、充分にメンテナンスされた施設(射程400以上 or 採掘量MAX)であれば候補から除外します。ニュートラルなサイトであれば、何を建設するか決めて建設します。
建設する施設の決め方ですが、評価関数を作って現在一番必要だと思われる施設を貪欲に建設しました。基本的には現在あるMINEの採掘量とTOWERの数や攻撃範囲からどちらを作るかを判定していますが、敵が4つ以上のTOWERを建設した状態で防衛している場合にはBARRACKS-GIANTを建設して敵の防衛線を崩しにかかるなど、盤面の状態を見てある程度のてこ入れをしたりしました。

○避難モード

避難モードは、自分から距離500以内に敵のKNIGHTがいる場合に発動するモードです。はじめは平常モードのみで戦っていたのですが、敵のKNIGHTが来ているときに前線に建設をしにいって死ぬ事故が多発していたので最後の1日くらいで急遽作りました。

・避難モードでの立ち回り

基本的な部分は平常モードと同じですが、平常モードでは自分のQUEENに近いサイトから見ていったのに対して、避難モードでは敵のKNIGHTたちから遠い地点A(大抵の場合、自陣奥になる)を決め、そこから近い順にサイトを見ることで事故を防ぎます。地点Aの選択は、これも評価関数でマップ上を探索して決めました。避難モードについて、上位の人々がやっているように自分のTOWERの後ろに隠れたりして逃げに専念する方向にしなかった理由は、時間がなかったというのも当然あるのですが、前述の理由から自分のHPが相手より低い状態であることが多いため、建設やメンテをして相手を攻撃し続けないと勝てないという判断からです(逃げに専念すると、相手が間断なくKNIGHTを送ってきた場合に何も出来なくなる)。

TRAINについては、KNIGHTを生産できるGoldが溜まったら貪欲に生産していきましたが、GIANTを生産したいときにはKNIGHTを生産するのは少し我慢して、GIANTを生産してからKNIGHTを相手陣地に流し込んでいきました。

☆コード

コメント含めて600行程度でした。短いですが、短ければいいというものでもないのでなんとも言えませんね。

☆まとめ

今回はTopCoderで開催されているマラソンマッチの100回目と開催期間が被っていたので、日本人MMerはそちらに行っていた人も多く、前回と比べると日本人参加者が少なかったです、とはいえ日本3位をとれたことは僕にとってはすごくうれしいことなので、次回はさらに上の順位を取れるように頑張りたいと思いました(小学生並の感想)。

トップに戻る