我在二十一点控制台应用程序上苦苦挣扎,需要帮助设计/关联我的座位类。
对于游戏,有六个座位,一个座位只能有一个玩家,但如果座位空置,一个玩家最多可以占用(或下注)三个座位。此外,TableGame 有六个座位可供使用。
关于 TableGame 类,它应该有六个座位。那么我应该在 TableGame 构造函数中构造六个座位吗?那么如何创建一个公共属性,即 SeatsAvailable,它使用一个数组来捕获哪些座位可用?
此外,玩家占据一个座位,并在其上下注。我应该如何将这些人结合在一起,以便与下注的玩家联系起来?
关于如何将 Seat 类与 TableGame、Player 类结合的建议以及我应该注意的任何批评和方向将不胜感激。预先感谢您帮助初学者学习 OO 设计的技巧。
public class TableGame
{
public TableGame(IEnumerable<string> playerNames)
{
List<Player> players = new List<Player>();
foreach (string name in playerNames)
{
players.Add(new Player(name));
// add the player to a new instance of a seat or to an array of already created seats(6)???
}
Dealer dealer = new Dealer();
players.Add(dealer);
PlayGame(players, dealer);
}
private void PlayGame(List<Player> players, Dealer dealer)
{
try
{
Deck playingDeck = new Deck();
Deal(playingDeck, players);
Play(playingDeck, players);
DetermineHandResults(players, dealer);
TransferBets(players, dealer);
}
catch (InvalidTransferAmountException ex)
{
players.Remove(ex.OffendingPlayer);
}
DisplayResults(players); // I want this here so that DispayResults() is still called even if an InvalidTransferAmount exception is caught.
} // However other types of exceptions (unhandled) will kick me out of PlayGame() and DisplayResults() will not be
// called. Use a finally block to execute something no matter what exception is thrown- handled or unhandled.
public void Deal(Deck deck, List<Player> players)
{
deck.Shuffle();
for (int i = 1; i < 3; i++)
foreach (Player player in players)
player.ReceiveCard(deck.Deal());
}
public void Play(Deck playingDeck, List<Player> players)
{
foreach (Player player in players)
player.Strategy(playingDeck);
}
public void DetermineHandResults(List<Player> players, Dealer dealer)
{
foreach (Player player in players)
{
if (player.playerHand.HandValue() > 21)
player.result = Result.Lose;
else if (player.playerHand.HandValue() <= 21 && dealer.playerHand.HandValue() > 21)
player.result = Result.Win;
else if (player.playerHand.HandValue() <= 21 && player.playerHand.HandValue() > dealer.playerHand.HandValue())
player.result = Result.Win;
else if (player.playerHand.HandValue() == dealer.playerHand.HandValue())
player.result = Result.Draw;
else
player.result = Result.Lose;
}
}
public void TransferChips(Player playerTo, Player playerFrom, decimal value)
{
if (playerFrom.TotalChips < value)
throw new InvalidTransferAmountException(string.Format("Can not transfer {0} from {1}'s bank roll, only {2:2d} available!",
value, playerFrom.Name, playerFrom.TotalChips), playerFrom);
playerTo.TotalChips += value;
playerFrom.TotalChips -= value;
}
public void TransferBets(List<Player> players, Dealer dealer)
{
foreach (Player player in players)
{
if (player.result == Result.Win)
{
TransferChips(player, dealer, player.Bet);
Console.WriteLine("{0} wins {1} dollars.", player.Name, player.Bet);
}
else if (player.result == Result.Lose)
{
//if (player.TotalChips < player.Bet)
TransferChips(dealer, player, player.Bet);
Console.WriteLine("{0} loses {1} dollars.", player.Name, player.Bet);
}
else
Console.WriteLine("{0} pushes.", player.Name);
}
}
public void DisplayResults(List<Player> players)
{
foreach (Player player in players)
{
Console.WriteLine("{0} has {1} and {2}s. Total chips: {3}", player.Name, player.playerHand.HandValue(), player.result, player.TotalChips);
player.ShowHandValues();
Console.WriteLine();
}
}
}
public class Seat
{
public Seat()
{ }
public bool Occupied;
}
public class Player
{
private string name;
private decimal bet =10, totalChips = 100;
public Hand playerHand = new Hand();
public Player()
{ }
public Player(string name)
{
this.Name = name;
}
public string Name
{
get { return name; }
set { name = value; }
}
public Result result { get; set; }
public decimal TotalChips
{
get
{
return totalChips;
}
set
{
totalChips = value;
}
}
public decimal Bet
{
get
{
return bet;
}
}
public void ReceiveCard(Card card)
{ playerHand.Hit(card); }
public void AskForCard(Deck deck)
{
playerHand.Hit(deck.Deal());
}
public virtual void Strategy(Deck deck)
{
while (playerHand.HandValue() < 17)
{
AskForCard(deck);
if (playerHand.HandValue() == 21)
Console.WriteLine("Congratulations {0} you got 21!", Name);
if (playerHand.HandValue() > 21)
Console.WriteLine("Sorry {0} you busted.", Name);
}
}
public void ShowHandValues()
{
foreach (Card card in playerHand.GetCards())
{
Console.Write(card.ToString() + " ");
}
}
}
public class InvalidTransferAmountException : ApplicationException
{
public InvalidTransferAmountException(string msg, Player offendingPlayer) : base(msg)
{
OffendingPlayer = offendingPlayer;
}
public Player OffendingPlayer { get; private set; }
}