私は基本的にゲームはしないのですが、最近子供にせがまれて自分のケータイに入っているパズルゲームをしています。
子供はまだ小さいのでパズルを解くことはできないのですが、キャラクターの絵と音楽を楽しんでいるようです。一方、私はもっぱらパズルを解いています。
考えてもうまくすすまないので、プログラムを書いて解いてみました。(ついでに、ゲーム本体もまねっこしてみました。)
ゲームのルール
5×5のパネルがあります。パネルには裏表があるのですが、すべてのパネルを表にするとクリアです。
ただ、単純に選んだパネルだけが表(裏)になるわけではなくて、ユーザが選んだパネルの他に、その上下左右のパネルも裏表がひっくり返ります。
解法
パネルの状態が裏と表の2値なので、ビットで表現できます。
で、おそらく、同じ場所で何度反転させても結果はON/OFFのいずれかにしかならないので、5×5すべての場所でパネルを反転させる組み合わせを全部試せば、正解が見つかりそうです。
プログラム
プログラムはJavaで書きました。子供とゲームをやるのは大抵寝る前なので、パソコンを起動せずに済むようにiアプリにしました。
私のケータイでゲームをやって、嫁さんのケータイで解く感じです。(そもそも、私のケータイはDoCoMoだけどiアプリが動かなかったりします。)
問題を解くモード(Solver Mode)の他に、上記のルールで遊べるモード(Game Mode)を付けましたので、興味のある方でiアプリを使える方はダウンロードして遊んでみて下さい。
http://labs.bitmeister.jp/oaka/flip/Download.html |
なお、ソースファイルはここにおきました。
リソースファイルとかは付けていませんが、iアプリ開発に心得があれば、流用できると思います。(そういうニーズがあるかどうかはおいといて。)
おまけ
このプログラムのおかげで、さくさくステージクリアできるようになったのですが、なんだかむなしい。。。
結局、子供とやるときにこのプログラムは使っていません。
同じように、このパズルをプログラムに解かせたいと思っていて、
このサイトを見つけました。
私の場合は、エクセルファイルで作成したいと思っています。
ソースファイルを拝見したのですが、とても難解で(Javaから勉強です)、なかなか理解出来ていませんが、どうにか完成させたいなぁと思っています。
コメントありがとうございます。
ソースの解説を書いていないのでわからないですよね。。
私も後で見るとよくわからない位で(^^;
簡単にソースのポイントだけ説明すると、問題を解いているのは
次の2つのメソッドになります。
int doResolv(int base)
static int doLevelN(int level, int max, int parentMask)
baseとparentMaskは解く対象のパズル、levelが解くのに何手かかるか、
maxが最大何手まで試行するか、を表しています。
で、戻り値がポイントなのですが、どことどことどこと…を選ぶかをビットフラグで表しています。
例えば、答えが左上の隅っこと右下の隅っこだった場合、MASK[]のindex値が0と24が答えになります。
順番は問わないので、答えを”0″と”24″という値の配列では持たないで、25ビットのうちの0番目と24番目のフラグを立てて答えを表現しています。
Javaのint=32ビットあれば、5×5マス=25ビットの解答を表現できるので、そのようにしています。
ちなみに、doLevelNで、手数(level)を増やしながら問題を解いているのは、解答の手数(=解答のビット数)が少ない時に少ない時間で解けるようにするためです。
で、わかります?わからないですかね。。
がんばってみてください!