Exemplo n.º 1
0
        public override void SetupPhases()
        {
            PhaseActions = new List <Func <TableDealer, DisplayStage[]> >();

            var chipMovingPhases = new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.BetsOut, DisplayStage.Scooping, DisplayStage.PotScooped, DisplayStage.Delivering, DisplayStage.DeliverPot, DisplayStage.PotDelivered };

            //Reset table for new hand
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.CleanTableForNewHand();
                // See if there are enough players to start a hand
                // more than one player and at least one non-computer
                if (tableDealer.Table.OccupiedSeats().Count() > 1 && tableDealer.Table.OccupiedSeats().Any(s => !s.Player.Computer))
                {
                    // Reset Pause request for all seats.
                    foreach (var s in tableDealer.Table.AllSeats())
                    {
                        if (s.Status == SeatStatus.PlayOne)
                        {
                            s.Status = SeatStatus.PleasePause;
                        }
                    }
                    return(new DisplayStage[] { });
                }
                else
                {
                    tableDealer.Table.PhaseTitle   = "Waiting for Player(s)";
                    tableDealer.Table.PhaseMessage = "";
                    return(null);
                }
            });

            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Hands Dealt";
                tableDealer.Table.PhaseMessage = "";
                tableDealer.DealHands();
                return(new DisplayStage[] { DisplayStage.DealtCards });
            });

            //Layout Computer Hands
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Layout Hands";
                tableDealer.Table.PhaseMessage = "";
                tableDealer.LayoutHands();
                return(new DisplayStage[] { DisplayStage.DealtCards });
            });

            //Hands Laid Out
            PhaseActions.Add((tableDealer) =>
            {
                // Need to wait until all hands are laid out before continuing.
                if (tableDealer.Table.SeatsWithHands().Any(s => !s.Hand.HandsLaidOut))
                {
                    return(null);
                }
                // Reveal all hands when everyone has finished the Layout.
                foreach (var s in tableDealer.Table.SeatsWithHands())
                {
                    s.Hand.Revealed = true;
                    var tHand       = s.Hand as TaiwaneseHand;
                }

                tableDealer.Table.PhaseTitle   = "Hands Revealed";
                tableDealer.Table.PhaseMessage = "";
                return(new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.DealtCards });
            });

            //Deal 1st Board
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Board One";
                tableDealer.Table.PhaseMessage = "";
                var board = GetBoard();
                tableDealer.Deck.CompleteCards(board);
                tableDealer.Table.SetBoard(board);
                return(new DisplayStage[] { DisplayStage.DealtCards });
            });

            //Play Top Hand
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Top Hand";
                tableDealer.Table.PhaseMessage = "";
                PlayTopHand(tableDealer.Table);
                LogTable(tableDealer.Table, "Top Hand 1");
                return(chipMovingPhases);
            });

            //Play Middle Hand
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Middle Hand";
                tableDealer.Table.PhaseMessage = "";
                PlayMiddleHand(tableDealer.Table);
                LogTable(tableDealer.Table, "Middle Hand 1");
                return(chipMovingPhases);
            });

            //Play Bottom Hand
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Bottom Hand";
                tableDealer.Table.PhaseMessage = "";
                PlayBottomHand(tableDealer.Table);
                LogTable(tableDealer.Table, "Bottom Hand 1");
                return(chipMovingPhases);
            });

            //Play Scoop Bonus
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Scoop Bonus";
                tableDealer.Table.PhaseMessage = "";
                if (PlayScoopBonus(tableDealer.Table))
                {
                    LogTable(tableDealer.Table, "Scoop Bonus 1");
                    return(chipMovingPhases);
                }
                else
                {
                    return(new DisplayStage[] { });
                }
            });

            //Deal 2nd Board
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Board Two";
                tableDealer.Table.PhaseMessage = "";

                tableDealer.CleanChips();

                var board = GetBoard();
                tableDealer.Deck.CompleteCards(board);
                tableDealer.Table.SetBoard(board);
                return(new DisplayStage[] { DisplayStage.DealtCards });
            });

            //Play Top Hand
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Top Hand";
                tableDealer.Table.PhaseMessage = "";
                PlayTopHand(tableDealer.Table);
                LogTable(tableDealer.Table, "Top Hand 2");
                return(chipMovingPhases);
            });

            //Play Middle Hand
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Middle Hand";
                tableDealer.Table.PhaseMessage = "";
                PlayMiddleHand(tableDealer.Table);
                LogTable(tableDealer.Table, "Middle Hand 2");
                return(chipMovingPhases);
            });

            //Play Bottom Hand
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Bottom Hand";
                tableDealer.Table.PhaseMessage = "";
                PlayBottomHand(tableDealer.Table);
                LogTable(tableDealer.Table, "Bottom Hand 2");
                return(chipMovingPhases);
            });

            //Play Scoop Bonus
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Scoop Bonus";
                tableDealer.Table.PhaseMessage = "";
                if (PlayScoopBonus(tableDealer.Table))
                {
                    LogTable(tableDealer.Table, "Scoop Bonus 2");
                    return(chipMovingPhases);
                }
                else
                {
                    return(new DisplayStage[] {});
                }
            });
        }
Exemplo n.º 2
0
        public override void SetupPhases()
        {
            PhaseActions = new List <Func <TableDealer, DisplayStage[]> >();

            var chipMovingPhases = new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.BetsOut, DisplayStage.Scooping, DisplayStage.PotScooped, DisplayStage.Delivering, DisplayStage.DeliverPot, DisplayStage.PotDelivered };

            //Reset table for new hand
            PhaseActions.Add((tableDealer) =>
            {
                var displayStages = StartNewHand(tableDealer);
                if (displayStages != null)
                {
                    tableDealer.SetButton();
                }
                return(displayStages);
            });

            PhaseActions.Add(HandsDealt);

            //Blinds and set first bet action
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Preflop";
                tableDealer.Table.PhaseMessage = "";

                var seatsAroundTheTable = tableDealer.Table.SeatsWithHands().OrderBy(s => s.Position).ToArray();
                var players             = seatsAroundTheTable.Count();
                var buttonSeat          = Array.FindIndex <Seat>(seatsAroundTheTable, 0, seatsAroundTheTable.Count(), s => s.Button);

                var smallBlind = buttonSeat + 1;
                if (smallBlind == players)
                {
                    smallBlind = 0;
                }
                seatsAroundTheTable[smallBlind].ChipsOut = 1;

                var bigBlind = smallBlind + 1;
                if (bigBlind == players)
                {
                    bigBlind = 0;
                }
                seatsAroundTheTable[bigBlind].ChipsOut = 2;

                var betAction = bigBlind + 1;
                if (betAction == players)
                {
                    betAction = 0;
                }
                seatsAroundTheTable[betAction].ActionOn = true;

                return(new DisplayStage[] { DisplayStage.BetsOut, DisplayStage.SeatAction });
            });

            //Scoop Pot
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Preflop";
                tableDealer.Table.PhaseMessage = "";
                return(new DisplayStage[] { DisplayStage.Scooping, DisplayStage.PotScooped });
            });

            //Flop
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Flop";
                tableDealer.Table.PhaseMessage = "";
                var board       = GetBoard();
                board.CardsMask = tableDealer.Deck.DealCards(3);
                tableDealer.Table.SetBoard(board);

                var seatsAroundTheTable = tableDealer.Table.SeatsWithHands().OrderBy(s => s.Position).ToArray();
                var players             = seatsAroundTheTable.Count();
                var buttonSeat          = Array.FindIndex <Seat>(seatsAroundTheTable, 0, seatsAroundTheTable.Count(), s => s.Button);

                var smallBlind = buttonSeat + 1;
                if (smallBlind == players)
                {
                    smallBlind = 0;
                }
                seatsAroundTheTable[smallBlind].ActionOn = true;

                return(new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.SeatAction });
            });

            //Scoop Pot
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Flop";
                tableDealer.Table.PhaseMessage = "";
                return(new DisplayStage[] { DisplayStage.Scooping, DisplayStage.PotScooped });
            });

            //Turn
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle       = "Turn";
                tableDealer.Table.PhaseMessage     = "";
                tableDealer.Table.Board.CardsMask |= tableDealer.Deck.DealCards(1);

                var seatsAroundTheTable = tableDealer.Table.SeatsWithHands().OrderBy(s => s.Position).ToArray();
                var players             = seatsAroundTheTable.Count();
                var buttonSeat          = Array.FindIndex <Seat>(seatsAroundTheTable, 0, seatsAroundTheTable.Count(), s => s.Button);

                var smallBlind = buttonSeat + 1;
                if (smallBlind == players)
                {
                    smallBlind = 0;
                }
                seatsAroundTheTable[smallBlind].ActionOn = true;

                return(new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.SeatAction });
            });

            //Scoop Pot
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Turn";
                tableDealer.Table.PhaseMessage = "";
                return(new DisplayStage[] { DisplayStage.Scooping, DisplayStage.PotScooped });
            });

            //River
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle       = "River";
                tableDealer.Table.PhaseMessage     = "";
                tableDealer.Table.Board.CardsMask |= tableDealer.Deck.DealCards(1);

                var seatsAroundTheTable = tableDealer.Table.SeatsWithHands().OrderBy(s => s.Position).ToArray();
                var players             = seatsAroundTheTable.Count();
                var buttonSeat          = Array.FindIndex <Seat>(seatsAroundTheTable, 0, seatsAroundTheTable.Count(), s => s.Button);

                var smallBlind = buttonSeat + 1;
                if (smallBlind == players)
                {
                    smallBlind = 0;
                }
                seatsAroundTheTable[smallBlind].ActionOn = true;

                return(new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.SeatAction });
            });

            //Scoop Pot
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Showdown";
                tableDealer.Table.PhaseMessage = "";
                return(new DisplayStage[] { DisplayStage.Scooping, DisplayStage.PotScooped });
            });

            // Award Pot
            PhaseActions.Add((tableDealer) =>
            {
                tableDealer.Table.PhaseTitle   = "Showdown";
                tableDealer.Table.PhaseMessage = "";

                var table = tableDealer.Table;

                HandEvaluation best = new HandEvaluation();

                // Find best hand
                foreach (var seat in table.SeatsWithHands())
                {
                    seat.Hand.LastEvaluation = TexasHoldem.EvaluateHand(seat.Hand.CardsMask | table.Board.CardsMask);
                    if (seat.Hand.LastEvaluation.Value > best.Value)
                    {
                        best = seat.Hand.LastEvaluation;
                    }
                }

                int pot      = table.Pot;
                int winners  = 0;
                int bestCard = 0;

                table.PhaseMessage = $"{TexasHoldem.HandTypeDescriptions[(int)best.Type]}";

                // Determine winners and the best card from the winners
                foreach (var seat in table.SeatsWithHands())
                {
                    if (seat.Hand.LastEvaluation.Value == best.Value)
                    {
                        winners++;
                        bestCard              = Math.Max(bestCard, seat.Hand.BestCard());
                        table.HighlightCards |= TexasHoldem.FindCards(best);
                    }
                }

                int cut       = pot / winners;
                int remainder = pot % winners;

                // Determine chips in
                foreach (var seat in table.SeatsWithHands())
                {
                    if (seat.Hand.LastEvaluation.Value == best.Value)
                    {
                        seat.ChipsIn = cut + (seat.Hand.BestCard() == bestCard ? remainder : 0);
                    }
                }

                return(new DisplayStage[] { DisplayStage.Delivering, DisplayStage.DeliverPot, DisplayStage.PotDelivered });
            });
        }