ASP.NET Core版 対コンピュータ対戦できるぷよぷよをつくる(1)の続きです。今回はゲームの進行全体を管理するPuyoGameクラスを定義します。

PuyoGameクラスの定義

以降は名前空間を省略して以下のように書きます。

各プロパティ

ConnectionIdプロパティはAspNetCore.SignalRでサーバーサイドに接続するときに付与されるIDです。PlayerNameはプレイヤー名です。プレイヤー名で空文字列を指定したときは自動的に”名無しさん”となります。

ぷよを動かすにあたってプレイヤー用とコンピュータ側のFieldオブジェクトを作成します。FieldsにはFieldオブジェクトの配列が格納されます。またScoresプロパティにはプレイヤー用とコンピュータ側双方のスコアが格納されます。

サーバーサイドでデータが変更されたらそれをクライアントサイドに送信することになりますが、FixedPuyoRowsTextsプロパティ、FixedPuyoColsTextsプロパティ、FixedPuyoTypesTextsプロパティ、FixedPuyoRensasTextsプロパティにはぷよの行、列、種類、連鎖数がカンマ区切りの文字列として格納されます。

FallingPuyoRowsTextsプロパティ、FallingPuyoColsTextsプロパティ、FallingPuyoTypesTextsプロパティには落下中のぷよの行、列、種類がカンマ区切りの文字列として格納されます。

コンストラクタ

上記の各プロパティを初期化します。そしてFieldオブジェクトにイベントハンドラを追加します。

ゲーム開始の処理

ゲームを開始するときは各Fieldオブジェクトを初期化してスコアを0にリセットします。そしてぷよを自然落下させるためのタイマーをStartさせます。

StopTimerForPuyoDownメソッドはゲーム終了時や次のステージに移行しているときにぷよを自然落下させるためのタイマーを停止するためのものです。

ぷよの移動、回転、落下の処理

ユーザーがキー操作でぷよを移動、回転、落下させるための処理を示します。Fieldクラスの対応したメソッドを呼び出しているだけですが、回転に成功した場合と急速落下させたぷよが着地したときは効果音を鳴らすためにイベントを発生させます。

連鎖時の処理

連鎖が発生したとき(1連鎖のみの場合を含む)も効果音を鳴らしたい(プレイヤー用とコンピュータ側で効果音を変えたい)ので、このときもイベントを発生させてクライアントサイドに通知できるようにしています。

加点時の処理

点数が加算されたときの処理を示します。点数が加算されるときとは連鎖が完了したときで、敵側に送り込むぷよの数を計算して確定させなければなりません。計算式は(追加点 ÷ 70)とします。実際にはおじゃまレートなる要素も必要なのですが、ここでは考えないことにします。この計算式ではぷよを4個つなげて消すだけの連鎖なし(1連鎖)では1個もおじゃまぷよを送り込むことができないことになります。

また自分のフィールドに降ってくるおじゃまぷよがすでに存在するときはそれと相殺する処理がおこなわれます。相殺が発生したらこれもクライアントサイドで処理をさせたいので、イベントを発生させます。

おじゃまぷよの落下処理

おじゃまぷよの落下処理がおこなわれるときは効果音を鳴らしたいので、この場合もイベントを発生させます。

ネクストぷよ出現時の処理

落下中の組ぷよが着地したらクライアントサイドでは次の組ぷよの表示を切り替えなければなりません。そのためのイベントを発生させます。

ゲームオーバー時の処理

ゲームオーバーになったときの処理を示します。ユーザー側がゲームオーバーになったら文字通りのゲームオーバーです。コンピュータ側がゲームオーバーになったらステージクリアです。そのための処理を示します。

どちらの場合もイベントを発生させます。ユーザーがゲームオーバーになった場合はスコアランキングへの登録をおこないます。ステージクリアの場合はタイマーを一時停止して2秒後にFieldオブジェクトを初期化してゲームを再開します。この場合はコンピュータ側のスコアを0にします。

更新処理用データを送信するための処理

AspNetCore.SignalRクラスでクライアントサイドに描画更新用のデータを送信することになりますが、送信すべきデータを作る処理が必要です。以下の処理は固定されたぷよと落下中のぷよのRowプロパティやColプロパティをカンマ区切りの文字列にしたものをPuyoGameクラスの各プロパティにセットします。

セットされた文字列はAspNetCore.SignalRクラス側から1秒間に30回くらいの頻度で取得され、クライアントサイドに送信されます。

これはPuyo.Typeプロパティを数字に変換するためのメソッドです。

固定されたぷよと落下中のぷよの各プロパティをカンマ区切りの文字列にしたものを返す処理を示します。

Fieldクラス内でぷよに関するデータが変更されたときはイベントハンドラにおいて以下のような処理がおこなわれます。

やっていることは上述のメソッドでカンマ区切りの文字列を取得して、PuyoGameクラスのプロパティに格納しているだけです。

ぷよの自然落下とCPU側の動作

1秒おきに以下の処理がおこなわれます。ユーザー側の落下中のぷよを1段下げるとともに、コンピュータ側のぷよの操作をおこなっています。コンピュータ側がやっていることはいわゆるカエル積みです。なにも考えずぷよを両側に積み上げているだけです。これでもたまに高連鎖がおきることがあります。

カエル積みのアルゴリズムです。右側の列からなんの工夫もなく順に積んでいるだけです。ぷよが出現する列は最後にして右側が詰まったら左側から積んでいきます。