ASP.NET Core版 対人対戦できるぷよぷよをつくる(8)の続きです。前回はぷよぷよの棋譜をデータとしてサーバー上に保存できるようにしました。今回はそれを閲覧できるようにします。

cshtml部分

Pages\Puyo-Matchフォルダ内にgame-records.cshtmlという名前でファイルを作成します。そしてそこに以下のように記述します。

puyo-match.jsはこれまで使ってきた、ASP.NET Core版 対人対戦できるぷよぷよをつくるの記事のものと同じです。ここに棋譜を閲覧するために必要な処理を追加していきます。

PuyoMatchHubクラスに機能を追加する

そのまえにここでもAspNetCore.SignalRを使ったサーバーサイドへの接続、サーバーサイドから送信されたデータを受信して処理をおこなっていくので、PuyoMatchHubクラスにそのための機能を追加します。

名前空間は省略して書きます。

閲覧できる棋譜の一覧を取得する

サーバーサイドへの接続が成功したら、まず閲覧できる棋譜の一覧を表示させます。GetRecordsメソッドはサーバー上に保存されているファイルのなかで棋譜が保存されているものを探します。もし見つかったらファイル名とファイルの1行目を読み込んで棋譜情報(プレイヤー名と対戦日時)をクライアントサイドに送信します。

サーバーからファイルのデータを取得する

棋譜閲覧ページで[分析する]ボタンがクリックされたら、その棋譜のデータ(ファイルに保存されている文字列全部)をクライアントサイドに送信します。このとき別のユーザーが同じタイミングでファイルの文字列を読み込もうとすると例外が発生します。なので例外処理をしています。

JavaScriptの処理

まずユーザーがページにアクセスしたときはAspNetCore.SignalRでサーバーサイドへの接続がおこなわれます。これに成功したらサーバーサイドではGetRecordsメソッドが呼び出されます。棋譜閲覧ページ以外では <div id = “game-records”> </div> が存在しないのでなにもおきません。棋譜閲覧ページの場合だけ、GetRecords関数が実行されます。

GetRecords関数が実行され、サーバーサイドから棋譜一覧を表示するための文字列が送られてきたら、これを <div id = “game-records”> </div> 内にこれを挿入します。これによって過去の対戦情報が表示されます。

棋譜を再生する

棋譜を見るためのボタンのタグは以下のような形式になっています。

ボタンをクリックすると、この場合は 引数’20221207-200858.txt’が渡されてGetRecord関数が実行されます。

GetRecord関数は以下のようになっています。サーバーサイドのGetRecordメソッドを呼び出すようになっています。

サーバーサイドのGetRecordメソッドを呼び出して処理が正常におこなわれると、クライアントサイドに”SuccessfulGetRecord”が送信されます。

このときにおこなう処理では独自に定義したStateクラスを使用します。そこでStateクラスを先に示します。

次にサーバーサイドから送信された”SuccessfulGetRecord”を受信したときの処理を示します。

棋譜を閲覧しているユーザーが[前][次]のボタンをクリックしたときの処理を示します。statesIndexが配列の範囲外にならないようにチェックをしてからstatesIndexの値をインクリメントまたはデクリメントしています。そのあとUpdate2関数を呼び出して再描画の処理に必要なグローバル変数の設定をしています。

Update2関数はstates配列から描画の処理に必要なデータを取得してグローバル変数に格納しています。フィールド上のぷよを描画するためのデータの更新は別関数(UpdateFieldPuyos関数)でおこなっています。

3本先取なので第1戦以外のときはゲームが開始されたときのスコアは0ではありません。ひとつのゲームを分析するのであれば両プレイヤーのスコアは0から始まったほうがよいのではないでしょうか? そこでグローバル変数のinitScore0とinitScore1に格納して、その差を利用してスコアを算出しています。

UpdateFieldPuyos関数はフィールド上のぷよを描画するためのデータを更新します。必要なデータはfieldPuyosInfos配列に格納されます。

フィールド上のぷよを描画する処理を示します。