Exemplo n.º 1
0
        public PokerGame(IEventBroker domainEvents, int minPlayers = 3)
        {
            reservedSeats = new ObservableCollection <Guid>();

            var seatButler = domainEvents.Subscribe <SeatRequested>(p =>
            {
                if (p.SeatPosition.HasValue)
                {
                    reservedSeats.Insert(p.SeatPosition.Value, p.ClientId);
                }
                else
                {
                    reservedSeats.Add(p.ClientId);
                }

                domainEvents.Publish(new SeatReserved(p.ClientId, reservedSeats.IndexOf(p.ClientId)));
            });

            var addPlayerName = domainEvents.Subscribe <AddPlayer>(e =>
            {
                if (!reservedSeats.Contains(e.ClientId))
                {
                    domainEvents.Publish(new ReservationNotFound(e.ClientId));
                }
                else if (Players.Any(x => x.Name == e.PlayerName))
                {
                    domainEvents.Publish(new PlayerNameRefused(e.ClientId));
                }
                else
                {
                    var player = playerSeatingPositions[reservedSeats.IndexOf(e.ClientId)] = new Player(e.PlayerName);

                    domainEvents.Publish(new PlayerAdded(e.ClientId, player));
                }
            });

            var waitForPlayersToBeReady = domainEvents.Subscribe <PlayerReady>(p =>
            {
                if (Players.Contains(p.player) && !readyPlayers.Contains(p.player))
                {
                    readyPlayers.Add(p.player);
                }

                if (readyPlayers.Count >= minPlayers && readyPlayers.Count == Players.Count())
                {
                    domainEvents.Publish(new AllPlayersReady());
                }
            });

            var cutForDealerWhenAllPlayersReady = domainEvents.Subscribe <AllPlayersReady>(p =>
            {
                var dealerCutRound = new DealerCutRound(Players.ToList(), domainEvents);
            });

            var startRoundOnceDealerChosen = domainEvents.Subscribe <DealerChosen>(c =>
            {
                var blindsRound = new RoundWithBlinds(c.dealer, Players.ToList(), domainEvents);
            });
        }
Exemplo n.º 2
0
        public DealerCutRound(IList <Player> players, IEventBroker domainEvents)
        {
            this.players      = players;
            this.domainEvents = domainEvents;

            checkCutsComplete = domainEvents.Subscribe <DealerCardCut>(c =>
            {
                dealerCuts[c.player] = c.card;
                // check if we've all cut
                if ((players.Count - dealerCuts.Count) == 0)
                {
                    // find the winner so we can make them dealer, deal with DRAW!!
                    var cutsGroupedByCardAndOrderedHighestFirst = dealerCuts.GroupBy(x => x.Value).OrderByDescending(x => x.Key);
                    var CutsWithHighCard = cutsGroupedByCardAndOrderedHighestFirst.First();
                    if (CutsWithHighCard.Count() > 1)
                    {
                        domainEvents.Publish(new DealerCutDrawn(CutsWithHighCard.ToList()));
                    }
                    else
                    {
                        var dealer = cutsGroupedByCardAndOrderedHighestFirst.First().Single().Key;
                        domainEvents.Publish(new DealerChosen(dealer));
                    }
                }
            });

            onDraw = domainEvents.Subscribe <DealerCutDrawn>(e =>
            {
                onDraw.Dispose();
                onFinish.Dispose();
                checkCutsComplete.Dispose();
                var dealerCutRound = new DealerCutRound(e.players, domainEvents);
            });

            onFinish = domainEvents.Subscribe <DealerChosen>(e =>
            {
                onDraw.Dispose();
                onFinish.Dispose();
                checkCutsComplete.Dispose();
            });
        }