人生

やっていきましょう

846日目

変数Pが正常に加算されない問題の原因が判明した。それは岩とゴールの座標が一致していない場合、その都度変数Pに0を代入してしまっていたことによる。

たとえば岩をAとBの2つ用意する。それに対応するようにゴールもまたAとBを用意する。岩AをゴールAまで運び、岩BをゴールBまで運ぶことでそれぞれ変数Pに1加算され、変数Pが2に達したらクリアイベントが自動で起動して先に進めるようになる。

このとき岩AがゴールAの上に乗り、岩BがゴールBから遠い場所にある場合を考える。岩Bを動かした際、岩BはゴールBの上にないので変数Pに0が代入される。すると岩AがゴールAに乗っていながら、変数Pが初期化されてしまうということになるので、ここで不具合が生じてしまっている。

この解決には変数Pに0を代入するという部分を修正する必要がある。ここは代入ではなく減算を用いるとよいだろう。しかし岩がゴールの上にあるときに1加算、ゴールの上にないときに1減算、としてしまうと、岩がゴールにない時に押すと無限に変数Pが減算してしまう。岩がゴールの上に到達したら動かなくなる、という仕組みにすれば問題は一気に解決するが、パズルの過程で動かす岩が減ると難易度が下がってしまうので、できればゴールの上に乗ってからゴールの外に動かせるようにしたい。

しばらく考えて出した結論は、岩の移動時に変数Pに関する操作を一切行わないというものだ。岩が所定のゴールに乗った瞬間にその岩はイベントとなり、その場にとどまり続ける場合は変化なし、ゴールから外に出た場合は変数Pを1減算して元のイベントに戻すというものだ。

たとえば先ほどの例と同じように、岩Aが既にゴールAの上に乗っており、岩BがゴールBから遠い場所にある場合、岩Bを動かしている際に変数Pの操作を一切行わなければ、岩AはゴールAの上に乗ったままであり、岩Bの移動によって変数Pが変化することはないので、変数Pは1のまま維持される。

このとき岩CとゴールCが同じマップに存在していると考える。岩CはゴールCの上に乗っていない。岩AはゴールAの上に乗っており、自分はいま岩BをゴールBまで動かした。このとき変数Pは2である。ここで岩BはゴールBに移動させた瞬間にセルフ変数00に1が代入され、セルフ変数00が0の場合にのみ発動していた岩Bが「岩B’」に変化する(そのため既に岩Aも岩A’に変化している)。

岩B’の間は基本的に岩Bと中身は変わらないが、ゴールの外に出したときだけ変数Pを1減算するという処理を行う。現時点ではAとBがそれぞれゴールに乗っており変数P=2の状態だが、ここで岩Bをゴールの外に出すと変数Pは1減算され、変数P=1となる。加えてセルフ変数00に0を代入することにより、セルフ変数00が1の場合にのみ発動していた岩B’は岩Bに戻る。また岩B'を押す前と後で変化がなかった場合岩B'はそのままである。これらのイベントを各々の岩で行うことにより、どれだけ岩を増やしても問題なく機能するはずである。

ただしひとつ確認しなければならないのは、これらのイベント処理がそれぞれの岩がすべて別のものであるという前提で動いているということである。各々の岩を同じものとして処理するということになるとまた話が違ってくることになるが、それはまた別の話なので今回は触れないことにする。とりあえずは倉庫番の枠組みがこれで完成した。次はこれらをもってパズルを作らなければならない。