ビスケットプログラミングコンテスト2018のテーマはパズルです.何をパズルと考えるかは自由なのですが,ひとつ簡単な例を紹介したいと思います.
ライツアウトというゲームがあります.格子状に部屋が並んでいて,一つの部屋をタッチするとその部屋と,そこに上下左右に隣り合っている部屋のライトを今と反対(いま点いていたら消す,消えていたら点ける)にします.全て部屋のライトをつけたら正解というものです.これは,ビスケットだと簡単に作れるのと,応用にいろいろな可能性があるので,作ってみました.
最初に用意する絵はこの4つです.ライトのついていない点,ライトのついた点(おおきな青),反転命令,クリアの文字です.
ステージにはこのようにライトのついていない点を並べます.どのように点を並べるかが一つのバリエーションになりますね.ここではビスケットの魚にしてみました.
さて,タッチすると周囲のライトをつけたり消したりするメガネですが,どのようなパターンを採用するかがもう一つのバリエーションになります.ここでは斜め十字にしてみました.
結果的に最初の魚の配置も,パターンも斜めの格子しか使っていないため,本家とほとんど変わらないパズルになってしまいましたが,いろんな工夫は皆さんでやってみてください.
まず,タッチできる場所は部屋のある場所だけなので,電気がついているとき,消えている時のそれぞれでタッチできるようにします.
タッチすると,その部屋の状態はそのまま(点いていたら点いたまま,消えていたら消えたまま)で,状態を反転させたい場所に反転命令の絵を起きます.ここでは斜め十字に置いています.
つぎのメガネは,反転命令の動きです.反転命令がライトが消えいているところと重なっていたらライトを点ける.反転命令がライトが点いているところと重なっていたらライトを消すです.何もないところにも反転命令が置かれることがあるので,それは何もせずに消えます.
ゲームに必要なプログラムはこれで終わりですが,自動的にゴールの判定をしたいため
ライトが魚の形で点いたら,クリアの文字を表示します.
実際にやってみましょう.
まず,この位置をタッチします.
すると,斜め十字に反転命令が生成されます.
反転命令がライトの状態をつけたり消したりします.
はみ出た反転命令はそのまま消えます.
最終的に魚のパターンでライトを全部光らせることができると,
クリアの文字が表示されます.
さて,パズルを作るのは簡単なんですが.実際にちゃんと解けるのかどうかの確認をしなくてはなりません.ビスケットで自動的に解かせるプログラムを作るのは大変ですが,解くのを補助する方法を少し解説します.
このパズルは同じ場所の2回タッチすると,タッチしなかったことと同じになるので,タッチする最小限の場所はどこかを探るパズルと言えるでしょう.そこで,次のように,薄い色で大きな丸の絵を用意して,タッチした場所に起きます.
これによって,タッチした場所がどこか表示させておくことができます.
次のは,2箇所タッチした状態です.
左側の魚の眼のあたりの点を2回タッチした状態です.青の丸が濃く表示されているので,ここは2回タッチしたことがわかると思います.
この仕組みで,正解を探すのが圧倒的に簡単になります.ぜひやってみてください.
遊んでみて,確実に解けて,しかもそこそこ難しいということがわかったらぜひ応募してみてください.一人何件応募しても構いません.
このライツアウト系は,最初のライトの配置,反転のパターンの他にも(点く,消える)の2状態ではなく,3状態にするとか,自動的に動くルールを導入する(過去のブログ記事の「電気をつけろ」を参照してみてください)などあります.
でも,このコンテストで求められているのは,ここであげた工夫以外に,まだ誰も思いつかなかったような工夫です.そういうのが見つかるといいですね.そのオリジナルさとゲームの面白さとはまた別になるのですが.