我正在用C#写一个扑克框架,而且我不喜欢我目前的设计。我的目标是拥有一个游戏引擎,可以非常快速地在批处理模式下相互扮演多个AI代理,并且与多个人(可能通过Silverlight客户端)进行多个AI代理。我希望保持效率高但保持灵活性 - 例如,它应该能够玩有限德州扑克,无限德州扑克,极限7卡螺柱等游戏。更好的C#扑克框架设计?
我目前的设计是相当笨重,不灵活:
- HandHistory:包含所有有关当前手头的资料(玩家,下注等)
- IP层:每个球员定义的getAction(HandHistory历史)方法。
- 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;
}
出现的问题,因为有这么多的小事情要考虑喜欢收集百叶窗等锅内投注管理类成为一场噩梦,并与错误都不约而同百出。另外,我的引擎设计只支持一种游戏类型(Hold'em)而不是其他游戏类型。
我的主要排名是效率第一,因为发动机主要用作数十亿手中的AI模拟器。不过,我想认为有一种更优雅的方式可以做到这一点。
除了@ Lachlan的帖子上面,我会建议优化缺乏冗余。 – 2010-09-10 16:07:54
我同意“先让它工作,然后再快速”。然而,如果性能是一个重要部分(就像在许多模拟中那样),通常有助于做出一些估计(哪些将需要多久?),并且可能编写一个原型以获得关于某些事情需要多长时间的第一个估计。因为有时听到一个很好的OO设计会非常快速。而且,我担心,有时候你需要这个。但请检查这是否真的是你的情况! – Philipp 2011-03-24 06:34:23