Bipushと不変量
どうも、108Hassiumです。
昨年末、Bipushというフリーゲームを公開しました。
※☟DL版
※☟ブラウザ版
https://plicy.net/GamePlay/220329
このゲームの制作中に、作中の一部の要素がちょっと面白い数学的性質を持っていることを発見したので記録しておこうと思います。
ルール説明
Bipushは、「2個ずつしか押せないブロック」をテーマとした倉庫番系ルール推測パズルゲームです。
最序盤に登場する真っ赤なブロックは、テーマ通りの「2個ずつしか押せないブロック」として機能します。

見ての通り赤ブロックは1個だけでは押せず、進行方向に2個並べると押せるようになります。(3個以上でも押せません)
ちなみにクリア条件は「ステージ内にある全てのターゲット(灰色の印)にブロックを置く」なので、このステージの場合はブロックが1個余ります。
不変量
ある対象にある操作を行った時に変化しないような量を、その対象またはその操作の不変量と呼びます。
※厳密な数学的定義はこれとは全然違うっぽいですが、無視することにします。
例えば、「向かい合う2マスの角を削ったチェス盤をドミノ31枚で覆え」という箱詰めパズルにおいて「ドミノが覆った黒マスと白マスの数の差」が不変量になることから解が無いことが証明できる、という話が有名だと思います。

盤上の黒マスと白マスの数の差は2なので解はない。
さて、実はBipushの赤ブロックについても似たような形式の不変量が存在します。
まず、マップ上のマス目に対して以下のように0~3の数字を割り当てます。

このとき、各番号について「その番号のマスに赤ブロックが何個あるか」がブロックの移動に関する不変量となります。
先程のステージの場合、0番のマスには赤ブロックが0個、他の番号には1個ずつあるので0、1、1、1という4つの数字が不変量になります。
以下、この不変量を$${\begin{pmatrix}0&1\\1&1\end{pmatrix}}$$という風に2×2の行列として表すことにします。
この値が不変量であることを確かめるのは簡単で、先程の画像を見ながらブロックのペアが動くところを想像してもらえれば番号ごとのブロックの個数が変わらないことがわかると思います。
他のステージの場合も見てみます。

この場合は0番と2番が2個ずつ、1番と3番が1個ずつなので、不変量は$${\begin{pmatrix}2&1\\2&1\end{pmatrix}}$$になります。
なお、この不変量は「初期状態と最終状態での値が異なっていたら解けない」とは言えるものの、「初期状態と最終状態での値が同じなら解ける」とまでは言えません。

なのでこの不変量は、解けるかどうかの判定に使おうとしても「解けない or わからない」という結果しか得られないという、確率的素数判定法のような存在です。
他のブロック
これまで紹介したステージはどちらも作中のワールド1、つまり最序盤のステージです。
ワールド2以降では赤ブロック以外にも様々なブロックが登場するのですが、それらの中にも同じような不変量を持つものがあります。
まず、ワールド2では青いブロックが登場します。

この青ブロックの挙動は赤ブロックと同じですが、赤と青1個ずつの組み合わせでは押せません。
なので青ブロックは赤ブロックと同様な不変量を、赤ブロックとは独立して持つことになります。

※番号の割り当ては主人公の初期位置が0番になるようにしています。基準位置を変えれば不変量の値も変化しますが、本質的な違いはないと思います。
この場合は赤の不変量は$${\begin{pmatrix}1&2\\1&1\end{pmatrix}}$$、青は$${\begin{pmatrix}1&1\\1&1\end{pmatrix}}$$となります。
このステージは赤のPペントミノと青のoテトロミノを中心方向に3マスずつ動かせばクリアできそうに見えますが、その方法では赤ブロックの不変量が$${\begin{pmatrix}1&2\\1&1\end{pmatrix}}$$から$${\begin{pmatrix}2&1\\1&1\end{pmatrix}}$$に変化することになってしまうので不可能であることがわかります。
ワールド3では、1個ずつ押せる白ブロックが登場します。

白ブロック同士の相互作用は普通の倉庫番の普通のブロックと同じなので、これに関しては面白い不変量は無さそうです。(ちなみに今作はブロックが増減するギミックが無いので、ブロックの種類に関わらず常に「ブロックの個数」が不変量になります)
ワールド4では、赤ブロックと白ブロックを1/4に切って組み合わせたようなブロックが登場します。

これらのブロックは押す方向によって性質が異なり、例えば「左側1/4だけ赤くて残りは白いブロック」は左から押すときだけ赤ブロックとして振舞い、他の方向から押す場合は白ブロックとして振舞います。
この場合の不変量は特殊で、まず「左右が赤で上下は赤か白」というブロックしかないステージでは、以下のように番号を振ることで不変量を定義できます。

ゲーム本編には登場しません。
0番のマスにあるブロックは2個、1番は3個なのでこの場合の不変量は$${(2,3)}$$になります。
「上下が赤で左右は赤か白」というブロックだけの場合も同様で、0と1の横縞から縦ベクトルの不変量を定義できます。
未解決問題
ゲーム終盤では、こんなブロックも登場します。

この赤と青が混ざった2種類のブロックは、「異種どうしじゃないと押せないブロックのペア」です。
この初期状態では動かせるブロックは最下段の2個組だけで、それより上にある4組(8個)はどれも同種のブロックのペアなので動かせません。
この2種のブロックに関しては、赤ブロックの2×2行列を複雑にしたような感じの不変量が存在するような気がするのですが、残念ながら自力では見つけられませんでした。
また、先程の画像のステージは「多分解けない」という理由で没にしたものなのですが、本当に解けないのかどうかもよくわかっていません。
※追記(2026/02/22)
記事の投稿から僅か2時間弱で数値計算bot(@suutikeisan_bot)様より「解けない」との情報をいただきました。ありがとうございます。
本棚2をBFS(幅優先探索)してみたのですが、解けませんでした。
— 数値計算bot (@suutikeisan_bot) February 22, 2026
僕のプログラムが間違ってる可能性もあるので、解ける問題もあればほしいですね(あの2種類のブロックしか実装していないですが。)
とりあえず解けないと思います
