コマンドラインで遊べるぷよぷよ one-puyo の npm モジュールをリリースしました
ぷよぷよは、同じ色の「ぷよ」が 4 つ以上くっつく(上下左右に隣接する)と消えるパズルゲーム。2019 年には国体の文化プログラム競技タイトルとして採用されるなど、今最も熱い eSports の 1 つ!
one-puyo は「なぞぷよ」(ぷよぷよにおける詰将棋のようなもの)のシンプル版で、ぷよを 1 つ置くだけで連鎖を楽しめるミニゲームです。
公開場所
必要なもの
Node.js のインストール
遊び方
「連鎖のタネ」が表示されるので、どこかの列に 1 つだけぷよを置いて連鎖を作り、画面上の全てのぷよを消すことができればクリア。
オプション
-e
(Easy…3 連鎖問題)
-n
(Normal…4 連鎖問題: デフォルト)
-h
(Hard…5 連鎖問題)
-s
または-t
(5 問連続で解くタイムアタックモード)
絵文字の表示について
macOS Terminal 以外の環境では、絵文字の代わりに色付きの記号で動きます。
問題生成について
フィールドにいい感じにぷよを設置(3 連鎖問題なら、緑を 3 個、赤を 3 個、青を 3 個、緑を 1 個、赤を 1 個の順番で置きつつ、同じ色は列が離れすぎないようにするといった感じ)
ぷよの設置→連鎖発火を全通り試す
全部消せた選択肢があればOK、なければやり直し
のような、割と力任せの実装です。
計算量オーダーは、
フィールドの高さ: H
フィールドの幅: W
連鎖数: C
ぷよの種類: N
とすると大まかに、
フィールド生成: O(C * N)*1
設置全探索: O(W * N)
連鎖発火: O(H * W)
全体: O(C * N2 * H * W2)
となり、H = 10, W = 6, C = 4, N = 4 とすると、1 回のフィールド生成には O(23040) の重めの定数倍処理がかかるはずです。
よって許容できる計算量オーダーを O(10 ^ 7) とすると、400 回程度のフィールド生成には耐えてくれそうなので、まあ 400 回も試したら問題作れるでしょ!ということで実装しました。(これ完全に AtCoder だ…元々は問題テンプレートを用意するつもりでした)
実際に動かしてみると、4 連鎖問題までは一瞬、5 連鎖問題は 1 〜 2 秒程度の生成時間がかかります。タイムアタックモードだと回答中に問題を先読みするので、5 連鎖問題でも割と快適に遊べると思います。
学べたこと
JavaScript の基礎的文法から非同期処理までざっと習得できました。今 Vue.js の学習をしていますが、おかげでスムーズに進められています。
遊んでみた感想
問題生成機能を付けたらかなり面白くなりました!ぷよぷよ初心者でも、お手軽に連鎖の爽快感が味わえると思います。
ぷよらー的にはタイムアタックモードも面白いのですが、記録を狙うと「何か消えそうなところにとりあえず置いてみる」になりがちなので、「生成された問題をじっと見つめてみる」のも面白いなと感じました。たまに「なるほど……」と思うような連鎖が出てきます。😊
今後の機能追加について
さらにアルゴリズム力が高まったら -l
(Lunatic…6 連鎖以上の問題)を追加したいです!
*1:落下処理を使って毎回上から 1 個ずつ降らせていたため O(C * N * H) でしたが、高さをメモして O(C * N) に改善しました。