2018年11月28日水曜日

自作カラコロッタ11 バブルクラップの先取り

ここではまだバブルクラップのプログラムは行わないが、やはり最難関だけあってとりあえずやりかたをここにしるしておくことにしよう…。たぶんバブルクラップをシミュレートしようとしているのは我くらいだろう。我はただのアニマファンではない。

さて、バブルクラップはそのゲームを見てみると、SPチャレンジ中は3つ入るまで最下段の割れは起こらないらしい。そして割れた泡は周囲6方向に小さな泡となり、その色と接している泡に共通色があれば消える。このとき消えたものは外側の大バブルの色に依存して小さな泡となりまた周囲に拡散。もし色が異なれば対象のバブルは消えないが中に組み込まれる。
なお色の種類と大バブルと小バブルの関係から、大バブルが包含する小バブルは多くても4つ、少なくて0個である。この段階でバブルが23個あることから、変数が115個必要なのはいうまでもない。
周囲がどこのマスか、というのはこちらが地道に定義するほか無い。
泡が割れる、というのはマスの色をひっぱってきて比較するだけ。
泡が中にはいる、というのはあるマスの変数の小バブルの部分を参照して、はじめて0になる部分にぶち込むだけ。ただしこのぶちこみは割れる操作が最後まで行われてからである。これはまあカラコロッタの仕様なので。

問題は泡が浮き上がる処理である。
我はこれを結構考えた後、以下の結論に達した。

各大バブルの動きを右上から左にかけて、そして下へと帰納的に定義していく。
それで、自分がどう動くか、というのは、

自分の左上のマスの動きがある場合、自分は左上へ行く。
左上が動かない(もしくは左端でいけない)場合は右を確認。
右は上記の帰納的な定義の順番関係からすでに定義済み。(実はこの段階では左は定義されていない)この右のバブルが左上に行く場合は自身はその場で待つ。
右のバブルが動かない、ということはすくなくとも右のバブルの左上、すなわち自分からみて右上のバブルが動かない、という結論を得るので自分も動けない。
右のバブルが右上に行く場合は直前と同様の議論により自分の右上が埋まっているので動かない。これでおそらく場合わけは完了。

たしかにこれは我でも結構考えた。

バブルの補充はもうかんたんすぎていうまでもなかった…。

というふうにだいたいの話はできているがこれを実際に実装できるかどうかは疑問である。
なにしろあにまだまとバブルクラップは未だ解析者が現れていないっぽいし。