Turn based multiplayer strategy game framework

最近ターンベースのゲーミングフレームワークを作れないかと考えている。
ゲームと言うてもいろいろあるのでまずはどんなゲームを対象にするかというのが重要で、ここをしっかりと決めないと何でもできるが何もできないフレームワークが完成してしまう。
今のところはカタンとか囲碁、将棋、ドミニオン、アグリコラなどなど…プレイヤーのターンが明確に決まっていて、ターンが続く事でゲームが進行してゆくようなゲームを対象とした。

フレームワークのオブジェクトとしてGame、Player、Fieldくらいを用意する。Gameはゲーム全体を司るオブジェクト。よく考えずに用意したのでもしかしたらいらないかもしれない。Playerはゲームの参加者を表すオブジェクト。Fieldは全プレイヤー共通の場となるオブジェクトでプレイングボードとか場とか呼ばれるものを司る。フレームワークとしては手札とかガイスターの駒のように同じオブジェクトだけど自分と他プレイヤーで認識できる情報に差異があるものを自動的に吸収する仕組みをもつと良さそう。
実装としてはプレイヤーとかの初期化時にフルデータをプライベートに持たせておいて、自身や他プレイヤーがそのプレイヤーの情報を欲しくなった時に必要なメソッドを呼び出してフルデータからフィルタリングした情報を返すようにする。もしくは各プレイヤーのマスターデータ的なのをゲーム自身が保持していてそれと各プレイヤーが見えている情報が自動で更新されるようにしてしまうか。後者のほうが一度それぞれのプレイヤーに対してそのプレイヤーがアクセス可能な範囲を限定するフィルターを定義したらあとはファンクショナルに処理が書ける気がして良いかもしれない。

あとはプレイヤーとかの行動を定義するTurnとそれを管理するTurnManagerがあり、さらにターンを幾つかの単位で管理するRoundManagerってのがある。
ターンではターンマネージャーがイニシャライズ処理してからプレイヤーがあれこれしてターンターンがファイナライズ処理をし、次のプレイヤーにターンが移る。次のプレイヤーは現在のプレイヤーのファイナライズ処理時に指定するのが良さそう。この辺ターンマネージャーでも良いかなと思っていて、プレイヤーのファイナライズ処理で次のプレイヤーを指定するようにするとプレイヤーのベースクラスを拡張したクラスを作らせる感じになり、ターンマネージャーが持つとその中のメソッドを実装するという感じになるのかなと。多分やること自体はどっちも同じだと思う(ゲームの参加者リストみたいなのと現在のプレイヤーの情報を使って次のプレイヤーを割り出す)。
RoundManagerはル・アーブルとか7wondersとか、あとはゲーム終了のトリガーが引かれたらラウンドの最後までやって終了みたいなゲームをするときに必要かなと。ゲーム中にラウンドという概念はないけどゲーム開始・終了時にスタートプレイヤーから近い順に優劣差を付けるようなゲームにも必要かもしれない。

ゲームの終了処理は基本的にプレイヤーのファイナライズ処理に混ぜ込むか、ターンマネージャーもしくはラウンドマネージャーが管理すればいいと思う。カタンとかFluxxのように手番の途中でも突然ゲームが終了する物は例外的でゲーム終了のメソッドを叩くしかない。助けてくれ。実質ターンの終了まで待てるものだったらターンの終了に混ぜ込むのが良いのかな。

上の方でも書いたけどファンクショナルに書けるならそれが一番良くて、ただ状態がめっちゃ色々な所にあるのでそれをどう管理するか(管理しなくて済むようにするか)ってのが難しい。うまくやらないとフレームワークのせいで治安悪化したみたいになってしまう。React.jsみたいにrootですべての状態管理が出来るならそれに越したこと無いのかな。

広告


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中