回合这个词有点含糊。BettingRound 使它更加明显。我认为这里不需要卡片、姓名和罐子大小。Potsize 是整个下注回合中的动作和变化的函数。席位比玩家列表更能代表游戏,因为这使您可以更明显地代表游戏状态(筹码量等)。我不认为有必要在翻牌圈、河牌圈明确分配给回合的牌——只需使用一张牌列表和一些惯例。例如,前三张牌 = 翻牌……第一轮下注 = 翻牌。使用一些扩展方法,以便于参考翻牌获得德州扑克。当你需要使用它时,通过转换使用 ulong 版本的卡片,而不是弄乱你的域模型。
这就是我如何看待特定个人游戏的模型(即 1 次翻牌、河牌、转牌等)。为所有游戏建模仍有大量工作要做(例如限注游戏使用小注/大注而不是盲注来定义赌注)。
public class Card { public Suit Suit; 公共等级等级;公共 ulong ToCardMask(); }
public enum Suit
{
Clubs,
Diamonds,
Hearts,
Spades
}
public enum Rank
{
Ace,
Deuce,
Trey,
//...
Jack,
Queen,
King
}
public class Game
{
public GameInfo GameInfo;
public TableInfo TableInfo;
public List<BettingRound> BettingRounds;
public List<Card> CommunityCards;
public string Rawtext;
public bool WithHero; //??
}
public static class GameExtensions
{
public static BettingRound Flop(this Game game)
{
return game.BettingRounds[0];
}
public static List<Card> FlopCards(this Game game)
{
return game.CommunityCards.Take(3).ToList();
}
}
public class GameInfo
{
public GameType GameType;
public GameBettingStructure BettingStructure; // Limit, PotLimit, NoLimit
public Stakes Stakes; // e.g. { $1, $2 }
public long Id;
public List<Seat> Seats;
}
enum GameType // prob change to a class for extensibility
{
HoldEm,
Razz,
StudHi,
StudHiLo,
OmahaHi,
OmahaHiLo
}
enum GameBettingStructure
{
Limit,
PotLimit,
NoLimit
}
class Stakes // probably needs some tweeking for stud games (e.g. bring-in ...)
{
public Money Ante;
public List<Money> Blinds;
}
public class Seat
{
public Player Player;
public Money InitialStackAmount;
public Money FinalStackAmount; // convienience field can be calculated
public List<Card> Hand;
}
class Money
{
public decimal Amount;
public Unit Unit;
}
enum Unit
{
USD,
EUR,
AUD,
TournamentDollars
}
public class Player
{
public string Name;
}
public class TableInfo
{
public string Name;
}
public class BettingRound
{
public List<BettingAction> BettingActions;
}
public class BettingAction
{
public abstract Money PotSizeAfter();
public byte SeatNumber;
}
public class Fold : BettingAction { }
public class Call : BettingAction { }
public class BringIn : BettingAction { }
public class Complete : BettingAction { }
public class Bet : BettingAction
{
public Money Amount;
}
public class Raise : Bet { }