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