更好的 C# Poker 框架设计?
Posted
技术标签:
【中文标题】更好的 C# Poker 框架设计?【英文标题】:A Better C# Poker Framework Design? 【发布时间】:2011-04-01 08:50:09 【问题描述】:我正在用 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 模拟器。不过,我想有一种更优雅的方式可以做到这一点。
【问题讨论】:
【参考方案1】:我的第一个想法是,首先是可读性和缺乏冗余的代码,然后是优化性能(我认为这就是您所说的效率)。通常很难预见性能瓶颈会在哪里,稍微慢一点的应用程序比有缺陷或无法维护的系统要好。当您准备好进行优化时,如果您发现它不够快,则可以轻松使用像 dotTrace 这样的产品。
关于您添加功能的愿望,我建议您在refactoring 变得更好。这是 TDD 的核心原则之一:编写最少的代码来完成一个功能,然后重构所有代码异味。并且通过使用 TDD,您可以确保在实施 Stud 时,您的德州扑克仍然有效。
从重构开始的一个好地方是,因为听起来您已经遇到了可维护性问题,所以尝试确保每个类都有一个单一的职责(SOLID priciples 的第一个职责)。您的示例方法有很多职责:下注、发牌、游戏历史等。
【讨论】:
除了上面@Lachlan 的帖子,我建议优化缺乏冗余。 我一般同意“首先让它工作,然后让它快速”。但是,如果性能是一个重要部分(就像在许多模拟中一样),那么进行一些估计通常会有所帮助(多久需要一次?)并且可能编写一个原型来初步估计某些事情需要多长时间。因为有时听说一个不错的 OO 设计会变得非常快。而且,恐怕有时你需要这个。但请检查您是否真的是这种情况!【参考方案2】:我真的很喜欢 IOpponent
为 Battleship AI 比赛由 John Gietzen
编写的界面。我会看看他的框架以获得一些灵感。
What is the best Battleship AI?
哦,我最近看到了这个: http://visualstudiogallery.msdn.microsoft.com/en-us/ba4638ad-a2d2-49e5-ae46-94e0f747cae0?SRC=VSIDE
【讨论】:
【参考方案3】:可以在here 找到现成的德州扑克 7 和 5 牌评估器的示例,并进一步解释 here。这可能会帮助您提高性能。欢迎在其中找到的电子邮件地址提供所有反馈。
【讨论】:
以上是关于更好的 C# Poker 框架设计?的主要内容,如果未能解决你的问题,请参考以下文章