C# 如何将与其他对象相关的对象绑定在一起-C、OOD

C# 如何将与其他对象相关的对象绑定在一起-C、OOD,c#,aggregation,coupling,C#,Aggregation,Coupling,我正在努力开发21点游戏机应用程序,需要帮助设计/关联我的座椅类别 游戏共有六个座位,一个座位只能有一名玩家,但如果座位无人,玩家最多可以占据或下注三个座位。此外,桌面游戏还有六个座位 关于桌面游戏类,它应该有六个座位。那么我应该在TableGame构造器中构造六个席位吗?如何创建一个公共属性,即SeatSavable,它使用一个数组来捕获可用的座位 此外,玩家占据一个座位,并在其上下注。我应该如何将这些人结合在一起,以便与下注的玩家绑定 关于如何将座位类与桌面游戏、玩家类结合起来的建议,以及我

我正在努力开发21点游戏机应用程序,需要帮助设计/关联我的座椅类别

游戏共有六个座位,一个座位只能有一名玩家,但如果座位无人,玩家最多可以占据或下注三个座位。此外,桌面游戏还有六个座位

关于桌面游戏类,它应该有六个座位。那么我应该在TableGame构造器中构造六个席位吗?如何创建一个公共属性,即SeatSavable,它使用一个数组来捕获可用的座位

此外,玩家占据一个座位,并在其上下注。我应该如何将这些人结合在一起,以便与下注的玩家绑定

关于如何将座位类与桌面游戏、玩家类结合起来的建议,以及我应该注意的任何评论和方向,将不胜感激。提前感谢您帮助初学者学习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; }

}

简单提示一下,您可以在类属性上说{get;set;}