ASP.NET Core版 対戦型のマインスイーパーをつくる(3)の続きです。

前回はスルーした以下の課題に応えます。


(3)最後のマスを開いたプレイヤーにはボーナスポイントを与えてはどうか。
(8)終盤になってミスをすると高得点は見込めないので、難しいところは配点を上げるとか、参加人数や残りのセル数で配点を変えてほしい。
(9)クリア時に成績優秀者を表示して欲しい。

配点を見直す

開けたセルの数字が0の場合、その周囲は絶対に安全なので点数を下げます。それ以外の部分は残りのセル数が少なくなるごとに配点を1点ずつ上げていきます。最初に開けたときは1点、その次は2点と1点ずつあげていき、最後のセルを開けたプレイヤーには通常の点数とは別に1000点を追加します。

これは既存のスコアを加算するメソッドです。

これを変更すればよいのですが、その前にGameクラスにメソッドを追加します。

またステージクリアした場合は_openCountを0に戻さなければなりません。

あとは新しく定義したGame.GetAddScoreメソッドで追加すべき点数を取得して加点処理をおこないます。

最後のマスを開いたプレイヤーにボーナスポイント

最後のセルを開いたプレイヤーにボーナスポイントを追加するのであればMinesweeperHub.CheckClearメソッドを修正します。

スコアを追加するだけではプレイヤー自身のスコアの表示は変わらないので、1000点を追加したあともう一度ReceiveOpenを送信します。

クリア時に成績優秀者を表示

クリア時に成績優秀者を表示する機能ですが、成績優秀者はクリア時にゲームオーバーになっていない、そのステージで多くのセルを開いたプレイヤーと定義します。

サーバーサイドにおける処理

そのステージにおいてどれだけのセルを開いたのかを記憶しておかなければなりません。そこで以下のプロパティとメソッドを追加します。

MinesweeperHubクラスのAddScoreメソッドが実行されたときに、プレイヤーが開いたセルとそのステージの得点を記憶させます。

あとはステージクリアになったときにプレイヤーのなかから上位3名を探してボーナスポイントを手にしたプレイヤー名と上位3名の成績をカンマ区切りの文字列としてクライアントサイドに送信します。

クライアントサイドにおける処理

クライアントサイドではReceiveShowRankingを受信したらカンマ区切りの文字列を配列に格納します。そしてReceiveDrawを受信したときにこれをcanvas上に描画します。

wwwroot\mine-sweeper\app.js

ランキングの消去

次のステージが開始されたらcanvas上のランキングは消します。クライアントサイドにReceiveHideRankingを送信します。

クライアントサイドではrankingArray配列を空にします。

wwwroot\mine-sweeper\app.js