예제 #1
0
파일: Game.cs 프로젝트: benp44/ga-monopoly
        private void ProcessCard(Player player, Card card)
        {
            player.LogEvent("Card:", card.GetType().Name);
            if (card is MoveCard)
            {
                var moveCard = (MoveCard)card;

                player.Location = moveCard.MoveToSquare;
            }
            else if (card is MoneyCard)
            {
                var moneyCard = (MoneyCard)card;
                if (moneyCard.Sum > 0)
                {
                    Bank.Pay(moneyCard.Sum, player, Bank);
                }
                else
                {
                    player.Pay(-moneyCard.Sum, Bank, Bank);
                }
            }
            else if (card is SpecialCard)
            {
                bool bPassedGo   = false;
                var  specialCard = (SpecialCard)card;

                switch (specialCard.CardType)
                {
                case SpecialCardType.NextUtility:
                    player.Location = FindNextSquareByType(player, typeof(Utility), ref bPassedGo);
                    break;

                case SpecialCardType.NextStation:
                    player.Location = FindNextSquareByType(player, typeof(Station), ref bPassedGo);
                    break;

                case SpecialCardType.BackThree:
                    player.Location = Board.AllSquares[player.Location.Order - 3];
                    break;

                case SpecialCardType.GoToJail:
                    player.Location = Board.Jail;
                    player.SetInJail();
                    break;

                case SpecialCardType.GetOutOfJailFreeChance:
                case SpecialCardType.GetOutOfJailFreeCommunityChest:
                    player.GetOutOfJailFreeCards.Enqueue(card);
                    break;

                case SpecialCardType.RepairsChance:
                {
                    var totalToPay = 0;
                    foreach (var asset in player.Assets)
                    {
                        if (asset is Property)
                        {
                            var property = (Property)asset;

                            var cost = 0;
                            if (property.BuildingCount < 5)
                            {
                                cost = property.BuildingCount * 25;
                            }
                            else
                            {
                                cost = 100;
                            }

                            totalToPay += cost;
                        }
                    }

                    player.Pay(totalToPay, FreeParking, Bank);
                }
                break;

                case SpecialCardType.GiveEachPlayerFifty:
                    foreach (var otherPlayer in ActivePlayers.Excluding(player))
                    {
                        player.Pay(50, otherPlayer, Bank);
                    }
                    break;

                case SpecialCardType.ReceiveFiftyFromEachPlayer:
                    foreach (var otherPlayer in ActivePlayers.Excluding(player))
                    {
                        otherPlayer.Pay(50, player, Bank);
                    }
                    break;

                case SpecialCardType.RepairsCommunityChest:
                {
                    var totalToPay = 0;
                    foreach (var asset in player.Assets)
                    {
                        if (asset is Property)
                        {
                            var property = (Property)asset;

                            var cost = 0;
                            if (property.BuildingCount < 5)
                            {
                                cost = property.BuildingCount * 40;
                            }
                            else
                            {
                                cost = 115;
                            }

                            totalToPay += cost;
                        }
                    }

                    player.Pay(totalToPay, FreeParking, Bank);
                }
                break;

                default:
                    break;
                }

                if (bPassedGo)
                {
                    Bank.Pay(200, player, Bank);
                }
            }
            else
            {
                throw new ApplicationException("Unknown card type");
            }
        }
예제 #2
0
파일: Game.cs 프로젝트: benp44/ga-monopoly
 public Game(Board board, Bank bank, IDice dice, ICardManager cardManager, List <Player> players)
 {
     Initialise(board, bank, dice, cardManager, players);
 }
예제 #3
0
파일: Game.cs 프로젝트: benp44/ga-monopoly
        public bool PlayPlayerTurn(Player player)
        {
            if (Winner != null)
            {
                return(true);
            }

            PlayerTurnsPlayed++;

            var bContinueMoving = true;
            var doubleCount     = 0;

            while (bContinueMoving == true && player.Status != PlayerStatus.Bankrupt)
            {
                var diceResult = Dice.RollDice();

                player.LogEvent("Rolled " + diceResult.ToString());

                if (player.Status == PlayerStatus.InJail)
                {
                    // Players in jail don't get to move this turn,
                    // but there a several ways to get out

                    bContinueMoving = false;

                    if (diceResult.DoubleRolled)
                    {
                        // A double - free but no second roll this time.

                        player.FreeFromJail();
                    }
                    else if (player.GetOutOfJailFreeCards.Count > 0)
                    {
                        // GOOJF
                        player.FreeFromJail();

                        CardManager.ReturnGetOutOfJailFreeCard(player.GetOutOfJailFreeCards.Dequeue());
                    }
                    else if (player.Money > 50)
                    {
                        // Pay the bail

                        player.Pay(50, Bank, Bank);
                        player.FreeFromJail();
                    }
                    else
                    {
                        // No luck,  but only in jail for three turns,
                        // and will move on the next

                        player.TurnsInJail++;

                        if (player.TurnsInJail > 2)
                        {
                            player.FreeFromJail();
                        }
                    }
                }
                else // Not in jail
                {
                    // Handle three doubles

                    if (diceResult.DoubleRolled && (++doubleCount == 3))
                    {
                        SendToJail(player);
                        bContinueMoving = false;
                    }
                    else
                    {
                        bContinueMoving = diceResult.DoubleRolled;

                        // Move the player

                        player.Location = Board.AllSquares[(player.Location.Order + diceResult.Total) % Board.AllSquares.Count];

                        // If gone past go, collect 200

                        if (player.Location.Order - diceResult.Total < 0)
                        {
                            Bank.Pay(200, player, Bank);
                        }

                        if (player.Location is AssetSquare)
                        {
                            var assetSquare = (AssetSquare)player.Location;

                            if (assetSquare.Asset.Owner is Bank)
                            {
                                player.ConsiderPurchase(assetSquare.Asset);
                            }
                            else if (player.Assets.Contains(assetSquare.Asset) == false)
                            {
                                foreach (var otherPlayer in Players.Excluding(player))
                                {
                                    if (otherPlayer.Assets.Contains(assetSquare.Asset))
                                    {
                                        if (otherPlayer.Status != PlayerStatus.InJail)
                                        {
                                            var rent = assetSquare.Asset.CalculateRent(diceResult.Total);
                                            player.Pay(rent, otherPlayer, Bank);
                                        }

                                        break;
                                    }
                                }
                            }
                        }
                        else if (player.Location is SpecialSquare)
                        {
                            LandedOnSpecialSquare(player);
                        }
                        else
                        {
                            throw new ApplicationException("Unknown square type");
                        }
                    }
                }
            }

            if (player.Status == PlayerStatus.Normal)
            {
                player.ConsiderUnmortgaging();
                player.Trade(Players);
                player.ConsiderBuilding();
            }

            NextPlayer = Players[(Players.FindIndex(x => x == player) + 1) % Players.Count];

            // Win conditions

            if (Players.Where(x => x.Status != PlayerStatus.Bankrupt).Count() == 1)
            {
                Winner = Players.Where(x => x.Status != PlayerStatus.Bankrupt).First();
                return(true);
            }

            foreach (var activePlayer in ActivePlayers)
            {
                if (activePlayer.Money >= 20000)
                {
                    Winner = activePlayer;
                    return(true);
                }
            }

            return(false);
        }