6

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

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

  • HandHistory:包含有关当前手牌的所有信息(玩家、下注等)
  • IPlayer:每个玩家定义一个 GetAction(HandHistory history) 方法。
  • GameEngine:定义一个返回 HandHistory 对象的 Play(HandInfo info) 方法。
  • 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;
}

问题的出现是因为有太多的小事情需要考虑,比如收集盲注等等。底池和投注经理课程变成了一场噩梦,并且总是充满了错误。此外,我的引擎设计只支持一种游戏类型(Hold'em)而不是其他游戏类型。

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

4

3 回答 3

3

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

关于您添加功能的愿望,我建议您在重构方面做得更好。这是 TDD 的核心原则之一:编写最少的代码来完成一个功能,然后重构所有代码异味。并且通过使用 TDD,您可以确保当您实施 Stud 时,您的德州扑克仍然有效。

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

于 2010-08-19T21:15:53.483 回答
1

我真的很喜欢为 Battleship AI 锦标赛IOpponent编写的界面。John Gietzen我会看看他的框架以获得一些灵感。

什么是最好的战舰 AI?

哦,我最近看到了这个: http://visualstudiogallery.msdn.microsoft.com/en-us/ba4638ad-a2d2-49e5-ae46-94e0f747cae0?SRC= VSIDE

于 2010-08-19T21:11:42.587 回答
0

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

于 2011-03-24T05:49:08.980 回答