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

6
我正在用C#编写一个扑克框架,但我不喜欢目前的设计。我的目标是拥有一个游戏引擎,可以快速地批量模式下让多个AI代理人互相对战,并且可以让多个AI代理人与多名玩家(可能通过Silverlight客户端)对战。我希望保持效率高,同时保持灵活性——例如,它应该能够玩像限制德州扑克、无限制德州扑克、限制7张牌梭哈等游戏。
我的当前设计相当笨重和缺乏弹性:
- HandHistory:包含当前手牌的所有信息(参与者、下注等)。 - IPlayer:每个玩家都定义了一个GetAction(HandHistory history)方法。 - GameEngine:定义了一个Play(HandInfo info)方法,返回一个HandHistory对象。 - 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;
}

问题的产生是因为有很多小事情需要考虑,比如收集盲注等。Pot和Bet管理器类变得非常混乱且充满了错误。此外,我的引擎设计仅支持一种游戏类型(Hold'em),而不是其他类型。
我的主要目标是效率排名第一,因为该引擎主要用作AI模拟器,可以模拟数十亿次的手牌。然而,我认为还有更加优雅的方法来完成这项工作。
3个回答

3
我的第一反应是,首先编写易读且不冗余的代码,最后再优化性能(我认为这就是您所说的效率)。通常很难预见性能瓶颈会出现在哪里,稍微慢一点的应用程序比有错漏或难以维护的系统要好。当你准备优化时,可以使用像dotTrace这样的产品,如果发现速度不够快。

关于您想添加功能的愿望,我建议您变得更擅长重构。这是TDD核心原则之一:写最少量的代码来完成一个功能,然后消除任何代码异味。通过使用TDD,您可以确保在实现Stud等功能时,您的Hold'em仍然有效。

从您已经遇到可维护性问题的情况开始,使您的重构变得良好,尝试确保每个类具有单一职责(SOLID原则中的第一个) 。您的示例方法具有许多职责:下注,发牌,游戏历史记录等。


除了@Lachlan上面的帖子之外,我建议优化以减少冗余。 - Redwood
总的来说,我同意“先让它工作,然后再让它快”的观点。然而,如果性能是一个重要的部分(如在许多模拟中),通常有助于进行一些估计(需要多久?)并可能编写原型以获得关于某些事情需要多长时间的第一估计。因为有时候一个好的OO设计很难变得真正快速。但请检查这是否真的适用于您! - Philipp

1

0

可以在这里找到现成的德州扑克7张和5张牌评估器的示例,并且这里有进一步的解释。这可能会帮助您提高性能。欢迎在其中找到的电子邮件地址发送反馈。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接