我正在用C#编写一个扑克框架,但我不喜欢目前的设计。我的目标是拥有一个游戏引擎,可以快速地批量模式下让多个AI代理人互相对战,并且可以让多个AI代理人与多名玩家(可能通过Silverlight客户端)对战。我希望保持效率高,同时保持灵活性——例如,它应该能够玩像限制德州扑克、无限制德州扑克、限制7张牌梭哈等游戏。
我的当前设计相当笨重和缺乏弹性:
- HandHistory:包含当前手牌的所有信息(参与者、下注等)。 - IPlayer:每个玩家都定义了一个GetAction(HandHistory history)方法。 - GameEngine:定义了一个Play(HandInfo info)方法,返回一个HandHistory对象。 - PotManager:管理奖池并确定每个玩家需要下注多少以及他们可以赢取多少(例如,如果他们的筹码堆大小不同,并且全部下注)。 - BetManager:管理下注并确定何时结束下注回合。
HandInfo类包含设置手牌的所有信息。Play方法看起来像这样:
问题的产生是因为有很多小事情需要考虑,比如收集盲注等。Pot和Bet管理器类变得非常混乱且充满了错误。此外,我的引擎设计仅支持一种游戏类型(Hold'em),而不是其他类型。
我的主要目标是效率排名第一,因为该引擎主要用作AI模拟器,可以模拟数十亿次的手牌。然而,我认为还有更加优雅的方法来完成这项工作。
我的当前设计相当笨重和缺乏弹性:
- HandHistory:包含当前手牌的所有信息(参与者、下注等)。 - IPlayer:每个玩家都定义了一个GetAction(HandHistory history)方法。 - 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;
}
问题的产生是因为有很多小事情需要考虑,比如收集盲注等。Pot和Bet管理器类变得非常混乱且充满了错误。此外,我的引擎设计仅支持一种游戏类型(Hold'em),而不是其他类型。
我的主要目标是效率排名第一,因为该引擎主要用作AI模拟器,可以模拟数十亿次的手牌。然而,我认为还有更加优雅的方法来完成这项工作。