我正在创建一个玩家与计算机对战的扑克游戏。
我遇到了一个问题:

玩家和计算机生成相同的手/牌。

我假设这是排序问题或洗牌问题,但似乎无法找到问题所在。任何人都可以帮忙吗?

我的意思的例子

c# - 扑克游戏 : Player and computer generating same hand-LMLPHP

交易类别:

    namespace PROG120_FINALPROJECT
    {
    class Deal : DeckofCards
    {
        private Card[] PlayerHand;
        private Card[] ComputerHand;
        private Card[] SortPHand; //sorted player hand
        private Card[] SortCHand; // sorted computer hand


        public Deal()
        {
            PlayerHand = new Card[5];
            SortPHand = new Card[5];
            ComputerHand = new Card[5];
            SortCHand = new Card[5];
        }

        public void DealSetup()
        {
            SetDeck(); //create the deck of cards and shuffle them
            GetHand();
            sortCards();
            evaluateHands();
        }


        public void GetHand()
        {
            //5 cards for the player
            for (int i = 0; i < 5; i++)
                PlayerHand[i] = GetDeck[i];


            //5 cards for computer
            for (int i = 0; i < 5; i++)
                ComputerHand[i] = GetDeck[i];
        }

        public void sortCards()
        {
            var seePlayer = from hand in PlayerHand
                              orderby hand.CardValue
                              select hand;

            var seeComputer = from hand in ComputerHand
                                orderby hand.CardValue
                                select hand;

            var index = 0;
            foreach (var element in seePlayer.ToList())
            {
                SortPHand[index] = element;
                index++;
            }

            index = 0;
            foreach (var element in seeComputer.ToList())
            {
                SortCHand[index] = element;
                index++;
            }
        }
        public void evaluateHands()
        {
            //create player's computer's evaluation objects (passing Sorted hand to constructor)
            HandEvaluator playerHandEvaluator = new HandEvaluator(SortPHand);
            HandEvaluator computerHandEvaluator = new HandEvaluator(SortCHand);

            //get the player's and computer's handj
            Hand playerHand = playerHandEvaluator.EvaluateHand();
            Hand computerHand = computerHandEvaluator.EvaluateHand();

            //display each hand
            Console.WriteLine("\n\n\n\n\nPlayer's Hand: " + playerHand);
            foreach (var card in PlayerHand)
            {
                Console.Write(card.CardValue.ToString());
                Console.Write(" of ");
                Console.Write(card.CardSuit.ToString());
                Console.Write("\n");
            }
            Console.WriteLine("\n\n\n\n\nComputer's Hand: " + computerHand);

            foreach (var card in PlayerHand)
            {
                Console.Write(card.CardValue.ToString());
                Console.Write(" of ");
                Console.Write(card.CardSuit.ToString());
                Console.Write("\n");
            }
            //evaluate hands
            if (playerHand > computerHand)
            {
                Console.WriteLine("Player WINS!");
            }
            else if (playerHand < computerHand)
            {
                Console.WriteLine("Computer WINS!");
            }
            else //if the hands are the same, evaluate the values
            {
                //first evaluate who has higher value of hand
                if (playerHandEvaluator.HVs.Total > computerHandEvaluator.HVs.Total)
                    Console.WriteLine("Player WINS!");
                else if (playerHandEvaluator.HVs.Total < computerHandEvaluator.HVs.Total)
                    Console.WriteLine("Computer WINS!");
                //if both hanve the same poker hand
                // player with the next higher card wins
                else if (playerHandEvaluator.HVs.HighCard > computerHandEvaluator.HVs.HighCard)
                    Console.WriteLine("Player WINS!");
                else if (playerHandEvaluator.HVs.HighCard < computerHandEvaluator.HVs.HighCard)
                    Console.WriteLine("Computer WINS!");
                else
                    Console.WriteLine("Draw, no one wins!");
            }
        }
    }
}

类 DeckofCards:
    namespace PROG120_FINALPROJECT
    {
        //START CLASS DoC
        class DeckofCards : Card
    {
        int AllCards = 52; //52 cards in a deck
        private Card[] Deck; //array of playing cards

        public DeckofCards()
        {
            Deck = new Card[AllCards];
        }

        public Card[] GetDeck //grab current deck
        {
            get
            { return Deck; }
        }

        public void SetDeck()
        {
            int i = 0;
            foreach (SUIT s in Enum.GetValues(typeof(SUIT)))
            {
                foreach (VALUE v in Enum.GetValues(typeof(VALUE)))
                {
                    Deck[i] = new Card { CardSuit = s, CardValue = v };
                    i++;
                }
            }
            Shuffle();
        }

        //shuffle deck
        public void Shuffle()
        {
            Random rand = new Random();
            Card temp;

            //run shuffle 100 times
            for (int ShuffleAmount = 0; ShuffleAmount < 100; ShuffleAmount++)
            {
                for (int i = 0; i < AllCards; i++)
                {
                    //swap cards
                    int SecondCardIndex = rand.Next(13);
                    temp = Deck[i];
                    Deck[i] = Deck[SecondCardIndex];
                    Deck[SecondCardIndex] = temp;
                }
            }
        }
        //END of CLASS DoC
    }
}

我认为你不需要这些,但以防万一这是我的其他类(class)-

手评估:
    namespace PROG120_FINALPROJECT
    {
        public enum Hand
        {
        Nothing,
        OnePair, //Jacks or Better
        TwoPairs,
        ToK, //Three of a kind
        Str, //straight
        Flush,
        StrFlush, //straight flush
        FullH, // Full House
        FoK, // Four of a  Kind
        Royal, //Royal Flush
    }

    public struct HandValue
    {
        public int Total
        {
            get;
            set;
        }
        public int HighCard
        {
            get;
            set;
        }
    }

    class HandEvaluator : Card
    {
        private int SpadeSum;
        private int HeartSum;
        private int DiamondSum;
        private int ClubSum;
        private Card[] cards;
        private HandValue HV; //Hand Value

        public HandEvaluator(Card[] SortedHand)
        {
            SpadeSum = 0;
            HeartSum = 0;
            DiamondSum = 0;
            ClubSum = 0;
            cards = new Card[5];
            cards = SortedHand;
            HV = new HandValue();
        }

        public HandValue HVs
        {
            get
            { return HV; }
            set
            { HV = value; }
        }

        public Card [] Cards
        {
            get
            { return cards; }
            set
            {
                cards[0] = value[0];
                cards[1] = value[1];
                cards[2] = value[2];
                cards[3] = value[3];
                cards[4] = value[4];
            }
        }

        public Hand EvaluateHand()
        {
            //gets number of each suit on hand
            getNumberofSuit();
            if (Royal())
                return Hand.Royal;
            else if (FoK())
                return Hand.FoK;
            else if (FullH())
                return Hand.FullH;
            else if (StrFlush())
                return Hand.StrFlush;
            else if (Flush())
                return Hand.Flush;
            else if (Str())
                return Hand.Str;
            else if (ToK())
                return Hand.ToK;
            else if (TwoPairs())
                return Hand.TwoPairs;
            else if (OnePair())
                return Hand.OnePair;

            //if hand is nothing, player with highest card wins
            HV.HighCard = (int)cards[4].CardValue;
            return Hand.Nothing;
        }

        private void getNumberofSuit()
        {
            foreach (var element in Cards)
            {
                if (element.CardSuit == Card.SUIT.SPADE)
                    SpadeSum++;
                else if (element.CardSuit == Card.SUIT.HEART)
                    HeartSum++;
                else if (element.CardSuit == Card.SUIT.DIAMOND)
                    DiamondSum++;
                else if (element.CardSuit == Card.SUIT.CLUB)
                    ClubSum++;
            }
        }

        private bool Royal()
        {
            // a straight flush including ace, king, queen, jack, and ten all in the same suit.
            //all suits are same & 5 consecutive values
            if (SpadeSum == 5 || HeartSum == 5 || DiamondSum == 5 || ClubSum == 5 &&
                 cards[0].CardValue + 1 == cards[1].CardValue &&
                 cards[1].CardValue + 1 == cards[2].CardValue &&
                 cards[2].CardValue + 1 == cards[3].CardValue &&
                 cards[3].CardValue + 1 == cards[4].CardValue)
            {
                HV.Total = (int)cards[4].CardValue;
                return true;
            }

            return false;
        }

        private bool FoK()
        {
            //if the first 4 cards, add values of the four cards and last card is the highest
            if (cards[0].CardValue == cards[1].CardValue && cards[0].CardValue == cards[2].CardValue && cards[0].CardValue == cards[3].CardValue)
            {
                HV.Total = (int)cards[1].CardValue * 4;
                HV.HighCard = (int)cards[4].CardValue;
                return true;
            }
            else if (cards[1].CardValue == cards[2].CardValue && cards[1].CardValue == cards[3].CardValue && cards[1].CardValue == cards[4].CardValue)
            {
                HV.Total = (int)cards[1].CardValue * 4;
                HV.HighCard = (int)cards[0].CardValue;
                return true;
            }

            return false;
        }

        private bool FullH()
        {
            //the first three cards and last two cards are of the same value
            //first two cards, and last three cards are of the same value
            if ((cards[0].CardValue == cards[1].CardValue && cards[0].CardValue == cards[2].CardValue && cards[3].CardValue == cards[4].CardValue) ||
                (cards[0].CardValue == cards[1].CardValue && cards[2].CardValue == cards[3].CardValue && cards[2].CardValue == cards[4].CardValue))
            {
                HV.Total = (int)(cards[0].CardValue) + (int)(cards[1].CardValue) + (int)(cards[2].CardValue) +
                    (int)(cards[3].CardValue) + (int)(cards[4].CardValue);
                return true;
            }

            return false;
        }

        private bool StrFlush()
        {
            //all suits are same & 5 consecutive values
            if (SpadeSum == 5 || HeartSum == 5 || DiamondSum == 5 || ClubSum == 5 &&
                 cards[0].FaceValue + 1 == cards[1].FaceValue &&
                 cards[1].FaceValue + 1 == cards[2].FaceValue &&
                 cards[2].FaceValue + 1 == cards[3].FaceValue &&
                 cards[3].FaceValue + 1 == cards[4].FaceValue)
            {
                HV.Total = (int)cards[4].CardValue;
                return true;
            }
            return false;
        }

        private bool Flush()
        {
            //if all suits are the same
            if (SpadeSum == 5 || HeartSum == 5 || DiamondSum == 5 || ClubSum == 5)
            {
                //if tie flush player with higher cards win
                //whomever has last card has highest value, has automatically  all the cards total higher
                HV.Total = (int)cards[4].CardValue;
                return true;
            }
            return false;
        }

        private bool Str()
        {
            //if 5 consecutive value
            if (cards[0].CardValue + 1 == cards[1].CardValue &&
                cards[1].CardValue + 1 == cards[2].CardValue &&
                cards[2].CardValue + 1 == cards[3].CardValue &&
                cards[3].CardValue + 1 == cards[4].CardValue)
            {
                //player with highest value of the last card wins
                HV.Total = (int)cards[4].CardValue;
                return true;
            }

            return false;
        }

        private bool ToK()
        {
            //if the 1,2,3 cards are the same OR
            //2,3,4 cards are the same OR
            //3,4,5 cards are the same
            //3rds card will always be a part of Three of A Kind

            if ((cards[0].CardValue == cards[1].CardValue && cards[0].CardValue == cards[2].CardValue) ||
            (cards[1].CardValue == cards[2].CardValue && cards[1].CardValue == cards[3].CardValue))
            {
                HV.Total = (int)cards[2].CardValue * 3;
                HV.HighCard = (int)cards[4].CardValue;
                return true;
            }
            else if (cards[2].CardValue == cards[3].CardValue && cards[2].CardValue == cards[4].CardValue)
            {
                HV.Total = (int)cards[2].CardValue * 3;
                HV.HighCard = (int)cards[1].CardValue;
                return true;
            }
            return false;
        }

        private bool TwoPairs()
        {
            //if 1,2 and 3,4
            //if 1.2 and 4,5
            //if 2.3 and 4,5
            //with two pairs, the 2nd card will always be a part of one pair
            //and 4th card will always be a part of second pair
            if (cards[0].CardValue == cards[1].CardValue && cards[2].CardValue == cards[3].CardValue)
            {
                HV.Total = ((int)cards[1].CardValue * 2) + ((int)cards[3].CardValue * 2);
                HV.HighCard = (int)cards[4].CardValue;
                return true;
            }
            else if (cards[0].CardValue == cards[1].CardValue && cards[3].CardValue == cards[4].CardValue)
            {
                HV.Total = ((int)cards[1].CardValue * 2) + ((int)cards[3].CardValue * 2);
                HV.HighCard = (int)cards[2].CardValue;
                return true;
            }
            else if (cards[1].CardValue == cards[2].CardValue && cards[3].CardValue == cards[4].CardValue)
            {
                HV.Total = ((int)cards[1].CardValue * 2) + ((int)cards[3].CardValue * 2);
                HV.HighCard = (int)cards[0].CardValue;
                return true;
            }
            return false;
        }

        private bool OnePair()
        {
            //if 1,2 -> 5th card has the highest value
            //2.3
            //3,4
            //4,5 -> card #3 has the highest value
            if (cards[0].CardValue == cards[1].CardValue)
            {
                HV.Total = (int)cards[0].CardValue * 2;
                HV.HighCard = (int)cards[4].CardValue;
                return true;
            }
            else if (cards[1].CardValue == cards[2].CardValue)
            {
                HV.Total = (int)cards[1].CardValue * 2;
                HV.HighCard = (int)cards[4].CardValue;
                return true;
            }
            else if (cards[2].CardValue == cards[3].CardValue)
            {
                HV.Total = (int)cards[2].CardValue * 2;
                HV.HighCard = (int)cards[4].CardValue;
                return true;
            }
            else if (cards[3].CardValue == cards[4].CardValue)
            {
                HV.Total = (int)cards[3].CardValue * 2;
                HV.HighCard = (int)cards[2].CardValue;
                return true;
            }

            return false;
        }


    }

        //END OF NAMESPACE
}

卡类:
    namespace PROG120_FINALPROJECT
    {
            //START CLASS CARD
        class Card
    {
        // Establishes suits
        public enum SUIT
        {
            SPADE,
            HEART,
            DIAMOND,
            CLUB
        }

        // Gives Cards a numeric vakue i.e. NINE of hearts
        public enum VALUE
        {
            TWO = 1, THREE, FOUR, FIVE, SIX,
            SEVEN, EIGHT, NINE, TEN,
            JACK, QUEEN, KING, ACE
        }

        // just the face cards
        public enum FACE
        {
            JACK,
            QUEEN,
            KING,
            ACE
        }

        //Properties
        public SUIT CardSuit
        {
            get;
            set;
        }


        public VALUE CardValue
        {
            get;
            set;
        }

        public FACE FaceValue
        {
            get;
            set;
        }


    //END CLASS CARDS
    }
}

程序类:
    namespace PROG120_FINALPROJECT
    {
    class Program
    {
        static void Main(string[] args)
        {
            //Define
            Deal dc = new Deal();
            // write string repersentation
           // enum


            Console.WriteLine("Please Enter the amount you would like to bet 1-5");
            float bet = float.Parse(Console.ReadLine());

            if (bet < 0)
            {
                Console.WriteLine("Please enter valid bet amount");
            }
            else
            {
                dc.DealSetup();
            }


                if (bet > 5)
            {
                Console.WriteLine("Please enter higher bet amount");
            }
            else
            {
                dc.GetHand();
            }
        }
    }
}

最佳答案

public void GetHand()
{
    //5 cards for the player
    for (int i = 0; i < 5; i++)
        PlayerHand[i] = GetDeck[i];


    //5 cards for computer
    for (int i = 0; i < 5; i++)
        ComputerHand[i] = GetDeck[i];
}

Deck 是一个数组;您正在检索该数组的前 5 个元素两次。您可能想要一个更像“GetNextCard”的函数并跟踪 Deck 类中的索引,因为它不是经销商应该关心的事情。或者将 Deck 实现为堆栈而不是数组并弹出每张卡片。

关于c# - 扑克游戏 : Player and computer generating same hand,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37636273/

10-12 05:47