Example #1
0
        public GameContext(Player[] players, Guid gameId, Func <ComputerBrain> computerBrain, Func <GameResult> gameResultResolve, IUsersStore usersStore)
        {
            Table              = Enumerable.Range(0, 4).Select(suit => new bool[15]).ToArray();
            Id                 = gameId;
            Players            = players;
            _computerBrain     = computerBrain;
            _gameResultResolve = gameResultResolve;
            _usersStore        = usersStore;
            BankMoney          = 150;

            foreach (var p in Players)
            {
                p.Money -= 50;

                p.Lobby.RefreshMoney(p.Money);
                _usersStore.UpdateMoney(p);
            }

            SetFirstPlayer();
        }
Example #2
0
        public void PutCardOnTheTable(Player player, Card card)
        {
            // Implementation of the state machine
            // In this case it is much clearly for understanding
            // https://raw.githubusercontent.com/denisnikolayev/9game/master/Docs/StateMachine.png


            if (!player.IsHuman)
            {
                goto ComputerChoosingCard;
            }
            else
            {
                goto PuttingCard;
            }

PuttingCard:
            PutCard(card, player);

            if (player.Cards.Any())
            {
                goto MovingToNextPlayer;
            }
            else
            {
                goto Finish;
            }

MovingToNextPlayer:
            player = MoveTurnToNextPlayer();
            player.AvailableCards = player.Cards.Where(CanPutCard).ToArray();

            if (player.AvailableCards.Any())
            {
                if (player.IsHuman)
                {
                    goto WaitHumanChoose;
                }
                else
                {
                    goto ComputerChoosingCard;
                }
            }
            else
            {
                goto SkippingTurn;
            }


SkippingTurn:
            player.Money -= 50;
            BankMoney    += 50;

            foreach (var p in Players)
            {
                p.Game.SkipTurn(player.Id, 50);
            }
            _usersStore.UpdateMoney(player);

            goto MovingToNextPlayer;


ComputerChoosingCard:
            card = _computerBrain().ChooseCard(Table, player);
            goto PuttingCard;


WaitHumanChoose:
            player.Game.YourTurn(player.AvailableCards);
            return;

Finish:
            player.Money += BankMoney;

            var gameResult = _gameResultResolve();

            gameResult.BankMoney  = BankMoney;
            gameResult.Winner     = player;
            gameResult.OtherUsers = Players.Except(new[] { player }).Select(p => p.User).ToArray();

            foreach (var p in Players)
            {
                p.Game.Finish(gameResult);
                p.Lobby.RefreshMoney(p.Money);
                _usersStore.UpdateMoney(p);
            }

            //TODO: Kill game

            return;
        }