🐡

CodinGame Spring Challenge 2021 ルールまとめ

2021/05/30に公開

はじめに

「CodinGame Spring Challenge 2021参加記」を執筆するにあたり、ルール説明の箇所が長くなってしまったので、こちらにページを分けて、ルールをまとめました。
 「CodinGame Spring Challenge 2021」のコンテスト期間(2021年5月6日 23:00~5月17日17:00(JST))は過ぎてしまいましたが、このゲームAI実装に挑戦することは可能なので、これを読んで興味を持たれた方は、ゲームAI実装に挑戦してみてはいかがでしょうか?

https://www.codingame.com/multiplayer/bot-programming/spring-challenge-2021
「CodinGame Spring Challenge 2021」トップページ

CodinGame Spring Challenge 2021 ルール

ゲーム概要

  • 植林ゲーム!
  • 木を成長させ、木の一生のサイクルを回すことで、勝利ポイントを得る
  • 各ターンの最初に得られるSunPointを使って、行動を行う
  • 各ターンで複数回行動が取れる
  • 24ターン経過した時点で、勝利ポイントが多い方の勝利(同点の場合は、木の本数が多い方が勝利)
  • プレイヤーは、以下の4種類のコマンドのうち、実行可能なコマンドを1つ選択し、それを出力することでゲームを進める

コマンドの種類

  • SEED [cellIndex1] [cellIndex2]
    [cellIndex1]のマスにある木から、[cellIndex2]の空きマスに種を飛ばす

  • GROW [cellIndex]
    [cellIndex]のマスの木を1段階成長させる

  • COMPLETE [cellIndex]
    最大サイズ(3)まで成長した[cellIndex]のマスの木の一生を終えさせて、ポイントを獲得する

  • WAIT
    何もしない

https://youtu.be/AFDzg6R-Xmw

ゲームのデバッグ画面

ゲームのカギとなる要素

勝利ポイント

  • 最終的な勝敗の判定に使われるポイント
  • COMPLETEコマンドで、サイズ3の木を消すことで、森全体の栄養とマスの土壌の肥沃度に応じた勝利ポイントを獲得する(獲得できる勝利ポイントの値は後述)

SunPoint

  • SEED、GROW、COMPLETEコマンドを実行するために必要。
  • 各ターンの始めに、所有する木のサイズと影の影響に応じたSunPointが獲得できる(獲得できるSunPointの値は後述)
  • ゲーム終了時(24ターン経過時)、所有するSunPoint3ごとに、勝利ポイント1をボーナスとして獲得する

森全体の栄養(Nutrients)

木のサイズ

土壌の肥沃度(richness)

日照

  • 日照方向と木のサイズに応じて、木は影をつくる。この日照によりできる影は、獲得できるSunPointの量に影響する。

  • 各ターンが終わるごとに、反時計回りに日照方向が60°回転する。

木の影

  • 木の影について
    • 木のサイズと同じ大きさの影ができる
    • 影がかかる範囲にある木のうち、影の発生元の木のサイズ以下の木は、影の影響を受ける(日照を受けられない)
    • 影の影響を受けている(日照を受けられない)木からはSunPointを獲得できない

下の3つの例では、真ん中の図のみ影の影響を受けない

ゲームルールの詳細

ゲームループ

入力情報

初期情報

  • マスの数( =37)
  • マスごとに
    • マス番号(cellIndex)
    • 肥沃度(richness)
    • 隣接する6方向のマス番号(neigh)

毎アクション前に得られる情報

  • 経過日数(0~23)
  • 森の栄養(23~0)
  • 自分の所有SunPoint
  • 相手の所有SunPoint
  • 自分の所有勝利ポイント
  • 相手の所有勝利ポイント
  • 相手がWAIT状態か?
  • 存在する木(種を含む)の数
  • 木ごとに
    • 木があるマス番号
    • サイズ(0~3)
    • 所有者(自分 or 相手)
    • 休眠状態(isDormant)か?
  • 選択可能なコマンドの数
  • 選択可能なコマンドの文字列

コマンドの詳細

  • SEED [cellIndex1] [cellIndex2]
  • GROW [cellIndex]
  • COMPLETE [cellIndex]
  • WAIT

獲得できるSunPoint

  • 日照を受けているマスに存在する木は、ターンの始めに木のサイズと同じ値のSunPointを生成し、木の所有者はそのSunPointを獲得する。

(ここに具体例を入れる)

各コマンドで消費されるSunPoint

  • SEED
    (消費SunPoint)= (自分のサイズ0の木(種)の数)
  • GROW
    サイズ0 → 1:
    (消費SunPoint)= 1 + (自分のサイズ1の木の数)
    サイズ1 → 2:
    (消費SunPoint)= 3 + (自分のサイズ1の木の数)
    サイズ2 → 3:
    (消費SunPoint)= 7 + (自分のサイズ1の木の数)
  • COMPLETE
    4
  • WAIT
    0

獲得できる勝利ポイント

(獲得勝利ポイント)
=(Nutrients)+ (COMPLETEした木のマスの土壌の肥沃度(richness)) × 2

勝敗判定

  • 最終ターンが終了したタイミングで、最終的な勝利ポイントを計算し、勝利ポイントが高い方が勝者となる
  • 勝利ポイントが同じ場合、木の本数が多い方が勝者となる
  • 木の本数も同じ場合、引き分け

(最終勝利ポイント)
=(最終ターンまでに獲得した勝利ポイント) + (所有SunPoint) / 3
※小数部分切り捨て

以上

おわりに

私もこちらのコンテストに参加し、参加記を執筆しましたので、よろしければご覧ください。
https://zenn.dev/aielement/articles/c15ee3def9ffdc

最後までご覧いただき、ありがとうございました。

Discussion