久しぶりにASP.Net Coreでオンライン対戦型のゲームを作ります。内容はスネークゲームです。自分自身の胴体や他のプレイヤーに衝突しないように注意しながら移動する餌を食べて成長させていきます。餌の状態は固定ではなく加点対象になる餌、減点対象になる餌、食べると即死する餌と変化していきます。タイミングを見計らって食べていきましょう。

それでは作成していきましょう。

ところで今回は特別協力者がいます。「れいかちゃま」こと琴音麗華さんです。歌って踊れる声優を目指しているということなので音声データを提供していただきました。

ムシャムシャ

ニンジン嫌い

ざまあ

ふぎゃあ

ウンコおいしくない

みんなで明日のアイドル「れいかちゃま」を応援しましょう。

れいかちゃま – プロフィール – SHOWROOM(ショールーム)

Twitter

インスタ

名前空間はChamatherioとします。

定数 Constクラスの定義

最初に定数部分を示します。同時プレイできるプレイヤー数の上限、フィールド上に散らばっている餌の数などです。

座標 Positionクラスの定義

座標管理用のPositionクラスを定義します。

Playerクラスの定義

Playerクラスを定義します。以下、記事内では名前空間部分は省略します。

プロパティ

各プロパティを示します。

初期化

フィールド変数とコンストラクタを示します。

各プレイヤーの頭と胴体を生成します。またNPCが方向転換する座標を決定します。

死亡時から復帰するときの初期化の処理を示します。

コンストラクタ内で取得した初期座標、初期移動量を現在座標と現在移動量にセットします。また長さを初期値にセットします。NPCにConnectionIdは存在しないので空文字列を設定し、プレイヤー名を”NPC XXX”という名前にします。胴体の座標は頭を先頭に初期移動量の反対側にずーっと続くのでそのように設定します。

ゲーム開始時の処理

ユーザーがゲームを開始したときの処理を示します。

現在NPCになっているPlayerオブジェクトのどれかにプレイヤー名とconnectionIdをセットします。また座標は中央とします。同時に複数のユーザーがプレイを開始するかもしれないのでNumberプロパティを参照して、座標を微妙にズラしています。

移動の処理

移動の処理を示します。

現在位置を移動量分変更するのですが、そのあと胴体の座標がつながっています。そこで胴体の座標は前の要素の座標をセットすることにします。なので、処理は後ろの要素から行ないます。

またNPCの場合は方向転換の処理もおこないます。方向転換のアルゴリズムは単調で、同じところをグルグル回っているだけです。今後の改善するかもしれません(約束はしない)。

衝突判定

自分の胴体または他のプレイヤーに衝突したときの処理を示します。

自分自身との衝突判定は頭の近くにある部分は対象から外します(そうしないと常に衝突と判定されてしまう)。他のプレイヤーとの衝突判定は全身とします。

方向転換の処理

ユーザーの操作によって方向転換するための処理を示します。引数で上下左右の移動方向が渡されるので、それに対応してVXプロパティとVYプロパティを変更しています。

座標情報の取得

GetPositionsTextメソッドはクライアントサイドにプレイヤーの座標を送る必要があるのですが、そのときに使う文字列を取得するためのものです。無敵状態のときは点滅させたいので無敵状態のときは2回に1回の割合でしか文字列を取得していません。

Foodクラスの定義

餌になるFoodクラスを定義します。以下、記事内では名前空間部分は省略します。

プロパティ

各プロパティを示します。

初期化

フィールド変数とコンストラクタを示します。

餌を初期化する処理を示します。餌をフィールド全体にランダムに配置します。移動方向はX方向、Y方向ともに±1または±2とします。

餌を移動させる処理を示します。移動量だけ移動させるのですが、壁にあたったら移動量に -1 を掛けて跳ね返るように移動させます。また128回移動処理をしたら餌の状態を変更します。