gpt4 book ai didi

c# - 多人纸牌游戏的游戏架构和设计策略

转载 作者:太空狗 更新时间:2023-10-29 17:53:06 30 4
gpt4 key购买 nike

我对游戏开发还比较陌生,所以我决定从头开始创建一个既能体验又能娱乐的爱好项目。具体游戏类似于扑克称为Three Card Brag .该游戏在电影 Lock, Stock and Two Smoking Barrels 中播放。

我一直在阅读有关游戏开发的一些主题,但主要是 this question .这有助于改进我创建对象的原始方式。

我遇到的一个特殊问题是定义游戏状态。我最初的方法是将所有内容分开(例如,将筹码堆栈保存在 Player 类中),但在阅读了对 question 的回复之后我之前提到过,游戏的所有可能状态似乎都应该保存在 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 对象。

另一方面,如果玩家要加注,我会创建一个实现了 IActionRaiseAction,但是 IAction 接口(interface)只接受当前的游戏状态,我认为如果筹码堆存储在 Player 类中,这将不是理想的。

基本上,我的问题是:我是否可以两全其美,这样我就可以准确表示游戏状态,同时将所有与游戏状态中特定对象相关的数据保留在其给定对象内?

最佳答案

在线游戏中使用 command-pattern (您的 IAction)是执行此操作的标准且经过验证的方法。它不是玩家意义上的面向对象,但 Action 是面向对象的,所以从纯理论的角度来看,它是一个可靠的设计模式,我猜。在实践中,这就是我见过的每个成功的在线游戏如何实现它的方式,但请注意, Action 游戏通常使用非常小的谨慎 Action /数据包,直到它实际上变成某种流。

编辑:

在我回答这个问题很久之后,我回到这里并意识到这个问题的另一种解决方案是实现 GameState 的 Players、Decks 等......从 IState 类派生 IState strong>应用(IAction Action )成员。这样对象就可以对自己应用操作,而不是让应用程序对对象应用操作,这会将操作和状态映射到 visitor-pattern。而不是命令模式。两种解决方案都可以工作,其中访问者具有更大的开销和更多的封装,而命令是封装更少的更简单的解决方案。

关于c# - 多人纸牌游戏的游戏架构和设计策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/605009/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com