ASP.NET Core版 ボンバーマンのような対戦型ゲームをつくる(5)の続きですが、ここからは延長戦です。ゲームの進行に伴って壁が爆破されてなくなっていきますが、そのときに新しく壁を生成して追加する処理をおこないます。

壁が追加される条件

破壊できない壁が存在しない列で縦または横の壁がすべて無くなった場合、壁を追加します。ただしそれによってプレイヤーが動けなくなっては困るので以下の条件をつけます。

その列の前後にもプレイヤーは存在しない
その列には爆弾は設置されていない

以下は縦列で破壊できない壁が存在しない列で、その列だけでなくその列の前後にもプレイヤーは存在しない、しかもその列には爆弾は設置されていないという条件で追加すべき壁を第一引数のリストに格納するメソッドです。

横列(というか行)も同様に追加すべき壁を第一引数のリストに格納するメソッドを定義します。

壁を追加する処理

Timer.Elapsedイベントが発生したら壁を追加する必要があるかを判断して、必要である場合は壁を追加します。

ただいきなり壁が出現するとユーザーがびっくりするので壁が出現する場合はその場所に壁を点滅させます。追加する壁をフィールド変数 WallsToAddedに格納してこの座標をクライアントサイドに送信します。その3秒後に壁をGame.Wallsに追加してSendWallsメソッドを実行し、クライアントサイドでも実際に存在する壁として描画させます。

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

クライアントサイドにおける処理を示します。

まず出現しようとする壁のX座標とY座標を格納する配列を定義します。そしてReceiveWallsToAddedを受信したらこの配列に座標を格納すると同時に壁が出現するさいの効果音を鳴らします。

wallsToAddedXとwallsToAddedY内に要素が存在する場合はその壁を点滅させます。DrawWalls関数のなかでupdateCountの値をつかって描画したりしないことで点滅しているように見せます。

ReceiveWallsを受信したら壁が仮状態ではなく確定したことになるので配列はクリアします。

wwwroot\bomber\app.js