ハースライクDCGの構造研究のための実装実験#2

オンライン対戦ゲームを実装するにあたって最も有効なチート対策は、ゲームのルール処理を全てサーバ上で行い、クライアント(プレイヤー端末)には必要な情報のみを送り、有効な入力のみを受け付けるようにすること。
リアルタイムでフレーム単位の処理が必要なゲームではこの方法は現状では実装が非常に難しいが、カードゲーム等のターンベースには最適である。(専用のサーバを用意する、という点がいささかネックではあるが)

つまりオンライン対戦カードゲームを作るということは、サーバ(ルール処理)とクライアント(表示/入力処理)を分けて考える必要がある。

というわけでまずはルール処理に使うデータ構造を考えていく。

クラス

Board

「盤面」を意味し、対戦上の情報を全て内包する。
二人のプレイヤーを表すPlayerクラスのインスタンス二つと、経過ターン数やどちらのターンかを表す変数など、プレイヤーに依存しない情報を持つ。

Player

個々のプレイヤーの情報を持つ。
山札や手札のカードや盤面のユニット、ライフ等のプレイヤーに属するものは全てここで管理される。

Card

カードを表す。
DCGにおいてはプレイ中にカードの内容が書き換えられることもよくあるので、固定データであるCardDataとは別に書き換えに対応した別のクラスを作った。

Unit

盤面上のユニットを表す。
Cardをそのまま利用することも可能だが、別にした方がいろいろ都合が良さそうに思えたので別クラスとして作成。

処理

このクラスを元に、プレイヤーからの入力をBoardのメンバ関数として実装していく。とりあえず内部状態の変更のみでクライアント出力に必要な諸々はあとで考える。

初期化

両者のデッキを受け取り、初期状態を構築する。
各々の手札情報を送信し(未実装)、
マリガン待機状態に移行する。

マリガン

マリガン情報を受け取り、手札と山札を更新する。
両者のマリガン操作が完了したら、
更新された情報を送信し(未実装)、
先攻プレイヤーのターン開始に移行する。

ターン開始

ターン開始処理を実行する。
これは自動で実行される。
完了すればメインフェイズに移行する。
メインフェイズの開始と同時にここで発生した情報(ターン開始時のドローとか)を送信する(未実装)

メインフェイズ

いろいろな行動を受け付ける。
出来ない行動やターンプレイヤーでない操作はもちろん受け付けない。
行動ごとに内部状態を変更しながら、
更新情報を送信する(未実装)。

  • カードの使用

  • ユニットの攻撃

  • 特殊行動

  • ターン終了

ターン終了

ターン終了処理を実行する。
これはメインフェイズでターン終了が実行されたのち自動で実行される。
更新情報があれば送信する(未実装)。
最後にターンプレイヤーが変更され、ターン開始に移行する。

次回予定

メインフェイズをもうちょっと詳しく。
特にゲームの根幹である「カードの使用」と「ユニットの攻撃」について。

コードも書いているが、もうちょっと自由に試行錯誤したいのでGitHubに上げるのはもうちょっとしてから。

この記事が気に入ったらサポートをしてみませんか?