我正在用 C# 编写一个扑克框架,但我不喜欢我目前的设计。我的目标是拥有一个游戏引擎,可以非常快速地在批处理模式下让多个 AI 代理相互对抗,并且可以与多个 AI 代理对战(可能通过 Silverlight 客户端)。我想保持高效率但保持灵活性——例如,它应该能够玩有限德州扑克、无限德州扑克、有限 7 张牌梭哈等游戏。
我目前的设计相当笨拙且不灵活:
- HandHistory:包含有关当前手牌的所有信息(玩家、下注等)
- IPlayer:每个玩家定义一个 GetAction(HandHistory history) 方法。
- GameEngine:定义一个返回 HandHistory 对象的 Play(HandInfo info) 方法。
- 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 模拟器。但是,我想认为有一种更优雅的方式可以做到这一点。