下記の日時に開かれた競技プログラミングコンテスト、AtCoder「第一回マスターズ選手権」の備忘録です。
結果
予選:41/182位、本戦:5/56位でした。※有効回答者のみカウント。
初のオンサイト出場 & 入賞ができ、たくさんの方と出会えた記念に参加記を書きます。
お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「SPRING CHALLENGE 2023」について、ルール要約を紹介します。
※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/ide/challenge/spring-challenge-2023
コンテスト期間:5月25日~6月4日
あなたはロボットアリを上手く誘導し、相手より多くクリスタルを集めて下さい。
ロボットアリは直接操作できず、設置するビーコンに反応して移動します。
フィールド上の全クリスタルの過半数を取得、もしくは100ターン経過時点でより多くのクリスタルを所持しているプレイヤーが勝利します。
あなたは毎ターン以下のアクションを取ることができます。 アクションは出力した順に実行され、実行不可のものは無視されます。 1ターンの間にセルにおけるビーコンはひとつまでです。
フィールドは、六角形のセルで形成され(ヘキサグリッド)、中央を起点として点対称に生成されます。フィールドの大きさは、中央からの横幅が4~7、高さは横幅の60%未満となります。
フィールドのうち、10~20%の確率でセルが消去されます。消去されたセルには移動不可となります。
図. 最小のフィールド(上)と最大のフィールド(下)
各セルは3種類(type)に分類されます。戦闘の数字はゲーム開始時に各セル与えられる区分値です。
また、type=0のセルのいずれかに各プレイヤーの拠点が設置されます。
拠点は1つ、もしくはBronze以降は33%の確率で2つ設置されます。
両プレイヤーは、自分の拠点に数匹のロボットアリが配置された状態でスタートし、ビーコンを設置しロボットアリを誘導することができます。
プレイヤーは1ターンに何個でもビーコンを置くことができますが、1つのセルに1個ずつしか置くことができません。
設置するビーコンに任意の強度を与えられ、それぞれのビーコンの強度に応じて誘導するロボットアリの割合を決められます
例:全ビーコン強度が1だと、各セルに均等になるようロボットアリが移動します。
ビーコンに対するロボットアリの移動は以下のロジックで決まります。
資源を取得するには、資源のあるセルと自分の拠点との間に、自身のロボットアリが存在するセルが途切れることなく連鎖している必要があります。
1ターンに取得できる資源の量は、その連鎖の中でロボットアリが最も少ないセルのロボットアリの数と同じになります。
図. この連鎖はクリスタルを4取得する
資源の取得量は、クリスタルでも卵でも同じ処理です。
卵を取得した場合、取得した数と同じ数のロボットアリが次のターンの開始時にそのプレイヤーの拠点に産まれます。
プレイヤーごとに複数の拠点があるゲームでは、収穫チェーンに存在する拠点に関係なく、追加のアリはそれぞれの拠点に生まれます。
取得量は資源ごとに別々に処理され、複数の経路が考えられる場合はジャッジ側で取得量が最大になる連鎖が自動的に選ばれます。
※Bronzeから開放されます。
※2023/05/26 18時現在、以前まで動作していなかった本仕様が修正されました。
プレイヤーの資源取得は、相手のロボットアリによって妨害されることがあります。
資源取得を処理する時に両プレイヤーが資源取得可能な状態の場合、取得可能量(つまり連鎖経路のうちの最小アリ数)を計算し、低い方のプレイヤーは資源取得ができなくなります。
※取得可能量が同数の場合、両プレイヤーが資源を取得できます。なお、十分な量の資源がなくとも取得可能量そのままの値を受け取ることになります。
お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「FALL CHALLENGE 2022」について、ルール要約を紹介します。
※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/contests/fall-challenge-2022
コンテスト期間:12月13日~1月6日
あなたはロボットを操作し、相手より資材が残る陣地を広げて下さい。
ロボットは資材の残るマスでしか生存できず、新たなロボットを生産するには資材が必要です。
あなたは毎ターン以下のアクションを好きなだけ取ることができます。 アクションは出力した順に実行され、実行不可のものは無視されます。
フィールドは、幅12~24、高さ6~12のマスからなり、各マスには0~10の資材が設定されています。
各マスは初期状態はどちらの陣地にもなっていないニュートラルな状態であり、最後に通ったロボットの所有プレイヤーの陣地となります。
各ロボットの移動処理は同時に行われ、同じマスに異なるプレイヤーのロボットが移動した場合、存在するロボットの数分だけ相殺されます。
建設(BUILD)コマンドによって、あなたの陣地のうち、ロボットのいないマスにリサイクル施設を建設します。
リサイクル施設は自身と上下左右の合計5マスから、毎ターン1ずつ資材を回収します。資材の無くなったマスは通行不可となり、リサイクル施設のあるマスが資材0となった場合、リサイクル施設は消滅します。
ロボットは初期に4体与えられ、1体につき資材10を消費して好きな陣地に生産することが可能です。ロボットは各ターン毎に1マスずつ移動することができますが、生産されたターンは移動ができません。移動先は資材が残っているマスのみとなり、リサイクル施設によりロボットのいるマスの資材が無くなった場合、ロボットは消滅します。
以下の状態となった時、ゲームが終了し多く陣地を保有しているプレイヤーが勝利します。
2022/12/13 3:00時点で、ブロンズリーグでルール開放がされませんでした。
2022/12/20 0:00時点で、シルバーリーグでルール開放がされませんでした。
2022/12/24 0:00時点で、ゴールドリーグでルール開放がされませんでした。よってルールはそのままの可能性が高いです。
現状のルールはあまりにシンプルでコンテストとして成立しておらず、今後のルール追加の可能性があります。
例えば、ジャッジコードに複数人の実行可能性が記載されており、3人以上のプレイヤーによる同時バトルの可能性があります。また、 コストを支払って任意のマスにワープするアクションが存在していることが確認できています。ワープ機能は今後も使われないと公式から連絡がありました。
お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「GREEN CIRCLE」について、ルール要約を紹介します。
※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/ide/challenge/green-circle
コンテスト期間:6月16日~6月27日
本ゲームは、スキルカードを揃えて相手より早く5つのアプリケーションをリリースした方が勝ちです。 元となるボードゲームはこちらのようです。 https://okaluda.fr/samsara-le-jeu/
あなたはハッカソン参加しました。アプリケーション開発における各種作業を適切に行い、相手チームよりも効率的に5 つのアプリケーションをリリースして下さい。
ゲームでは8つの作業場所が存在し、プレイヤーは各作業場所を周りながら成果(スキルカード)を収集、収集したスキルカードを使用することでアプリケーションをリリースする。 各作業場所は以下の名称で、括弧内はゲーム内ID。
右から順に時計回りに作業場所が置かれている。
収集したスキルカードはデッキに格納される。
所持しているスキルカードは自由に使えるわけではなく、手札・デッキ・墓地の3つの場所があり、手札にあるスキルカードのみ扱える。 各プレイヤーは自身のターン終了時に手札を全て捨て、デッキから所定の枚数(標準4枚)を引く。 カードを引く際に山札が無かった場合、墓地のカードをデッキに戻し、シャッフルした上で引く。
スキルカードは10種類存在する。
各8つの作業場所に対応する8種類の基本カードの他、ボーナスカードと負債カードがある。
各スキルカードが手札にある場合、アプリケーションのリリースに必要な作業スキルを生み出すことができる。
基本スキルカードはそれぞれの作業に応じた優良スキルを2つ、オールマイティな粗悪スキルを2つ生み出す。※スキルの優良/粗悪については後述
ボーナスカードはオールマイティな優良スキル1つ、粗悪スキルを1つ生み出す。
負債カードはスキルを生み出さない。
ゲーム開始時に12種類のアプリケーションが指定される。アプリケーションは以後追加されない。 各アプリケーションには8つの作業に応じた要求スキルが設定されている。 手札のカードから生み出せるスキルが要求スキルを満たしている場合、そのアプリケーションをリリースできる。 アプリケーションのリリースは自身のターンで1度のみである。
アプリケーションをリリースする際、優良なスキルと粗悪なスキルをそれぞれ使用できるが、粗悪なスキルを使用する場合はデメリットが発生する。 アプリケーションのリリースにおけるスキル消費は以下のように処理される。
また、最後の5つ目のアプリケーションは、粗悪なスキルを用いてリリースはできない。
基本のスキルカードが手札にある場合、1枚だけスキルを使用し、特別な効果を得ることができる。
各プレイヤーは作業場所を移動しながらスキルカードを集める。 自身のターンの初めに必ず移動しなければいけません。また、相手プレイヤーの作業場所、もしくはその隣接した作業場所に移動した場合、負債以外のカードを1枚相手プレイヤーに渡さなければいけない(コロナの迷惑料という設定)。手札に負債カードしかなく、迷惑料を支払えない場合負債カードを2枚取得する。 移動に際し、作業場所IDが小さくなる移動をした場合、手札にある負債以外のカードを2枚除外しなければいけない。除外できなかった場合、その数に応じて負債カードを取得する。
REFACTORING (7) → TRAINING (0) の移動
※つまり時計回りに作業場所を周り、1週したら通行税を払う必要がある。
各プレイヤーは交互にプレイする。
アプリケーションは大きく2種類存在する。
大小のアプリに必要なスキルは予め決められた組み合わせがあり、IDはゲームが異なっても共通の番号が振られる。ブロンズリーグ以降は大アプリのみとなる。
2022/06/21
既知のバグが修正されました。TRAINING/CODING の追加スキル使用が正常化。DAILY_ROUTINE 使用時の無移動が不可に。通行税を払う際、同種2枚のスキルカードを保持していると1枚の支払いとなっていた不具合が解消。
また、visualizerのツールチップ情報として、アプリケーショ一覧が見えるようになりました。
https://www.codingame.com/forum/t/contest-green-circle/196455/77
2022/06/18 一度使用したスキルカードは脇に置かれ、ターン終了まで墓地に送られないようになりました。 これにより、一部スキルの無限ループは解消されます。 https://www.codingame.com/forum/t/contest-green-circle/196455/39
2022/06/17 各種処理の発生が不安定だったり、一部のスキルを無限に使用できるなど、ゲームの不具合が見つかっています。 以下のフォーラムにて参加者からFBがなされているので、順次対応される見込みです。 www.codingame.com
お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「Spring Challenge 2022」について、ルール要約と予め設定されている内部パターンについて紹介します。
※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/contests/spring-challenge-2022
コンテスト期間:4月21日~5月2日
本ゲームは、拠点を守りつつマップ上に現れるモンスターになるべく多くのダメージを与えた方が勝ちです。
各プレイヤーは3体のヒーローを操作し、マップ端から出現するモンスターを倒して下さい。モンスターが自分の拠点に到達するとダメージ1回受けます。自分の拠点が3回ダメージを受けると負けとなります。 相手プレイヤーが先に3回ダメージを受けるか、220ターン経過時に相手より受けたダメージが少ない場合、あなたが勝利します。 なお、受けたダメージが同じ場合、各プレイヤーは拠点外でモンスターに与えたダメージ量の多いほうが勝者となります。
X=0、Y=0を左上、X=17630、Y=9000を右下のピクセルとする長方形のマップ上でゲームを行います。 wood2ランクまでは、マップ全域の視界を得ていますが、wood1以降は自分のヒーローから2200ユニット以内、または自分の拠点から6000ユニット以内の視界のみとなります。
各エンティティ(ヒーロー、モンスター)は、衝突せず、同じ座標に存在することができます。
毎ターン、あなたは各ヒーロー毎のコマンドを出力して下さい。ヒーローは以下のコマンドのいずれかを実行することができます。
互いのヒーローにはダメージを与えられません。 ヒーローの移動後、800ユニット以内にいるモンスターに2ポイントのダメージを与えます。
モンスターは、プレイヤーの拠点以外のマップ端から点対称にランダムで出現します。出現時にランダムで定められた移動方向に毎ターン400ユニットの速度で一直線に進みます。点対称の対になるモンスター同士は、移動方向も点対称となります。全てのモンスターには一定のHPが定められており、ヒーローからのダメージでHPが0になったモンスターは消滅します。
ターン終了時に拠点から5000ユニット以内にモンスターがいた場合、その拠点を目的地として移動方向を変更します。ターン終了時にHPが0でないモンスターが拠点から300ユニット以内にいると、そのモンスターは消滅し、拠点に1ポイントのダメージを与えます。 なお、WINDコマンドでターゲットされた拠点の半径外に押し出された場合、再度ランダムに定めた移動方向に移動し始めます。
ゲームのターンが進むにつれ、モンスターの初期体力はわずかに多くなることがあります。
あなたのヒーローがモンスターにダメージを与えるごとに1ポイントのマナを獲得する。HPが0のモンスターからでも獲得する。 獲得したマナ10ポイントを消費することで、あなたのヒーローは1つの呪文を唱えられる。
ゲーム中のモンスターは下図赤丸の4点から発生します。実際の発生地点はy軸方向に799マップ外に進んだ点となります。
各点から初期体力10のモンスターが1匹/5ターンの速度で発生し、10ターン毎に初期体力が+1されます。 200ターン経過後、サドンデスモードとなり、発生するモンスターは各プレイヤーの拠点をより狙うようになります。
一般的に最短経路を求める場合はダイクストラ法が用いられます。ダイクストラ法は元来たルートを意識しないことで高速に計算できる反面、現実世界において進行方向を変える場合に発生するコスト(減速や車線変更、信号待ち等)が考慮できません。今回、AtCoderのヒューリスティックコンテスト「AHC003」を題材に、カーブ時のペナルティを考慮できる経路探索アルゴリズムを考えてみたので紹介します。
コンテストページ:https://atcoder.jp/contests/ahc003
こちらです。https://atcoder.jp/contests/ahc003/submissions/23029917
当該処理を行っているのは fn solve() の部分です。
一般的なダイクストラ法では、下図の場合に問題が発生します。
1マス進むとコスト1かかるとして、コスト0のスタート地点から上右と来た場合と、右上と来た場合に、どちらかの進行しか保持できず、"↑"と"→"のマスのコスト値が実行順序によって大きく異なってしまいます。※移動コストが等価であれば計算を進めることで正しい値が得られますが、コストが等価で無い場合は正しくない結果になる場合があります。
今回は、下図のように直進できる所までやりきってしまい、更新可能な場合どこから進んできたかを別のgridに保存します。
移動コストが等価の場合だと有り難みがわかり難いですが、それぞれ異なる移動コストの場合、あるマスは上移動で来るのが最短だが、すぐ隣の別のマスは右移動で来るのが最短、というのをそれぞれ保持できて嬉しいです。
AHC003では、理論値を100%とした際、一般的なダイクストラ法にカーブ時ペナルティを加えたもので93%、上記工夫を行うことで96%と、3%スコアアップしました。もちろん、そもそもの盤面推定の方が重要な問題ですが、雑な盤面推定でもそこそこのスコアが取れたので、学びを得ました。
お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「Spring Challenge 2021」について、公開されている情報から問題を予想しようという遊びです。
コンテストページ:https://www.codingame.com/contests/spring-challenge-2021
コンテスト期間:5月6日~5月17日
なお、コンテストが始まっていないので、この記事を読んで得られる情報は特にありません。
本記事はコンテスト開催が待ち切れない沼先案内人の妄想を書き起こしたものです。筆者は本コンテスト関係者と一切の関わりを持ちません。また、CodinGameではコンテスト内容や自身のアイディアに関する言及が許されており、本記事が万が一当たってたとしても問題は無いという考えの元、公開しております。
もし本記事によりコンテスト開催に支障が生じる場合、すみやかに削除いたします。
それでは早速はじめましょう。
「楽しいよ」 https://t.co/4Nh0TUYsF6
— ツカモ (@tsukammo) 2021年3月25日
コンテストのtopページを見るに、ルールはいつも通り11日間、コンテスト名も記号的な「Spring Challenge」のため、top画像が唯一の手掛かりです。
この画像から、モチーフがスタジオジブリ制作の映画「となりのトトロ」であることがわかります。
CodinGameはゲームAIコンテストサイトなので、過去にぷよぷよやボンバーマンなどがコンテスト化されましたが、トトロはそもそも映画なのでそのままコンテストにはなり得ません。そこで、"トトロ ゲーム"で検索をかけるとこんな商品がヒットしました。
2~4人用のボードゲームのようです。奇しくもCodinGameのプラットフォームの仕様と同じです。ボードゲームといえば、前回のコンテストのFall Challenge 2020では、下記のボードゲームがモチーフとなっていました。
センチュリースパイスロードの日本販売元は株式会社アークライトで、トトロのどんどこゲームのゲームデザイン会社と同じなのですが、センチュリースパイスロード自体はカナダの Plan B Games という会社が開発したものなのであまり関係は無さそうです。 とはいえ他に選択肢が無いので、このボードゲームがモチーフになると仮定して問題を予想します。
トトロのどんどこゲームのルールはこちらにインストが公開されていました。以下は、トトロのどんどこゲームのルールをご理解いただいているという前提で進めます。
人間がプレイするボードゲームでは、ゲーム性を高めるために確率的な事象の発生、つまりサイコロを振るという操作がなされます。トトロのどんどこゲームでは、所謂"すごろくゲー"と呼ばれるサイコロの出目で駒を進めるゲームデザインとなっています。ところが、明確に優劣を付けたいゲームAIコンテストにおいて、不公平な確率の介在はいたずらに必要な試行回数が増すだけです。私の記憶にある限り、過去のCodinGameにおいてアイテムやマップ生成など、互いのプレイヤーに公平に影響する要素に確率が介在することはあれど、提出された各botの出力内容自体に確率が介在するようなゲームデザインはありませんでした。
このような場合に、過去のコンテストでは同時着手ゲームにアレンジされることが多かったです。同時着手ゲームの場合、互いのプレイヤーの行動に差異が生まれるよう、じゃんけんの要素を入れる必要があります。前々回のコンテストでは、パックマンをモチーフとし、文字通りじゃんけんのグーチョキパーの属性に変わる行動が可能でした。これによりプレイヤー間の読み合いが発生し、ゲーム性が生まれます。
しかし、モチーフ上トトロにはそのようなじゃんけん要素が存在しません。小トトロ達がじゃれ合うのは微笑ましいですが、足を引っ張り合うのは見たくないものです。どうしたらよいでしょうか。
人間は忘れる生き物です。トトロのどんどこゲームでも、得点となるどんぐりをたくさん得るため、相手プレイヤーの手札から神経衰弱のように目当ての探し物カードをめくる操作があり、記憶力が問われます。一方、プログラムはメモリの許す限り覚えておけるため、記憶力を問うても優劣は付かないでしょう。
さらに、トトロのどんどこゲームでは一度公開された探し物カードは全プレイヤーが利用可能です。そのため、もっともどんぐりの獲得数が多い探し物が決まってしまい、各プレイヤーは勝つためにそれしか選択しない状況が生まれます。探し物のひとつであるトウモロコシは、いくら劇中で物語のクライマックスに繋がる重要なアイテムとはいえ、ルール上高得点だからとそればかり選ばれてしまうと、もうひとつの探し物である傘を届けてもらえなかったお父さんは、雨の中一人寂しくずぶ濡れで帰ることになってしまいます。どうしたらよいでしょうか。
トトロのどんどこゲームは、あるプレイヤーがどんどこ踊り行ってクスノキを7段登るとゲーム終了となります。サイコロによる確率的な事象であればよいのですが、自由にマス目が選べる状況ではどんどこ踊りは踊り得となってしまい、ゲーム性を失ってしまいます。かといって、どんどこ踊りよりどんぐりの獲得数が多い行動とのトレードオフとなるようなデザインにしてしまうと、どんぐりの多さで勝敗が決まるというルール上、どんぐり集めに傾倒しクスノキを一切登らない無敗戦略が生じてしまいます。
前回のコンテストでは、モチーフとして素材を集めて完成品を作るゲームとなっており、スコアを稼ぐにはポーションを作成する必要がありますが、同時に6本目のポーションが完成した時点でゲーム終了となります。そのため、勝敗条件とスコア獲得が連動しており、スコアの低くて簡単に作れるポーションを作るか、簡単には作れないがスコアが高いポーション作るかのトレードオフが発生しました。どんぐりを集めつつ、クスノキを登ることを避けられないようにするには、どうしたらよいでしょうか。
これまでの考察から、トトロのどんどこゲームはゲームAIコンテストにするには根本的なゲームデザインが不向きであることがわかりました。正直とても困りました。しかし、遊びとはいえここで投げ出すわけにはいきません。モチーフを尊重しつつ、ゲーム性が生まれるデザインにするため、他のボードゲームについて頑張って調べました。すると、サイコロを振らない"すごろくゲー"を見つけました。
Tokaidoというこのゲームは、各プレイヤーが自駒を任意のマスに進めることができます。ゲーム性を生むため、以下のような工夫がなされています。
このルールをトトロのどんどこゲームに当てはめてみると、モチーフを活かしたまま、ゲーム性を生むことができます。
やったぜ。
コンピュータゲームは、人間によるプレイに比べて非常に高速に行動の処理を行えます。 そのため、元のゲームでは12マス・6種類の探し物・7段のクスノキ・中トトロ1匹でしたが、特にゲーム盤のマス目や中トトロの数に関しては拡大の余地が大きいと考えます。また、事前にすべてのマスが公開されてしまうとゲーム性が薄れるため、一定マス以上は公開されず、近付くことでマスの種類がわかるようなデザインも可能です。
以上より、Spring Challenge 2021 の問題を以下のように予想します。
小トトロを操作しなるべく多くのどんぐりを集める4人ゲームです。各プレイヤーは、自分のターンに小トトロをいくつ進めるか出力して下さい。ただし、止まる先のマスに定められた定員を超えてしまう場合はエラーとなります。
勝利条件は、すべての小トトロがゴールに到達した時点でゲーム終了となり、最も多くのどんぐりを持っているプレイヤーが勝者となります。
マスの種類は先頭の小トトロから5マス先まで確認することができ、全部で6種類のマスが存在します。小トトロがそのマスに止まった際、そのプレイヤーは予め定められた探し物カードを入手し、すでに獲得した同種のカードに記載された獲得どんぐり数との合計値だけどんぐりを入手します。
各マスには種類の他に、同時に止まれる定員が定められています。定員を超えてそのマスに止まることはできません。
ゴールに対し最も遠いプレイヤーが操作を行えます。操作後もゴールに対して最も遠い場合、連続して操作を行います。同一マスに複数のプレイヤーがいる場合、そのマスに訪れたターンが遅いプレイヤーから先に操作を行います。ゲーム開始時の順番はランダムに定められます。
ゲームAIコンテストが大好きで、過去色々なコンテストに参加してきましたが、実際に競技性のあるゲームを考えるとなると非常に難しいことがよくわかりました。毎回コンテストの題材を準備していただいているCodinGameと作成者の方に改めて感謝を。
今回考えたゲームについて、まだまだ要素が少なくプレイするには少々物足りないと感じています。とはいえ、モチーフをあまりに逸脱したゲームデザインを考えるのは本来の趣旨から逸脱するため、実際のコンテスト内容がどのようになるのか、ますます期待が高まりました。
それではまた、コンテストでお会いしましょう。