とりあえず前回の記事でチクタクバンバンのようなゲームは完成したことになりますが、さらにもうひと工夫加えてみたくなるのが人情です。チクタクバンバンには反則技が存在します。

動作確認は こちらからどうぞ。

意図的にループを作る事は禁止

チクタクバンバン – Wikipediaによると

意図的にループを作る事は禁止であり、ベルが鳴り終わるまでにループを崩さなければ反則負けとなります。

そこで今回はループ判定について考えます。ループができてしまった場合は警告文を表示させ、一定時間内にループを崩さなければゲームオーバーとします。

ループが形成されているかどうか

ではループが形成されているかどうかはどのようにして考えればいいのでしょうか? 現在目覚まし時計が乗っている線路プレートを調べれば目覚まし時計の移動方向とプレートから外へでる出口の方角がわかります。その方角に次のプレートは存在するか、存在する場合は内部に移動することができるかを調べます。内部に移動することができる場合はまた出口の方向を調べて、次のプレートが存在するかを調べます。

この処理を永久に続けることができるのであればループが形成されています。ループが形成された場合は「あと○秒以内にループを崩してください」という警告文を表示させ、警告に従わない場合はゲームオーバーの処理をおこないます。

ではループが形成されているかどうか判定する関数をつくります。こんなのはどうでしょうか?

最初に目覚まし時計がどの方角に移動しているかを示す列挙体をつくります。

LoopCheck関数のなかでは、以下の処理がおこなわれます。

現在いる線路プレートとAlarmClock1.DirectOfMoveからそのときにどの方角に移動しているかを調べる。
次にその方向に線路プレートがあり、内部に進入できるかどうか調べる。
新しい線路プレートが見つかったらそのプレートの出口がある方角を調べる。
出口がある方向にさらに別の線路プレートがあり、内部に進入できるかどうか調べる。
この処理をループさせ、処理が永久に続くのであれば線路プレートはループ状態になっていると判定する。

ループが形成されているときの処理

Update関数が呼び出されたときにLoopCheck関数を実行してループになっていないか調べます。ループになっている場合は5秒以内にループを崩さないとゲームオーバーとします。

警告文を表示させる機能

次にループ発生の警告と○秒以内にループを崩すように警告文を表示させる処理を示します。

HTMLには”roop-alert”を追加しておいてください。

これで線路プレートでループができてしまった場合の処理は終わりです。

最高スコアを表示する機能

それから最高スコアを表示する機能も追加しておきます。

ハンドルネームとスコアを登録する機能

HTMLに加筆して以下のように変更します。

HTMLでユーザーの名前を登録できるようにします。

ゲームオーバーになったらSendData関数でスコアをサーバーに送ります。

ハンドルネームの欄になにも入力されていない場合は「名無しさん」になります。

データが送られてきたらsave-data.phpで処理をします。送られてきたスコア(ミリ秒単位のプレイ時間)が上位10位以内であれば新しく登録します。save-data.phpの内容は ゲームのハイスコアを保存するで示したものと同じです。

ハイスコア閲覧機能

次にハイスコアを見ることができるようにする方法ですが、これもゲームのハイスコアを保存するで示したものとほとんど同じです。ただし今回はスコアをそのまま表示させるのではなく、○分○秒に変換する必要があります。

get-data.phpはゲームのハイスコアを保存するで示したものと完全に同じです。HTML部分だけ示します。

動作確認は こちらからどうぞ。