ぷよぷよを作ろうとしたら、蛙になった話

暇だった。

正確に言うと、やるべきことは山ほどあるのに、
「今それやる気は起きない」タイプの暇だ。

こういうとき、脳は碌でもないことを言い出す。

ぷよぷよ、作れるんじゃね?

本当にそれだけだった。

http://kero2fog.com/wp-content/uploads/2025/12/keropuyo2.html

重いエンジンも要らない。 3Dでもない。 ブラウザで動けば十分。

HTMLとCanvasとJavaScriptだけで、
丸い何かが落ちて、4つつながったら消える。

その程度のものを想定していた。

――この時点では、まだ蛙は出てきていない。


ぷよぷよは、ただ落ちればいいわけじゃない

実際に作り始めると、すぐに違和感が出た。

あれ? なんかテトリスっぽくない?

原因はシンプルだった。

  • 固定した瞬間に確定してしまう
  • 消える時に一瞬で消える

これだと「落ち物ゲーム」ではあっても、ぷよぷよではない

ぷよぷよらしさって、実はかなり繊細だ。

  • 着地しても、ちょっと粘れる
  • ギリギリで回転が間に合う
  • 消える前に「今から消えるぞ」という溜めがある

ここを再現しないと、脳が納得しない。


着地後の“ちょい猶予”を入れる

まず入れたのがロックディレイ

下にもう落ちない状態でも、

  • 数ステップだけ猶予を持たせる
  • その間に移動や回転が成功したら、猶予を復活

これだけで、操作感が一気に「ぷよ」になる。

落ち物ゲームの正体は、
アルゴリズムじゃなくて、体感だと実感した。


連鎖は“演出”が本体

次の違和感はこれ。

消えるの、早すぎる

ぷよぷよの連鎖って、
結果じゃなくて過程を見せるゲームなんだよな。

そこで、

  • 消える前に点滅
  • 少し間を置いて消滅
  • 落下 → 次の連鎖判定

という流れに変更した。

さらに、

  • 「1れんさ!」「2れんさ!」の文字表示
  • 連鎖数に応じてSEを変化

これでようやく「ゲームをしている感じ」が出てきた。


ぷよが、全然蛙じゃない問題

ここで致命的な指摘が入る。

ぷよ、全然かえるじゃないな

たしかにそうだった。
丸い玉に目を付けただけでは、蛙ではない。

そこで見た目を全面改修。

  • 目玉の出っ張り(カエル特有の頭)
  • ちょっとした口とほっぺ
  • 手足っぽいシルエット
  • 社畜なのでネクタイ

結果、
ぷよぷよではなく、蛙が落ちてくるゲームになった。


ゲームオーバーで社畜蛙は倒れる

せっかくなので、
ゲームオーバーもちゃんと演出した。

  • 画面暗転
  • 「社畜蛙、力尽きる…」の文字
  • ネクタイを締めた蛙が落ちてきて、倒れる

こういう無駄な演出は、
一度入れると削れなくなる。


技術的な話:なぜ“ゲームらしく”なるのか

使っている技術は驚くほど単純だ。

  • HTML + Canvas
  • 素のJavaScript
  • 外部ライブラリなし

描画はすべてCanvas上での図形描画。
画像素材もスプライトも使っていない。

ぷよが“ぷよ”になる条件

実装していて一番重要だったのは、
ロジックよりも時間だった。

  • いつ落ちるか
  • いつ確定するか
  • いつ消えるか

これを少しでも間違えると、
途端にテトリスになる。

具体的には、

  • 着地後すぐ確定 → ✕
  • 消去が即時 → ✕

そこで、

  • ロックディレイ(着地後の猶予)
  • 消去前の点滅アニメーション
  • 連鎖間の“間”

を意図的に入れた。

連鎖処理は同期しない

連鎖は「計算」ではなく「演出」なので、
一気に解決しない。

  • 消える対象をまず集める
  • 点滅させる
  • 少し待ってから消す
  • 重力をかける
  • 次の連鎖を判定する

この一連を async / await で順番に処理している。

結果として、
コードは少し長くなったが、
見て分かる連鎖になった。

図形だけで蛙を描く

見た目もすべてコードだ。

  • 円と楕円で体を作る
  • 目玉の出っ張りで蛙感を出す
  • 口・ほっぺ・手足は雰囲気

「それっぽく見える最小構成」を探すのは、
地味だが一番楽しい作業だった。


まとめ:ぷよぷよは設計思想の塊

今回作ってみて分かったのは、
ぷよぷよは「消えるゲーム」じゃないということ。

  • 粘り
  • 演出

この3つが揃って、初めてぷよぷよになる。

そして気づいたら、
ぷよは消えて、蛙だけが残った。

次はスコアか、難易度か、
それとも本当に誰かに遊ばせるか。

まあ、暇なときに続きを作ればいい。

―― 蛙は今日も落ちる。