题
我正在用C#编写扑克框架,但我不喜欢目前的设计。我的目标是拥有一个可以在批处理模式下可以在批处理模式下互相玩多个AI代理的游戏引擎,并扮演多个AI代理与多个人(可能是通过Silverlight客户端)。我想保持效率很高,但保持灵活性 - 例如,它应该能够玩诸如limit hold'em,no-limit hold'em,limit限制7卡螺柱等游戏,等等。
我目前的设计相当笨拙且僵化:
- 手段:包含有关当前手的所有信息(玩家,投注等)
- iPlayer:每个玩家都定义了getAction(手工历史记录)方法。
- GameEngine:定义返回手工历史对象的播放(Handinfo Info)方法。
- POTMANAGER:管理锅,确定每个玩家必须打电话多少以及他们能赢得多少胜利(例如,如果他们有不平等的堆栈,并且是全输的)。
- Betmanager:管理赌注并确定何时完成投注。
Handinfo类包含有关如何设置手的所有信息。然后,播放方法看起来像这样:
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;
}
出现问题是因为有很多小事需要考虑,例如收集百叶窗等。锅和BET经理的课程成为一场噩梦,并且总是充满虫子。另外,我的引擎设计仅支持一种游戏类型(Hold'EM),而不是其他游戏类型。
我的主要排名是效率的首先,因为该发动机主要用作数十亿手的AI模拟器。但是,我想认为可以做到这一点更优雅。
解决方案
我的第一个想法是,首先是可读性和缺乏冗余的代码,并对性能进行优化(我认为这是您所说的效率)。通常,很难预见到性能瓶颈的位置,并且一个较慢的应用程序比越野车或无与伦比的系统更好。使用这样的产品很容易 Dottrace 当您准备好优化时,如果发现它不够快。
关于您添加功能的愿望,我建议您变得更好 重构. 。这是TDD的核心价格之一:编写最少的代码以完成功能,然后重构任何代码的气味。通过使用TDD,您可以确保在实现,例如螺柱时,您的hold'em仍然可以工作。
从重构开始的一个好地方,因为听起来您已经遇到了可维护性问题,就是要确保每个班级都有一个责任(第一个班级 固体定价)。您的示例方法有许多责任:投注,交易,游戏历史等。
其他提示
我真的很喜欢界面 IOpponent
那是由 John Gietzen
对于战舰AI锦标赛。我会看看他的框架以寻求灵感。
哦,我最近看到了:http://visualstudiogallery.msdn.microsoft.com/en-us/ba4638ad-a2d2-49e5-ae46-94e4e0f747cae0?src=vside