人生

やっていきましょう

851日目

ギミックの不具合が新たに発生した。前回は音の不具合だったが、今回は3つある床スイッチが重複すると発生しないという問題だった。

今回ばかりは問題の原因がまるで分からなかった。構想自体には問題がなく初めから最後まで論理的に処理できる確信が自分にはあった。しかし現にスイッチは機能せず思うような結果が出せていない。

こんな時「難問は分割せよ」というデカルトの言葉を思い出す。もはや自分にとって座右の銘のような言葉だが、やはりひとつの真理を突いているように思う。複雑な構造とはいえ、自分の開発したすべての処理が把握できるほどには単純である。すべてはひとつの処理の組み合わせである。そしてその部分は独立しているものもあれば、別の処理に連動して影響を与えるものもある。

難問を分割する意味とは、おそらく問題の特定を容易にする点にある。いま生じている問題は何らかの問題の重複によって起こっているものであるかもしれないが、そのすべてに問題があるわけではない。正常に機能している部分は当然あり、あるいは問題があったとしても今扱っている問題とは全く関係のない独立した問題であるかもしれない。

そこでまずは正常に機能している処理を対象から除外する。残ったものが問題である。つぎにその問題が独立したものかそうでないものかをひとつずつ調べる。自分がこのとき学んだのは問題を特定する方法だ。例えばあるひとつの処理がA,B,Cの処理の組み合わせであった場合、Aだけを切り取って正常に機能するか調べ上げる、あるいはAだけを除外してB,Cへの影響を調べることができる。こう言えば意外と簡単なようにも見えるが、そもそも初めからA,B,Cが自分の頭の中で区別されていないところからはじめなければならないので苦労する。ここでやはり処理を区別して把握するということが重要になる。

このようにして調べていくと、次第に問題が明らかになった。まず主人公と床スイッチの処理には問題がない。すなわち岩を押した際の処理にのみ問題がある。また3つある床スイッチを1つにしてテストを行ったところ問題なく機能した。2つ目を追加したときに問題が発生したのである。更に床スイッチのon/offにしたがって水から床が出たり消えたりする処理を管理する変数をテストしたところ、1つ目の床の処理の結果を2つ目の処理の結果がなぜか上書きしているらしいことが分かった。

問題は何を上書きしているかということだが、その答えはマップチップだった。水から足場を出す際の処理を自分は特定の(x,y)座標のマップチップを置き換えることで実現していたが、このマップチップの座標が1つ目の床スイッチの結果水から出される足場の座標と同じだった。

自分が岩を押す際、1つ目の床スイッチが通行可能か、2つ目はどうか、3つ目はどうかというように頭から条件判定を行なっていたが、この際1つ目の床スイッチがONの状態で2つ目の床スイッチがOFFの状態だと、1つ目の床スイッチの処理の結果現れた足場が、次の瞬間には消されてしまうという事態が発生することになった。同様に3つ目のスイッチも現れる足場の座標が1つ目のものと同じだった。

タネが分かれば簡単なものだったが、まったく何が何だか分からない状態で何かの問題を特定するというのはかなり困難だった。前例を調べても検索に出てこないなか、自分はよくやった方だと思う。