# ゲームルール

パズルゲーム 2048 が対戦ゲームになった!

本概要版を 2018/11/03 (土)に、ベータ版を 2018/11/07 (水)に公開しました。正式版を 2018/11/10 (土)に公開しました。 ベータ版からの更新内容は GitHub の差分表示機能でご確認いただけます。 誤りや改善すべき箇所がございましたら、GitHub 上でご連絡いただければ幸いです!

# 基本ルール

2 人のプレイヤーはそれぞれ 5 x 5 のサイズのボードと初期値が 0 のスコアを持っています。 ボードの各マスには高々 1 個の正整数が入ります。 ゲーム開始時、お互いのボードには相手プレイヤーが指定した 1 つのマスに 2 が置いてあります。 ゲームでは 2 人のプレイヤーに交互にターン(手番)が回り、自分のとる行動を選択します。 ターンは次の 2 個のフェーズからなります。 なお、対戦相手や先攻・後攻は、オンライン対戦システムによって自動的に決定されます。

どちらかのプレイヤーが勝利条件を満たす、もしくは、 2 人のプレイヤーがそれぞれ 1000 ターン行動するとゲーム終了となり、勝敗が決まります。 勝利条件および勝敗の決め方については、後述の勝利条件をご覧ください。

# メインフェーズ

ターンプレイヤーは上下左右のいずれかの向きを 1 個選択します。 ターンプレイヤーのボード上の数たちは、選択された向きに、ボードの端か他の数にぶつかるまで移動します。 このとき 2 個の等しい数がぶつかると、それらがマージ(加算)されて 1 個の数になります。 マージが発生するたび、マージによってできた数に等しい値がターンプレイヤーのスコアに加算されます。

# 例 1

次のような状態のボードについて「右」を選択した場合を考えます。 (.は空マスを表します。以下の図示はゲームソフトウェアが与える実際の入力形式とは異なります。)

. 4 . 4 .
4 2 . . .
2 2 2 . .
4 2 . 2 .
2 2 2 2 2

1 行目の 4 と 4 はマージされて 8 になります。 2 行目の 4 と 2 は順序を保ったまま右に移動します。 3 行目の 3 個の 2 は移動の先頭(右端)から順にマージが発生し 4 と 2 になります。 4 行目の 2 と 2 はマージされて 4 になります。続けて 4 とマージはされません。 5 行目の 2 と 2 の各ペアはマージされて、それぞれ 4 になります。 8 にはなりません。 その結果、ボードは次のように変化しました。

. . . . 8
. . . 4 2
. . . 2 4
. . . 4 4
. . 2 4 4

# アタックフェーズ

相手のボードの任意の空マスを選び、正整数を置くことができます。 直前のメインフェーズでマージが発生した回数が X のとき、1 個以上で、かつ、すべて同じ正整数で、かつ、総和が 2X+1 の正整数を置きます。 例えば、メインフェーズで 2 回マージした場合、 1 個の 8、2 個の 4、4 個の 2 のいずれかのパターンで正整数を置かなければなりません。 ただし、存在しないマス、および、既に正整数が置かれたマスは選べません。

# 入出力

以下に入出力の形式を記します。各出力の末尾は改行コードであり、かつ、出力後に標準出力を flush しなければなりません。

# ゲーム開始前の入力

Player
  • Player: プレイヤー番号
    • 0: 先攻プレイヤー
    • 1: 後攻プレイヤー

# ゲーム開始前の出力

r c
  • r: ゲーム開始時に相手のボードに 2 を置く行 (1 ≦ r ≦ 5)
  • c: ゲーム開始時に相手のボードに 2 を置く列 (1 ≦ c ≦ 5)

# 各ターンの入力

Turn TimeLeft ScoreOfTurnPlayer ScoreOfOtherPlayer
A1,1 A1,2 ... A1,5
A2,1 A2,2 ... A2,5
:
A5,1 A5,2 ... A5,5
B1,1 B1,2 ... B1,5
B2,1 B2,2 ... B2,5
:
B5,1 B5,2 ... B5,5
  • Turn: ターン数
    • 初期値は 1 で、各プレイヤーがそれぞれ 1 回行動すると、ターン数が 1 増える。
  • TimeLeft: ターンプレイヤーの残り実行時間(ミリ秒)
    • 100 秒 から、既に消費した実行時間を引いたもの。
  • ScoreOfTurnPlayer: ターンプレイヤーのスコア
  • ScoreOfOtherPlayer: ターンプレイヤーではないプレイヤーのスコア
  • Ai,j: 自分のボードの i 行目 j 列目のマスの状態
  • Bi,j: 相手のボードの i 行目 j 列目のマスの状態
    • 0 のとき、そのマスは空である。
    • 正整数 a のとき、そのマスの数は 2a である。

# 各ターンの出力

Command M V r1 c1 r2 c2 ... rM cM
  • Command: ボードをスライドする向き
    • U: 上
    • R: 右
    • D: 下
    • L: 左
  • M: 相手のボードに置く数の個数
  • V: ボードに置く数 2Vを表す整数値 (1 ≦ V)
  • ri: i 個目の数を置く行 (1 ≦ ri ≦ 5)
  • ci: i 個目の数を置く列 (1 ≦ ci ≦ 5)

出力の途中に改行を挿入しないように注意してください。

# 実行時間

各プレイヤーは実行時間に制限があります。 ゲーム開始前の入出力は 1 秒以内に終了しなければなりません。 各ターンは 1 秒以内に終了して、かつ、全ターンの合計が 100 秒以内でなければなりません。 超過した場合、ゲームに敗北します。 プログラムのコンパイル時間・ゲーム開始前の入出力の時間は、この 100 秒には含まれません。

# 勝利条件

以下の条件のどちらかを満たすことで、ゲームに勝利できます。

  1. 対戦相手のプレイヤーのターンに、以下の条件のいずれかを満たした場合
    • 対戦相手のターン開始時において、対戦相手がどんな行動を取ってもボードの状態を変化させられない場合
    • 対戦相手のメインフェーズにおいて、対戦相手が行動してもボードの状態が変化しなかった場合
    • 対戦相手の AI プログラムが、ゲームからの入力を受け取らなかった場合
    • 対戦相手の AI プログラムの出力が、定められたフォーマットもしくは制約を満たさなかった場合
      • 例えば、アタックフェーズで既に正整数が置かれているマスを選んだ場合や、異なる総和の正整数を置こうとした場合も該当します。
    • 対戦相手の AI プログラムが、実行時間の制約を満たさなかった場合
  2. 2 人のプレイヤーがそれぞれ 1000 ターンで行動した後、自分のスコアが対戦相手のスコアより高かった場合
  3. 2 人のプレイヤーがそれぞれ 1000 ターンで行動した後、自分のスコアと対戦相手のスコアが等しく、かつ、自分が後攻であった場合