iアプリでパズルゲーム(を解くプログラム)をつくりました

私は基本的にゲームはしないのですが、最近子供にせがまれて自分のケータイに入っているパズルゲームをしています。
子供はまだ小さいのでパズルを解くことはできないのですが、キャラクターの絵と音楽を楽しんでいるようです。一方、私はもっぱらパズルを解いています。
考えてもうまくすすまないので、プログラムを書いて解いてみました。(ついでに、ゲーム本体もまねっこしてみました。)

ゲームのルール

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アプリ開発に心得があれば、流用できると思います。(そういうニーズがあるかどうかはおいといて。)

おまけ

このプログラムのおかげで、さくさくステージクリアできるようになったのですが、なんだかむなしい。。。
結局、子供とやるときにこのプログラムは使っていません。

2 Comments

  1. 同じように、このパズルをプログラムに解かせたいと思っていて、
    このサイトを見つけました。
    私の場合は、エクセルファイルで作成したいと思っています。

    ソースファイルを拝見したのですが、とても難解で(Javaから勉強です)、なかなか理解出来ていませんが、どうにか完成させたいなぁと思っています。

  2. コメントありがとうございます。
    ソースの解説を書いていないのでわからないですよね。。
    私も後で見るとよくわからない位で(^^;

    簡単にソースのポイントだけ説明すると、問題を解いているのは
    次の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)を増やしながら問題を解いているのは、解答の手数(=解答のビット数)が少ない時に少ない時間で解けるようにするためです。

    で、わかります?わからないですかね。。
    がんばってみてください!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*