マルチプレイヤーカードゲームのゲームアーキテクチャと設計戦略
-
03-07-2019 - |
質問
ゲーム開発は比較的新しいので、経験とエンターテイメントの両方のために、趣味のプロジェクトをゼロから作成したいと決めました。特定のゲームは、 3つのカードブラッグとして知られるポーカーに似ています。ゲームは映画の中でロック、ストック、2つの喫煙バレルで再生されます。
主にこの質問。これは、オブジェクトを作成していた元の方法を刷新するのに役立ちました。
私が抱えている特定の問題の1つは、ゲームの状態を定義することです。私の最初のアプローチは、すべてを分離することでした(たとえば、チップスタックを Player
クラス内に保持する)が、質問前述したように、ゲームのすべての可能な状態を GameState
オブジェクト内で維持する必要があるようです。私が思いついたのは本質的にこれです:
abstract class CardGameState
{
protected List<Player> _Players;
protected Player _CurrentPlayer;
protected Dictionary<Player, int> _Chips;
protected Dictionary<Player, Hand> _CurrentHand;
protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc.
/* etc. */
各 CardGameState
は何らかのアクションによって変更されます:
public interface IAction
{
string Name { get; }
CardGameState Apply(CardGameState state);
bool IsLegal(CardGameState state);
}
今、これはオブジェクト指向プログラミングの目的に反していると非常に強く感じています。なぜなら、プレーヤーに特に関連するデータ(この場合、彼のチップスタック、ハンド、および現在のステータス)は、 Player
オブジェクト。
一方、プレーヤーがベットをレイズする場合、 IAction
を実装する RaiseAction
を作成しますが、 IAction
インターフェースは現在のゲーム状態のみを受け入れます。これは、チップスタックが Player
クラス内に格納されている場合には理想的ではないと思います。
基本的に、私の質問は次のとおりです。特定のオブジェクト内のゲーム状態内のオブジェクトに関連するすべてのデータを同時に保持しながら、ゲーム状態を正確に表現できるように両方の長所を使用できますか?
解決
コマンドパターン(IAction)を使用するオンラインゲームが標準です。実証済みの方法。プレーヤーの意味ではオブジェクト指向ではありませんが、アクションはオブジェクト指向です。したがって、純粋に理論的な観点から見ると、堅実なデザインパターンです。そして実際には、私が見たすべての成功したオンラインゲームがそれを実装する方法ですが、アクションゲームは通常、非常に小さな控えめなアクション/パケットを使用することに注意してください。
編集:
これに答えて久しぶりにここに戻って、この問題の別の解決策が
他のヒント
オブジェクト指向のためにオブジェクト指向になっているようです...
Bob Martinの古典的なボウリングゲームの問題のようです。
編集:-概要-
長い間読みましたが、基本的に、TDDとリファクタリングを通じて、ボウリングスコアリングアプリケーションは、多数のクラスと多態性を持つ巨大なクラスターから20〜30行のエレガントなコード行になりました。どうして?そもそも実際にそこにいる必要はなかったからです