コード例 #1
0
        public static Player FindWinner(Dealer dealer, Board board, List <Player> playerList)
        {
            Player handWinner = new Player();


            foreach (Player player in playerList)
            {
                if (dealer.StraightFlush(board, player))
                {
                    player.BestHand = Hands.STRAIGHT_FLUSH;
                }
                else if (dealer.findHand(board, player).Equals(Hands.FOUR_OF_A_KIND))
                {
                    player.BestHand = Hands.FOUR_OF_A_KIND;
                }
                else if (dealer.findHand(board, player).Equals(Hands.FULL_HOUSE))
                {
                    player.BestHand = Hands.FULL_HOUSE;
                }
                else if (dealer.Flush(board, player))
                {
                    player.BestHand = Hands.FLUSH;
                }
                else if (dealer.Straight(board, player))
                {
                    player.BestHand = Hands.STRAIGHT;
                }
                else
                {
                    player.BestHand = dealer.findHand(board, player);
                }
            }

            int           lowest = (int)playerList[0].BestHand;
            List <Player> winner = playerList;
            //List<Player> test = new List<Player>();

            List <Player> multiWin = new List <Player>();

            foreach (Player player in playerList)
            {
                if ((int)player.BestHand < lowest)
                {
                    winner = playerList;
                    lowest = (int)player.BestHand;
                }
            }
            foreach (Player player in playerList)
            {
                if ((int)player.BestHand == lowest)
                {
                    multiWin.Add(player);
                }
            }
            if (multiWin.Count == 0)
            {
                string winnertext = winner[0].Name + " wins with " + winner[0].BestHand.ToString();
                handWinner.Name = winnertext;
            }
            else
            {
                List <Player> players = multiWin;

                Hands winhand = players[0].BestHand;

                if (winhand.Equals(Hands.PAIR))
                {
                    int highest = 0;
                    int kicker  = 0;
                    foreach (Player player in multiWin)
                    {
                        List <int> values      = new List <int>();
                        List <int> boardvalues = new List <int>();
                        values.Add((int)player.InHand1.Face);
                        values.Add((int)player.InHand2.Face);

                        foreach (Card card in board.currBoard)
                        {
                            values.Add((int)card.Face);
                            boardvalues.Add((int)card.Face);
                        }
                        kicker = boardvalues.Max();
                        IEnumerable <int> duplicates = values.GroupBy(x => x).Where(g => g.Count() > 1).Select(x => x.Key);
                        int found = duplicates.First();
                        for (int x = 0; x < values.Count(); x++)
                        {
                            if (values[x] == found)
                            {
                                values.Remove(values[x]);
                            }

                            if (found > highest)
                            {
                                handWinner = player;
                                highest    = found;
                            }
                            else if (found == highest)
                            {
                                if (values.Max() > kicker)
                                {
                                    handWinner = player;
                                    kicker     = values.Max();
                                }
                            }
                        }
                        kicker = values.Max();
                    }
                }
                if (winhand.Equals(Hands.TWO_PAIR))
                {
                    int highest       = 0;
                    int secondhighest = 0;
                    int kicker        = 0;
                    foreach (Player player in multiWin)
                    {
                        List <int> values      = new List <int>();
                        List <int> boardvalues = new List <int>();
                        values.Add((int)player.InHand1.Face);
                        values.Add((int)player.InHand2.Face);


                        foreach (Card card in board.currBoard)
                        {
                            values.Add((int)card.Face);
                            boardvalues.Add((int)card.Face);
                        }

                        IEnumerable <int> duplicates = values.GroupBy(x => x).Where(g => g.Count() > 1).Select(x => x.Key);
                        int[]             foundarray = duplicates.ToArray();
                        List <int>        found      = new List <int>();

                        foreach (int num in foundarray)
                        {
                            found.Add(num);
                        }

                        for (int x = 0; x < values.Count; x++)
                        {
                            if (found.Contains(values[x]))
                            {
                                values.Remove(values[x]);
                            }
                        }
                        if (found.Max() > highest)
                        {
                            handWinner    = player;
                            highest       = found.Max();
                            secondhighest = found.Min();
                        }
                        else if (found.Max() == highest && found.Min() > secondhighest)
                        {
                            handWinner    = player;
                            secondhighest = found.Min();
                        }
                        else if (found.Max() == highest && found.Min() == secondhighest)
                        {
                            if (values.Max() > kicker)
                            {
                                handWinner = player;
                                kicker     = values.Max();
                            }
                        }
                        kicker = values.Max();
                    }
                }
                if (winhand.Equals(Hands.THREE_OF_A_KIND))
                {
                    int highest = 0;
                    foreach (Player player in multiWin)
                    {
                        List <int> values = new List <int>();

                        values.Add((int)player.InHand1.Face);
                        values.Add((int)player.InHand2.Face);

                        foreach (Card card in board.currBoard)
                        {
                            values.Add((int)card.Face);
                        }
                        IEnumerable <int> duplicates = values.GroupBy(x => x).Where(g => g.Count() > 1).Select(x => x.Key);

                        if (duplicates.First() > highest)
                        {
                            handWinner = player;
                            highest    = duplicates.First();
                        }
                    }
                }
                if (winhand.Equals(Hands.HIGH_CARD))
                {
                    int boardsum = 0;
                    int highest  = (int)multiWin[0].InHand1.Face + (int)multiWin[0].InHand2.Face + boardsum;
                    foreach (Card card in board.currBoard)
                    {
                        boardsum += (int)card.Face;
                    }
                    foreach (Player player in multiWin)
                    {
                        if ((int)player.InHand1.Face + (int)player.InHand2.Face + boardsum > highest)
                        {
                            handWinner = player;
                            highest    = (int)player.InHand1.Face + (int)player.InHand2.Face + boardsum;
                        }
                    }
                }
                if (winhand.Equals(Hands.STRAIGHT))
                {
                    int boardsum = 0;
                    int highest  = (int)multiWin[0].InHand1.Face + (int)multiWin[0].InHand2.Face + boardsum;
                    foreach (Card card in board.currBoard)
                    {
                        boardsum += (int)card.Face;
                    }
                    foreach (Player player in multiWin)
                    {
                        if ((int)player.InHand1.Face + (int)player.InHand2.Face + boardsum > highest)
                        {
                            handWinner = player;
                            highest    = (int)player.InHand1.Face + (int)player.InHand2.Face + boardsum;
                        }
                    }
                }
                if (winhand.Equals(Hands.FULL_HOUSE))
                {
                    int boardsum = 0;
                    int highest  = (int)multiWin[0].InHand1.Face + (int)multiWin[0].InHand2.Face + boardsum;
                    foreach (Card card in board.currBoard)
                    {
                        boardsum += (int)card.Face;
                    }
                    foreach (Player player in multiWin)
                    {
                        if ((int)player.InHand1.Face + (int)player.InHand2.Face + boardsum > highest)
                        {
                            handWinner = player;
                            highest    = (int)player.InHand1.Face + (int)player.InHand2.Face + boardsum;
                        }
                    }
                }
                if (winhand.Equals(Hands.FOUR_OF_A_KIND))
                {
                    int highest = 0;
                    foreach (Player player in multiWin)
                    {
                        List <int> values = new List <int>();

                        values.Add((int)player.InHand1.Face);
                        values.Add((int)player.InHand2.Face);

                        foreach (Card card in board.currBoard)
                        {
                            values.Add((int)card.Face);
                        }
                        IEnumerable <int> duplicates = values.GroupBy(x => x).Where(g => g.Count() > 1).Select(x => x.Key);

                        if (duplicates.First() > highest)
                        {
                            handWinner = player;
                            highest    = duplicates.First();
                        }
                    }
                }
                if (winhand.Equals(Hands.STRAIGHT_FLUSH))
                {
                    int boardsum = 0;
                    int highest  = (int)multiWin[0].InHand1.Face + (int)multiWin[0].InHand2.Face + boardsum;
                    foreach (Card card in board.currBoard)
                    {
                        boardsum += (int)card.Face;
                    }
                    foreach (Player player in multiWin)
                    {
                        if ((int)player.InHand1.Face + (int)player.InHand2.Face + boardsum > highest)
                        {
                            handWinner = player;
                            highest    = (int)player.InHand1.Face + (int)player.InHand2.Face + boardsum;
                        }
                    }
                }
                if (winhand.Equals(Hands.FLUSH))
                {
                    int boardsum = 0;
                    int highest  = (int)multiWin[0].InHand1.Face + (int)multiWin[0].InHand2.Face + boardsum;
                    foreach (Card card in board.currBoard)
                    {
                        boardsum += (int)card.Face;
                    }
                    foreach (Player player in multiWin)
                    {
                        if ((int)player.InHand1.Face + (int)player.InHand2.Face + boardsum > highest)
                        {
                            handWinner = player;
                            highest    = (int)player.InHand1.Face + (int)player.InHand2.Face + boardsum;
                        }
                    }
                }
                if (winhand.Equals(Hands.ROYAL_FLUSH))
                {
                    int boardsum = 0;
                    int highest  = (int)multiWin[0].InHand1.Face + (int)multiWin[0].InHand2.Face + boardsum;
                    foreach (Card card in board.currBoard)
                    {
                        boardsum += (int)card.Face;
                    }
                    foreach (Player player in multiWin)
                    {
                        if ((int)player.InHand1.Face + (int)player.InHand2.Face + boardsum > highest)
                        {
                            handWinner = player;
                            highest    = (int)player.InHand1.Face + (int)player.InHand2.Face + boardsum;
                        }
                    }
                }
            }
            return(handWinner);
        }