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(); }
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; }