チクタクバンバンのようなゲームをつくります。

チクタクバンバンは1981年12月に野村トーイより販売されたスライディング・パズル・ゲームです。タテ4マス、ヨコ4マスの枠に配置されている15枚の線路プレートを動かして、進み続ける目覚まし時計を常に動き続けるようにします。目覚まし時計がプレートから落ちたり走行不能になったら負けです。また意図的にループを作る事は禁止であり、ベルが鳴り終わるまでにループを崩さなければ反則負けとなります。

下の動画は本物のチクタクバンバンです。

それでは実際につくってみましょう。

線路プレートをつくる

まず、線路プレートを表示させます。

PlateType列挙体

線路プレートの種類を区別するために列挙体を作成します。東西南北でどの方向が繋がっているかを示しています。

TrackPlateクラス

次に線路プレートをつくるクラスを作成します。表示させるときの色は元々のチクタクバンバンにあわせて2種類にしたのですが、青と黄色を青とオレンジ色に変えています(線路を白で表示させたとき黄色では見えにくいという個人的な好みによる理由)。

目覚まし時計を表示させる

次に目覚まし時計の位置を管理するためのAlarmClockクラスを作成します。

これは目覚まし時計がプレートの上でどの方向からどの方向へ移動するかを示す列挙体です。

線路プレートを表示させる

次にForm1クラスの処理を考えます。

線路プレートの初期化

線路プレートを表示させるだけならこれでできます。

線路プレートを移動させる

方向キーが押されたら空白部分を埋めるように線路プレートを移動させます。

線路プレートの空白部分を探すメソッドがFindBlankです。見つからない場合は(ないと思いますが)retRowとretColumに-1が代入されます。

移動させる線路プレートが見つかったら実際に移動させます。

線路プレートの描画

あとは線路プレートを描画するだけです。

目覚まし時計の移動

チクタクバンバンでは目覚まし時計を移動させなければなりません。今回は赤丸で表示します(次回以降、もっとちゃんとしたものにする)。

目覚まし時計がどこに存在するかはどの線路プレートの上に存在するか、その線路プレートの上でどの方向からどの方向に移動しているか、そのプレートの上で何回移動したかがわかれば特定できます。以下は目覚まし時計を移動させるためのメソッドです。

目覚まし時計はどこからどこへ移動するか

目覚まし時計が北から南に移動するときの処理を示します。目覚まし時計が南北に移動できる線路プレートの上に移動してから何回移動したかはAlarmClock.ElapsedTimeAfterEnteringを見ればわかります。AlarmClock.ElapsedTimeAfterEnteringが取り得る最大値とAlarmClock.ElapsedTimeAfterEnteringから目覚まし時計の座標を調べて再セットすることができます。またAlarmClock.ElapsedTimeAfterEnteringMaxに達した場合は次の線路プレートに移動したということなので、そのプレートを調べます。

次のプレートは取得できないかもしれません。この場合はミスをしたことになります。また目覚まし時計が北から南に移動したのであれば次に取得された線路プレートは北から内部に入れるプレートでなければなりません。そうでない場合もミスとなります。ミスをするとすれば次のプレートに移動する瞬間です。WhenLeavingSouthメソッドは南から目覚まし時計が出たときに呼び出されます。ここでミス判定をおこないます。

南から目覚まし時計が出たときに呼び出されるWhenLeavingSouthメソッドを示します。次の線路プレートは取得できるか、次の線路プレートは北から内部に入れるかを調べ、これができなかった場合はCantMoveToNextイベント(この線路プレートには移動できない)またはNextDoesntExistイベント(移動先の線路プレートが存在しない)を発生させます。

次の線路プレートは北から内部に入れる場合は、この線路プレートの出口を調べます。そして対応するDirectOfMoveをAlarmClock.DirectOfMoveにセットします。

GetLowerPlateメソッドは引数で渡された線路プレートの下側にある線路プレートを返します。同様に引数で渡された線路プレートの左側、右側、上側の線路プレートを取得する処理を示します。

同様にすれば他の方向に移動する処理もできます。

とりあえず完成させる

タイマーの初期と目覚まし時計の位置の初期化

もう一度コンストラクタを示します。タイマーの初期と目覚まし時計の位置の初期化の処理が追加されています。

描画の処理

描画の処理を示します。