我正在用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