更好的C#扑克框架设计?

Wes*_*sey 6 c# oop poker

我正在用C#编写一个扑克框架,我不喜欢我现在的设计.我的目标是拥有一个游戏引擎,可以非常快速地以批处理模式相互播放多个AI代理,并且可以与多个人(可能通过Silverlight客户端)玩多个AI代理.我希望保持高效率但保持灵活性 - 例如,它应该能够玩有限德州扑克,无限注德州扑克,限制7张牌梭哈等游戏.

我目前的设计相当笨拙且不灵活:

  • HandHistory:包含有关当前手牌的所有信息(参与者,投注等)
  • IPlayer:每个玩家定义一个GetAction(HandHistory历史)方法.
  • GameEngine:定义一个返回HandHistory对象的Play(HandInfo信息)方法.
  • PotManager:管理底池并确定每个玩家必须打多少以及他们能赢多少(例如,如果他们有不相等的筹码并全押).
  • BetManager:管理投注并确定投注结束的时间.

HandInfo类包含有关如何设置手的所有信息.Play方法看起来像这样:

HandHistory Play(HandInfo info)
{
    PotManager pots = new PotManager(info);
    BetManager bets = new BetManager(info);
    HandHistory history = CreateHistory(info);

    bets.CollectBlinds();
    if(!bets.GameOver)
    {
        DealHoleCards();
        if(bets.PlayersThatCanStillBet > 1)
            bets.CollectBets();
        if(!bets.GameOver)
        {
            DealFlop();
            ... and on and on
        }
    }

    return history;
}
Run Code Online (Sandbox Code Playgroud)

问题的出现是因为有很多小事要考虑收集百叶窗等等.Bot和Bet经理课程变成了一场噩梦,并且总是充满了虫子.此外,我的引擎设计仅支持一种游戏类型(德州扑克)而不是其他类型.

我的主要排名是效率第一,因为引擎主要用作数十亿手的AI模拟器.但是,我想有一种更优雅的方式可以做到这一点.

Lac*_*lan 3

我的第一个想法是,首先考虑代码的可读性和缺乏冗余,然后优化性能(我认为这就是你所说的效率)。通常很难预见性能瓶颈在哪里,稍微慢一点的应用程序比有错误或无法维护的系统要好。当您准备好优化时,如果您发现像dotTrace这样的产品不够快,那么使用它很容易。

关于您添加功能的愿望,我建议您更好地进行重构。这是 TDD 的核心原则之一:编写最少量的代码来完成一项功能,然后重构任何代码异味。通过使用 TDD,您可以确保当您实施 Stud 时,您的 Hold'em 仍然有效。

开始重构的一个好地方是尝试确保每个类都有单一职责(SOLID 原则的第一个),因为听起来您已经遇到了可维护性问题。您的示例方法有很多职责:投注、发牌、游戏历史记录等。