ごぐたんのブログ

ごぐたんのブログです。

コマンドラインで遊べるぷよぷよ one-puyo の npm モジュールをリリースしました

ぷよぷよは、同じ色の「ぷよ」が 4 つ以上くっつく(上下左右に隣接する)と消えるパズルゲーム。2019 年には国体の文化プログラム競技タイトルとして採用されるなど、今最も熱い eSports の 1 つ!

one-puyo は「なぞぷよ」(ぷよぷよにおける詰将棋のようなもの)のシンプル版で、ぷよを 1 つ置くだけで連鎖を楽しめるミニゲームです。

公開場所

one-puyo

必要なもの

Node.js のインストール

遊び方

「連鎖のタネ」が表示されるので、どこかの列に 1 つだけぷよを置いて連鎖を作り、画面上の全てのぷよを消すことができればクリア。

f:id:goaglia:20200722200106g:plain

オプション

  • -e(Easy…3 連鎖問題)

f:id:goaglia:20200722195952p:plain

  • -n(Normal…4 連鎖問題: デフォルト)

f:id:goaglia:20200722200038p:plain

  • -h(Hard…5 連鎖問題)

f:id:goaglia:20200722200049p:plain

f:id:goaglia:20200722200403g:plain

絵文字の表示について

macOS Terminal 以外の環境では、絵文字の代わりに色付きの記号で動きます。

f:id:goaglia:20200722200609p:plain

問題生成について

  1. フィールドにいい感じにぷよを設置(3 連鎖問題なら、緑を 3 個、赤を 3 個、青を 3 個、緑を 1 個、赤を 1 個の順番で置きつつ、同じ色は列が離れすぎないようにするといった感じ)

  2. ぷよの設置→連鎖発火を全通り試す

  3. 全部消せた選択肢があれば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) に改善しました。