Exemplo n.º 1
0
        public int WhoWins(List <Card> AiCards, List <Card> PlayerCards)
        //return -1 for ai win, 1 for player win, 0 for draw
        {
            evaluatedcards AiEvalCards = new evaluatedcards(AiCards), PlayerEvalCards = new evaluatedcards(PlayerCards);
            int            aiHighestCardInStraightFlush = 0, playerHighestCardInStraightFlush = 0;

            //check for straight flush
            if (AiEvalCards.hasFlush)
            {
                if (PlayerEvalCards.hasFlush)
                {
                    //checks for straight flush
                    if (AiEvalCards.highestCardInStraight > 0)
                    {
                        aiHighestCardInStraightFlush = hasStraightFlush(AiCards, AiEvalCards.flushSuit);

                        if (aiHighestCardInStraightFlush > 0)
                        {
                            playerHighestCardInStraightFlush = hasStraightFlush(PlayerCards, PlayerEvalCards.flushSuit);

                            if (aiHighestCardInStraightFlush > playerHighestCardInStraightFlush)
                            {
                                return(-1);
                            }
                            else if (playerHighestCardInStraightFlush > aiHighestCardInStraightFlush)
                            {
                                return(1);
                            }
                            else if (playerHighestCardInStraightFlush == aiHighestCardInStraightFlush)
                            {
                                return(0);
                            }
                        }
                    }

                    if (PlayerEvalCards.highestCardInStraight > 0)
                    {
                        playerHighestCardInStraightFlush = hasStraightFlush(PlayerCards, PlayerEvalCards.flushSuit);

                        if (playerHighestCardInStraightFlush > 0)
                        {
                            return(1);
                        }
                    }

                    //check for highest card in flush
                    return(CompareFlushes(AiCards, AiEvalCards.flushSuit, PlayerCards, PlayerEvalCards.flushSuit));
                }

                if (PlayerEvalCards.nrOfHighestCard >= 3)
                {
                    if (PlayerEvalCards.nrOfHighestCard == 4)
                    {
                        return(1);
                    }
                    else if (PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                    {
                        return(1);
                    }
                }


                return(-1);
            }

            //player flush check
            if (PlayerEvalCards.hasFlush)
            {
                //checks if player has straight flush
                if (PlayerEvalCards.highestCardInStraight > 0)
                {
                    playerHighestCardInStraightFlush = hasStraightFlush(PlayerCards, PlayerEvalCards.flushSuit);

                    if (playerHighestCardInStraightFlush > 0)
                    {
                        return(1);
                    }
                }
                //check if ai has anything that beats flush

                //four of a kind checks
                if (AiEvalCards.nrOfHighestCard == 4)
                {
                    return(-1);
                }

                //check for highest full house
                if (AiEvalCards.nrOfSecoundHighestCard >= 2 && AiEvalCards.nrOfHighestCard == 3)
                {
                    return(-1);
                }

                return(1);
            }

            //four of a kind checks
            if (AiEvalCards.nrOfHighestCard == 4)
            {
                if (PlayerEvalCards.nrOfHighestCard == 4)
                {
                    if (PlayerEvalCards.valueOfHigestCard > AiEvalCards.valueOfHigestCard)
                    {
                        return(1);
                    }
                    else if (PlayerEvalCards.valueOfHigestCard < AiEvalCards.valueOfHigestCard)
                    {
                        return(-1);
                    }

                    return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
                }
                return(-1);
            }

            if (PlayerEvalCards.nrOfHighestCard == 4)
            {
                return(1);
            }

            //check for highest full house
            if (AiEvalCards.nrOfSecoundHighestCard >= 2 && AiEvalCards.nrOfHighestCard == 3)
            {
                if (PlayerEvalCards.nrOfSecoundHighestCard >= 2 && PlayerEvalCards.nrOfHighestCard == 3)
                {
                    if (PlayerEvalCards.valueOfHigestCard > AiEvalCards.valueOfHigestCard)
                    {
                        return(1);
                    }
                    else if (PlayerEvalCards.valueOfHigestCard < AiEvalCards.valueOfHigestCard)
                    {
                        return(-1);
                    }
                    else if (PlayerEvalCards.ValueOfSecoundHeigestCard > AiEvalCards.ValueOfSecoundHeigestCard)
                    {
                        return(1);
                    }
                    else if (PlayerEvalCards.ValueOfSecoundHeigestCard < AiEvalCards.ValueOfSecoundHeigestCard)
                    {
                        return(-1);
                    }
                    return(0);
                }
                return(-1);
            }

            if (PlayerEvalCards.nrOfSecoundHighestCard >= 2 && PlayerEvalCards.nrOfHighestCard == 3)
            {
                return(1);
            }

            //checks for straight
            if (AiEvalCards.highestCardInStraight > 0 || PlayerEvalCards.highestCardInStraight > 0)
            {
                if (AiEvalCards.highestCardInStraight > PlayerEvalCards.highestCardInStraight)
                {
                    return(-1);
                }
                else if (AiEvalCards.highestCardInStraight < PlayerEvalCards.highestCardInStraight)
                {
                    return(1);
                }
                return(0);
            }

            //checks for highest 3 of a kind, 2 pairs, and pair
            if (PlayerEvalCards.nrOfHighestCard > AiEvalCards.nrOfHighestCard)
            {
                return(1);
            }
            else if (PlayerEvalCards.nrOfHighestCard < AiEvalCards.nrOfHighestCard)
            {
                return(-1);
            }
            else if (PlayerEvalCards.nrOfSecoundHighestCard > AiEvalCards.nrOfSecoundHighestCard)
            {
                return(1);
            }
            else if (PlayerEvalCards.nrOfSecoundHighestCard < AiEvalCards.nrOfSecoundHighestCard)
            {
                return(-1);
            }

            //if both player have the same kind of hand, check who has the highest value one
            else if (PlayerEvalCards.valueOfHigestCard > AiEvalCards.valueOfHigestCard)
            {
                return(1);
            }
            else if (PlayerEvalCards.valueOfHigestCard < AiEvalCards.valueOfHigestCard)
            {
                return(-1);
            }
            else if (PlayerEvalCards.ValueOfSecoundHeigestCard > AiEvalCards.ValueOfSecoundHeigestCard)
            {
                return(1);
            }
            else if (PlayerEvalCards.ValueOfSecoundHeigestCard < AiEvalCards.ValueOfSecoundHeigestCard)
            {
                return(-1);
            }
            else
            {
                //Check for high cards
                return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
            }
        }
Exemplo n.º 2
0
        public int WhoWinsV3(List <Card> AiCards, List <Card> PlayerCards)
        //function can be optimized by removeing checks for 4 of a kind when we know x player has a flush, as haveing both should be impossible

        //return -1 for ai win, 1 for player win, 0 for draw
        {
            evaluatedcards AiEvalCards = new evaluatedcards(AiCards), PlayerEvalCards = new evaluatedcards(PlayerCards);
            int            aiHighestCardInStraightFlush = 0, playerHighestCardInStraightFlush = 0;

            if (AiEvalCards.hasFlush)
            {
                if (PlayerEvalCards.hasFlush)
                {
                    //check for straight flush
                    if (AiEvalCards.highestCardInStraight > 0)
                    {
                        aiHighestCardInStraightFlush = hasStraightFlush(AiCards, AiEvalCards.flushSuit);

                        if (aiHighestCardInStraightFlush > 0)
                        {
                            if (PlayerEvalCards.highestCardInStraight > 0)
                            {
                                playerHighestCardInStraightFlush = hasStraightFlush(PlayerCards, PlayerEvalCards.flushSuit);

                                if (playerHighestCardInStraightFlush > 0)
                                {
                                    if (playerHighestCardInStraightFlush > aiHighestCardInStraightFlush)
                                    {
                                        return(1);
                                    }
                                    else if (playerHighestCardInStraightFlush < aiHighestCardInStraightFlush)
                                    {
                                        return(-1);
                                    }
                                    else
                                    {
                                        return(0);
                                    }
                                }
                            }

                            return(-1);
                        }
                    }

                    if (PlayerEvalCards.highestCardInStraight > 0)
                    {
                        playerHighestCardInStraightFlush = hasStraightFlush(PlayerCards, PlayerEvalCards.flushSuit);

                        if (playerHighestCardInStraightFlush > 0)
                        {
                            return(1);
                        }
                    }
                    //straight flush check end

                    //checks for 4 of a kind, or a hull house
                    if (AiEvalCards.nrOfHighestCard >= 3)
                    {
                        if (AiEvalCards.nrOfHighestCard == 4)
                        {
                            if (PlayerEvalCards.nrOfHighestCard == 4)
                            {
                                if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                                {
                                    return(-1);
                                }
                                else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                                {
                                    return(1);
                                }
                                else
                                {
                                    return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
                                }
                            }
                            return(-1);
                        }

                        if (AiEvalCards.nrOfSecoundHighestCard >= 2)
                        {
                            if (PlayerEvalCards.nrOfHighestCard == 4)
                            {
                                return(1);
                            }
                            else if (PlayerEvalCards.nrOfHighestCard == 3 && PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                            {
                                if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                                {
                                    return(-1);
                                }
                                else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                                {
                                    return(1);
                                }
                                else if (AiEvalCards.ValueOfSecoundHeigestCard > PlayerEvalCards.ValueOfSecoundHeigestCard)
                                {
                                    return(-1);
                                }
                                else if (AiEvalCards.ValueOfSecoundHeigestCard < PlayerEvalCards.ValueOfSecoundHeigestCard)
                                {
                                    return(1);
                                }
                                return(0);
                            }
                        }
                    }

                    if (PlayerEvalCards.nrOfHighestCard >= 3)
                    {
                        if (PlayerEvalCards.nrOfHighestCard == 4 || PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                        {
                            return(1);
                        }
                    }
                    //end of check for 4 of a kind, or fullhouse

                    //if nothing above is true check for highest flush
                    return(CompareFlushes(AiCards, AiEvalCards.flushSuit, PlayerCards, PlayerEvalCards.flushSuit));
                }
                //from here only Ai has flush, checks if Player has anything that trumps a flush

                //checks for 4 of a kind a hull house, for player before declareing ai winner
                if (PlayerEvalCards.nrOfHighestCard >= 3)
                {
                    if (PlayerEvalCards.nrOfHighestCard == 4)
                    {
                        if (AiEvalCards.nrOfHighestCard == 4)
                        {
                            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                            {
                                return(1);
                            }
                            else
                            {
                                return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
                            }
                        }

                        return(1);
                    }

                    if (PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                    {
                        if (AiEvalCards.nrOfHighestCard == 4)
                        {
                            return(-1);
                        }
                        else if (AiEvalCards.nrOfHighestCard == 3 && AiEvalCards.nrOfSecoundHighestCard >= 2)
                        {
                            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                            {
                                return(1);
                            }
                            else if (AiEvalCards.ValueOfSecoundHeigestCard > PlayerEvalCards.ValueOfSecoundHeigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.ValueOfSecoundHeigestCard < PlayerEvalCards.ValueOfSecoundHeigestCard)
                            {
                                return(1);
                            }
                            return(0);
                        }

                        return(1);
                    }
                }
                //end of 4 of a kind, and fullhouse checks

                //since nothing above was true, Ai is declared the winner with a flush
                return(-1);
            }

            if (PlayerEvalCards.hasFlush)
            {
                //check if ai has 4 of a kind or full house, before declareing Player winner with a flush
                if (AiEvalCards.nrOfHighestCard >= 3)
                {
                    if (AiEvalCards.nrOfHighestCard == 4)
                    {
                        if (PlayerEvalCards.nrOfHighestCard == 4)
                        {
                            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                            {
                                return(1);
                            }
                            else
                            {
                                return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
                            }
                        }
                        return(-1);
                    }

                    if (AiEvalCards.nrOfSecoundHighestCard >= 2)
                    {
                        if (PlayerEvalCards.nrOfHighestCard == 4)
                        {
                            return(1);
                        }
                        else if (PlayerEvalCards.nrOfHighestCard == 3 && PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                        {
                            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                            {
                                return(1);
                            }
                            else if (AiEvalCards.ValueOfSecoundHeigestCard > PlayerEvalCards.ValueOfSecoundHeigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.ValueOfSecoundHeigestCard < PlayerEvalCards.ValueOfSecoundHeigestCard)
                            {
                                return(1);
                            }
                            return(0);
                        }
                        return(-1);
                    }
                }
                //end of checks for 4 of a kind, or fullhouse

                //since nothing above was true, then the player wins with a flush
                return(1);
            }

            if (AiEvalCards.highestCardInStraight > 0)
            {
                if (PlayerEvalCards.highestCardInStraight > 0)
                {
                    //checks for 4 of a kind, or a hull house
                    if (AiEvalCards.nrOfHighestCard >= 3)
                    {
                        if (AiEvalCards.nrOfHighestCard == 4)
                        {
                            if (PlayerEvalCards.nrOfHighestCard == 4)
                            {
                                if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                                {
                                    return(-1);
                                }
                                else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                                {
                                    return(1);
                                }
                                else
                                {
                                    return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
                                }
                            }
                            return(-1);
                        }

                        if (AiEvalCards.nrOfSecoundHighestCard >= 2)
                        {
                            if (PlayerEvalCards.nrOfHighestCard == 4)
                            {
                                return(1);
                            }
                            else if (PlayerEvalCards.nrOfHighestCard == 3 && PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                            {
                                if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                                {
                                    return(-1);
                                }
                                else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                                {
                                    return(1);
                                }
                                else if (AiEvalCards.ValueOfSecoundHeigestCard > PlayerEvalCards.ValueOfSecoundHeigestCard)
                                {
                                    return(-1);
                                }
                                else if (AiEvalCards.ValueOfSecoundHeigestCard < PlayerEvalCards.ValueOfSecoundHeigestCard)
                                {
                                    return(1);
                                }
                                return(0);
                            }
                        }
                    }

                    if (PlayerEvalCards.nrOfHighestCard >= 3)
                    {
                        if (PlayerEvalCards.nrOfHighestCard == 4 || PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                        {
                            return(1);
                        }
                    }
                    //end of checks for 4 of a kind or full house

                    //compare straights
                    if (AiEvalCards.highestCardInStraight > PlayerEvalCards.highestCardInStraight)
                    {
                        return(-1);
                    }
                    else if (AiEvalCards.highestCardInStraight < PlayerEvalCards.highestCardInStraight)
                    {
                        return(1);
                    }
                    else
                    {
                        return(0);
                    }
                }

                //check if Player has something that trumps the Ai's straight, not includeing a flush which we already have checked that it doesn have
                if (PlayerEvalCards.nrOfHighestCard >= 3)
                {
                    if (PlayerEvalCards.nrOfHighestCard == 4)
                    {
                        if (AiEvalCards.nrOfHighestCard == 4)
                        {
                            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                            {
                                return(1);
                            }
                            else
                            {
                                return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
                            }
                        }

                        return(1);
                    }

                    if (PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                    {
                        if (AiEvalCards.nrOfHighestCard == 4)
                        {
                            return(-1);
                        }
                        else if (AiEvalCards.nrOfHighestCard == 3 && AiEvalCards.nrOfSecoundHighestCard >= 2)
                        {
                            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                            {
                                return(1);
                            }
                            else if (AiEvalCards.ValueOfSecoundHeigestCard > PlayerEvalCards.ValueOfSecoundHeigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.ValueOfSecoundHeigestCard < PlayerEvalCards.ValueOfSecoundHeigestCard)
                            {
                                return(1);
                            }
                            return(0);
                        }

                        return(1);
                    }
                }

                //since nothing above was true Ai wins with a Straight;
                return(-1);
            }

            if (PlayerEvalCards.highestCardInStraight > 0)
            {
                //checks if ai has something that trumps a straight, not includeing flush or straigh as we already checked for this earlier
                if (AiEvalCards.nrOfHighestCard >= 3)
                {
                    if (AiEvalCards.nrOfHighestCard == 4)
                    {
                        if (PlayerEvalCards.nrOfHighestCard == 4)
                        {
                            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                            {
                                return(-1);
                            }
                            if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                            {
                                return(1);
                            }
                            return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
                        }
                        return(-1);
                    }

                    else if (AiEvalCards.nrOfSecoundHighestCard >= 2)
                    {
                        if (PlayerEvalCards.nrOfSecoundHighestCard == 4)
                        {
                            return(1);
                        }
                        else if (PlayerEvalCards.nrOfSecoundHighestCard == 3 && PlayerEvalCards.nrOfSecoundHighestCard >= 2)
                        {
                            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
                            {
                                return(1);
                            }
                            else if (AiEvalCards.ValueOfSecoundHeigestCard > PlayerEvalCards.ValueOfSecoundHeigestCard)
                            {
                                return(-1);
                            }
                            else if (AiEvalCards.ValueOfSecoundHeigestCard < PlayerEvalCards.ValueOfSecoundHeigestCard)
                            {
                                return(1);
                            }
                            return(0);
                        }
                    }
                }

                //since nothing above was true Player wins with a Straight
                return(1);
            }

            //since we know that Ai and Player neither have a flush or a Straight we can check for highs number of same rank cards.
            if (AiEvalCards.nrOfHighestCard > PlayerEvalCards.nrOfHighestCard)
            {
                return(-1);
            }
            else if (AiEvalCards.nrOfHighestCard < PlayerEvalCards.nrOfHighestCard)
            {
                return(1);
            }
            else if (AiEvalCards.nrOfSecoundHighestCard > PlayerEvalCards.nrOfSecoundHighestCard)
            {
                return(-1);
            }
            else if (AiEvalCards.nrOfSecoundHighestCard < PlayerEvalCards.nrOfSecoundHighestCard)
            {
                return(1);
            }

            //since we both player have the same number of same ranks, we'll check who has the highest value of same ranks
            if (AiEvalCards.valueOfHigestCard > PlayerEvalCards.valueOfHigestCard)
            {
                return(-1);
            }
            else if (AiEvalCards.valueOfHigestCard < PlayerEvalCards.valueOfHigestCard)
            {
                return(1);
            }
            else if (AiEvalCards.ValueOfSecoundHeigestCard > PlayerEvalCards.ValueOfSecoundHeigestCard)
            {
                return(-1);
            }
            else if (AiEvalCards.ValueOfSecoundHeigestCard < PlayerEvalCards.ValueOfSecoundHeigestCard)
            {
                return(1);
            }

            //because nothing above decided the result it comes down to highest card
            return(WhoHasHighCard(AiCards, PlayerCards, AiEvalCards.nrOfHighestCard, AiEvalCards.nrOfSecoundHighestCard, AiEvalCards.valueOfHigestCard, AiEvalCards.ValueOfSecoundHeigestCard));
        }