JavaScriptで作成したクラッシュローラーもどきのゲームにランキング機能を追加します。

このゲームをある方に見せたら「ランキング機能を追加したほうがよい」といわれました。たしかにランキング機能があるとなんとしてもランクインさせたいという気持ちになってしまいます。別のゲームで10位まで表示させているものがあるのですが、今回は30位まで表示させます。我こそは!という方がいるなら自分の名前で全部埋めてしまってもかまいません。

追記:このページに書かれている方法ではランキングを偽装することができてしまいます。問題点と偽装の方法はゲームのランキング偽装するのがチョロすぎて草な件を参照してください。またランキング偽装対策をしたものも公開しています。ASP.NET Coreでクラッシュローラーをつくるもみていただけるとありがたいです。

ハンドル名設定のためのテキストボックスを設置

まずプレイヤーが自分の名前を登録できるようにします。ユーザーがハンドルネームを指定できるように、テキストボックスをゲームのページに設置します。そしてゲームオーバー時に30位以内に入っている場合は、ここに入力されている名前がスコアとそのときの時刻とともにランキングに掲載されるようにします。

テキストボックスを表示しなければならないのでHTML部分が変更になります。

index.html

Canvasの大きさを変更

それからCanvasの下にあれこれ追加したのでCanvasのサイズを変更しないとディスプレイのなかにうまく表示されなくなります。そこでCanvasの大きさを変更するために必要な関数を修正します。

map.js

ゲームオーバー時にランキングに反映させる

あとはゲームオーバーになったときにSendData関数を実行するだけです。プレイヤーの名前とスコアが取得されてsave-data.phpにPOSTされます。ハンドルネームの欄になにも入力されていなければ「名無しさん」とします。このあたりは2ちゃんねるの影響をうけています。いまは2ちゃんねるではなく5ちゃんねるですけど。

save-data.php

上記の関数をゲームオーバーになったタイミングで呼べばいいですね。

map.js

Canvasの縦サイズが短くなったのでこのままではGameOverの文字がうまく表示されなくなりました。

ところで残機0になったらゲームオーバーなのですから、残機0の表示とゲームオーバーの表示を別にする必要はないのではないでしょうか? そこでDrawRest関数を変更します。

map.js

Draw関数のなかでDrawGameOverIfNeed関数を呼び出していましたが、これは不要なので削除します。

以上でJSでやる処理はおわりです。

ゲームオーバー時にスコアをPostする

つぎにPHPでやらなければならない処理があります。

ゲームオーバーになったらユーザー名とスコアなどがPostされるのですが、これだけだと外部から不正なPostリクエストをして最高スコアを偽造することができてしまいます。そこでPostされたデータを受け取ったときはそれが自分のドメインからかどうかを確認します。これでランキング偽装は防げると思います。

ランキングはデータベースをつかってもいいのですが、格納されているデータにパスワードのようなものは存在せず、格納されているデータはすべて表示してしまうのであまりセキュリティは考えなくてよいと思います。そこでcsvファイルに保存し、それを表示するという安易な方法を採用しています。

csvファイルも以下に示すsave-data.phpも同じディレクトリ内に設置します。

save-data.php

ランキング情報を表示する

ランキング情報をファイルとして保存したら、これを表示する手段を用意しなければなりません。同じディレクトリ内にあるhigh-score.htmlにアクセスしたらランキング情報が表示されるようにします。

まずhigh-score.htmlを示します。

アクセスされたら後述するget-data.phpでランキング情報を取得してランキングの表示をおこないます。あと他にも自作したゲームをしてほしいのでそのページへのリンクも右側のカラムに表示させます。スマートフォンのような横幅の狭い端末の場合はカラムを左右にわけるのではなく、ランキングの下にリンクを表示させます(レスポンスウェブデザイン)。またゲーム画面に戻るためのボタンも設置します。

high-score.html

ランキング情報をcsvファイルから取得する

最後にランキング情報が格納されているcsvファイルからランキングを取得するget-data.phpを示します。

get-data.php

追記:この方法ではランキングを偽装することができてしまいます。問題点と偽装の方法はゲームのランキング偽装するのがチョロすぎて草な件を参照してください。またランキング偽装対策をしたものも公開しています。ASP.NET Coreでクラッシュローラーをつくるもみていただけるとありがたいです。