2010-08-19 77 views
6

我正在用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模拟器。不过,我想认为有一种更优雅的方式可以做到这一点。

回答

3

我首先想到的是,为便于阅读和缺乏冗余的代码第一,并优化性能(我以为是你的效率是什么意思)最后。通常很难预测性能瓶颈将会在哪里,稍微慢一点的应用程序要好于一个有问题或无法维护的系统。当你准备优化时,如果发现速度不够快,就很容易使用dotTrace这样的产品。

关于您希望增加功能的问题,我建议您在refactoring处变得更好。这是TDD核心原理之一:编写最少量的代码来完成一项功能,然后重构任何代码异味。通过使用TDD,您可以确保在实施时,比如Stud,您的德州扑克仍然有效。

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

+0

除了@ Lachlan的帖子上面,我会建议优化缺乏冗余。 – 2010-09-10 16:07:54

+0

我同意“先让它工作,然后再快速”。然而,如果性能是一个重要部分(就像在许多模拟中那样),通常有助于做出一些估计(哪些将需要多久?),并且可能编写一个原型以获得关于某些事情需要多长时间的第一个估计。因为有时听到一个很好的OO设计会非常快速。而且,我担心,有时候你需要这个。但请检查这是否真的是你的情况! – Philipp 2011-03-24 06:34:23

0

一个现成的德州扑克7和5卡评估器的例子可以找到here和进一步解释here。这可能会帮助你提高性能。所有的反馈意见欢迎在其中找到的电子邮件地址。