前回ゲームボーイにテンキーをつないで電卓にしてみました。実用性はともかくこれによりゲームボーイ活用の幅が広がった感じです。そうなってくると色々試してみたくなってきます。
そこで今度は何かテンキーを使うゲームを作ってみることにしました。となるとすぐに思いつくのは数字を入力するパズルゲームですね。ということで数独(ナンプレ)を作ります。
ゲームボーイ開発ツールのgbdkにもだいぶ慣れてきたので軽い気持ちで製作に取り掛かったのですが、ゲームを作るには画像データや効果音などをgbdkに取り込む開発環境を整えなければならず結構手間がかかりました。ちなみに開発はUbuntu上で行っていますので、定番のGBTDやGBMBといったWindows用のツールは使いませんでした。
また、長く遊べるように数独の問題の自動生成を行うようにしてみたのですが、これも実現はなかなか大変でした。そんな訳で結構時間がかかりましたが、なんとか遊べるものが出来あがりました。
ところで今回、ソースコードが大きくなってしまったのと、それをコンパイルする環境はLinux環境でしか構築できないのでバイナリのみの提供にしました。テンキー周りは前回と同じで、Arduinoのスケッチや配線はそのまま使います。
作成したゲームボーイのバイナリはこちらです。
sudoku.gb
これをGB USB SMART CARD 64Mなどのフラッシュカートリッジに書き込んでご利用下さい。今回制作したソフトにはセーブ機能もありますが、利用するにはカートリッジがバッテリーバックアップに対応している必要があります。大抵の製品は問題ないと思いますが、自作のカートリッジの場合は動作するかどうかは分かりません。
また、GBエミュレーターでも遊べるようにゲームボーイのコントローラでの操作も行えるようにしました。テンキーよりは操作性は落ちますが、実機を持っていない方でも楽しんでいただけると思います。開発の際にもエミュレーターで動作確認を行っています。使用しているエミュレーターはUbuntu上でコンパイルしたmednafen 1.21.3です。
テンキーとコントローラそれぞれで使用するキーは次のようになります。
テンキー:
2468 カーソル移動
1〜9 数値入力(数値入力モードのとき)
. 入力した数値の消去(数値入力モードのとき)
Enter 選択
0 キャンセル・操作切り替え
コントローラ:
十字キー カーソル移動・数値選択(数値入力モードのとき)
Aボタン 選択
Bボタン キャンセル・操作切り替え
START 入力した数値の消去(数値入力モードのとき)
ゲームの遊び方ですが、Arduinoに電源を入れてからゲームボーイに電源を入れるとしばらくして数独のタイトル画面が表示されます。ここでどのキーでもいいのでテンキーを押すか、ゲームボーイのコントローラボタンを押すとゲーム画面に移ります。実はこのタイトル画面の裏ではキーを押すタイミングによって乱数のシード値を決めています。
ゲーム画面には数字を入力するマスと、操作メニュー、1〜9の数字(セーブスロット)が表示されています。
テンキーの0かコントローラのBボタンで操作カーソルが 操作メニュー → マス → セーブスロット → 操作メニュー → ... と順に切り替わります。
起動直後はセーブスロットにカーソルがあります。もし以前にセーブしておいた数独データがあるなら、テンキーの4、6かコントローラの十字キー左右でセーブスロットの番号を選択しておきます。
次に、テンキーの0かコントローラのBボタンでカーソルを操作メニューに移動します。テンキーの8、2かコントローラの上下でメニューを選択してからテンキーのEnterまたはコントローラのAボタンで決定です。操作メニューのそれぞれの機能は以下のようになっています。
やさしい・ふつう・むずかしい...数独の問題を自動生成します。
選択メニューによって難易度が変わりますが、これは見えなくなる数字の数か多いか少ないかだけです。問題の自動生成は乱数に依存していますので、生成されるまでかなり時間がかかります。運が良ければ数分ですみますが、通常は10〜20分はかかります。運が悪いと40分以上待たされることもあります。8ビット4MHzという低速の頭脳で一生懸命計算していると思って、生成スピードの遅さはどうかご容赦下さい。
リセット...すでに入力済みの数字を消去して、問題を初期状態に戻します。手詰まりになってどうしようもないときなどに利用して下さい。
ギブアップ...問題の解答を表示します。実は自動生成された問題には複数の解が存在することがあります。本当は生成された問題をチェックして解答が1つしかないことを確認するべきなのですが、解答が複数あるときに再度問題を作り直すとなると非常に時間がかかってしまうのでチェック機能は見送りました。なのでここで表示されるのは解の一例くらいに考えて下さい。
ロード...9個あるセーブスロットの内、選択中の場所から事前にセーブしておいた問題を読み込みます。
セーブ...9個あるセーブスロットで選択中の場所に、マスに表示されている数値データを保存します。ゲームを途中で中断するときや、自動生成した問題をストックしておくときなどに利用します。
操作メニューで問題を生成またはロードした後に、テンキーの0かコントローラのBボタンで操作カーソルをマスへ移動するとゲームを遊ぶことが出来ます。カーソルの移動はテンキーは2468でコントローラは十字キーです。マスの空白部分や以前に数字を入力したところにカーソルを移動すると、カーソル形状が四角になり数字が入力できます。
数字の入力はテンキーとコントローラでは異なります。
テンキーの場合、数字を入力したいマス目でEnterキーを押すとカーソルの形が変化します。この状態で1〜9のキーを押すとその数字が入力されカーソルが元の形状に戻ります。.を押すとそのマス目を空白にできます。また、0を押すと数字入力をキャンセルして元の状態に戻します。
コントローラの場合、数字を入力したいマス目でAボタンを押すとカーソルの形が変化します。この状態で十字キーの上下左右を押すと数字の1〜9が順番に表示されますので、入力したい数字を表示したまま再度Aボタンを押すと入力が確定されます。数字の選択時にSTARTボタンを押すとそのマス目を空白にできます。また、Bボタンを押すと数字入力をキャンセルして元の状態に戻します。
問題として出力されている数字にカーソルをもっていったときは形状がアンダーラインに変わり数字の入力は行なえません。
ゲーム起動直後の何も表示されていないマスには、自由に数値を入力することが出来ます。ここで雑誌などの数独データを入力して遊ぶことが出来ます。ただし、操作メニューのリセット・ギブアップは使えません。これらのメニューを選択してしまうとマスの数値が消去されてしますので、入力した数値データはこまめにセーブしておくことをおすすめします。
マスが全て埋まると自動的に判定が行われ、正解であればメッセージが表示されます。間違っているときはなにも表示されません。このとき間違っている数字を訂正して正解にすることが出来れはメッセージが表示されます。
ゲームの遊び方については以上です。
ところで実機で動作確認しているときに発生した現象なのですが、数値を入力した直後にプログラムしていない効果音が鳴ることがありました。発生頻度は低いのですが、原因がまったく分かりません。ハードウェア割り込みを幾つも使用しているので、タイミングによってサウンド割り込みに影響が出ているのかもしれません。ゲームを遊ぶ上ではまったく問題ないので、そのまま放置しています。もし発生しても気にしないで下さい。
このゲームはゲームボーイのROMバンク切り替えなしで動作するサイズ32KB(+RAM8KB)になんとか収まりました。この程度の容量でもそこそこ遊べるものが作れるんですね。まるで昔のパソコンのようです。
ゲームボーイのプログラミングは本体ハードについて詳しく調べないと作れない面もありますが、慣れてくると結構楽しいものです。まだまだゲームボーイで遊ぶ日々が続きそうです。
※コメント投稿者のブログIDはブログ作成者のみに通知されます