2010-08-19 50 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。這可能會幫助你提高性能。所有的反饋意見歡迎在其中找到的電子郵件地址。