1

我在二十一点控制台应用程序上苦苦挣扎,需要帮助设计/关联我的座位类。

对于游戏,有六个座位,一个座位只能有一个玩家,但如果座位空置,一个玩家最多可以占用(或下注)三个座位。此外,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; }

}
4

0 回答 0