CODE VS 2.0

CODE VS 2.0に参加した。

結果は、予選が総合9位、学生7位。決勝が初戦負けだった。5位の賞状(たぶん一回戦で負けた人全員が5位)を貰ったので、結果を訊かれたら、5位だったと言おう( ・`д・´)

予選

基本的に、3手(小)2手(中大)を全探索して最も評価値の高いところに落とすだけ。工夫したところは、

  • 盤面を一次元配列で表すと、縦・横・斜めのラインが等差数列になるので、ラインを等差数列として管理する。似たような処理を何回も書かなくて済む。
  • 落下・消去時の処理は変化したブロックが含まれるラインだけで良いので、各ラインごとに処理する必要があるかを覚えておいて高速化。
  • スコアではなく現在できている連鎖数を評価する。連鎖数は全ての場所に全ての数値を1個落としてみて、最多の連鎖数を採用する。1手深く読んだくらいの時間がかかるけど、こうしないと、例えば連鎖を伸ばしておいて10手先のブロックで発火ということができない。
  • 一番高い列と低い列の差が3(小中)4(大)より大きかった評価値をマイナス。谷の底に発火点があるとどうしようもなくなるので。
  • お邪魔以外のブロック数が連鎖数の2.5倍(小)3倍(中)5倍(大)より多かったら評価値をマイナス。フィールドが埋まると連鎖が伸ばせなくなるので。
  • 一度1000ターンまで動かしてみてから、最も高い点数が取れるところまで戻って発火する。
  • 並列化。ランキングでは、3回のスコアの合計が使われるので、各回で何回も試行して最もスコアの高いものを選んだほうが、各回で1回ずつ試行することを何回も繰り返すより得。
リプレイ動画

D

D

D

決勝

1000ターンまで動かして発火のタイミングを決めることができないので、フィールドが埋まってきたり1000ターンが近づいてきたりしたら、100ターンくらい動かしてみて、その100ターンで現在が一番スコアが高いなら発火するようにした。

ボロ負けした(´・ω・`)

予選とは違ったゲームだったのか……。スコアは指数的に増えるけど、お邪魔ブロック数は線形でしか増えないので、大連鎖である必要は無い。あと、適度にお邪魔ブロックが降ってきてくれないと、連鎖の伸びが遅い。