簡體   English   中英

C#無法保存struct變量的值

[英]C# Cannot hold the value of struct variable

我正在嘗試編寫一個框架程序,使您可以玩德州撲克。 而且我無法使用函數hasPair來確定CurrentPlayer是否具有對:

  public bool hasPair(Player CurrentPlayer)
        {
            bool flag;
            Card[] SevenCards = new Card[7];

            SevenCards[0].Color = CurrentPlayer.Card1.Color;
            SevenCards[0].Number = CurrentPlayer.Card1.Number;
            SevenCards[1].Color = CurrentPlayer.Color2;
            SevenCards[1].Number = CurrentPlayer.Number2;

            SevenCards[2] = Ground.Card1;
            SevenCards[3] = Ground.Card2;
            SevenCards[4] = Ground.Card3;
            SevenCards[5] = Ground.Card4;
            SevenCards[6] = Ground.Card5;

            flag = isThere_Pair(SevenCards); 

            return flag;
        }

這是CurrentPlayer如何接收其卡的:

    public void Deal_Cards(Player Player)
    {
        int Color1, No1, Color2, No2;

        while (true)
        {


        dealhelper1:

            Color1 = (RandomColor.Next() % 4);
            No1 = ((RandomNo.Next() % 13));


            if (CardDeck[Color1, No1].isChosen == true)
            {
                goto dealhelper1;
            }

            if (CardDeck[Color1, No1].isChosen == false)
            {
                Player.Card1.Color = Color1;

                Player.Card1.Number = No1+1;
                Player.Card1.imagePath = CardDeck[Color1, No1].imagePath;

                Player.Color1 = CardDeck[Color1, No1].Color;
                Player.Number1 = CardDeck[Color1, No1].Number;                   

                CardDeck[Color1, No1].isChosen = true;
                break;
            }
        }

        while (true)
        {
            dealhelper2:

            Color2 = (RandomColor.Next() % 4);
            No2 = ((RandomNo.Next() % 13));

            if (CardDeck[Color2, No2].isChosen == true)
            {
                goto dealhelper2;
            }

            if (CardDeck[Color2, No2].isChosen == false)
            {
                CardDeck[Color2, No2].isChosen = true;


                Player.Card2.Color = Color2;
                Player.Card2.Number = (No2)+1;

                Player.Color2 = CardDeck[Color2, No2].Color;
                Player.Number2 = CardDeck[Color2, No2].Number;
                break;
            }
        }

        display_Player_Cards(Player);
    }

但是在hasPair函數中, CurrentPlayer的紙牌數和顏色為0。我以不同的方式嘗試了該方法,但是當我在查詢中詢問時,我無法獲得玩家紙牌的數值,盡管它們已由Deal_Cards函數初始化。 不過,地面卡沒有問題。

有趣的是, display_Player_Cards(Player)函數可以正常工作(因此它將成功獲取值並顯示卡)。

我使用Player (struct)類型的公共變量,例如:

    public Player P1 = new Player();
    public Player AI = new Player();

他們為什么不能堅持自己的價值觀? 我該如何解決這個問題? 感謝幫助。

您遇到的問題是結構是通過.Net中的值傳遞的。 因此Deal_Cards方法接收Player實例的副本,並將卡分配給該副本。 傳遞給Deal_Cards的原始值未修改。

要解決此問題,您需要使Player成為class或通過引用傳遞它。 我強烈建議將Player設為class 擁有可變的結構只是痛苦之路,並且很難找到這樣的錯誤。

在C語言中,按值傳遞結構可有效地將結構的副本提供給被調用的例程。 無論例程對其結構副本執行什么操作,調用者結構的字段都不會受到影響。 如果希望被調用的函數能夠修改該結構,則必須使其成為“ ref”參數。

請注意,將結構作為ref參數傳遞比傳遞類對象引用具有更嚴格的語義。 , even after the function that was originally given the reference has returned. 被賦予對類對象的引用的例程不僅可以使用該引用執行其所需的任何操作,而且還可以使該例程可用於其他可以操作的代碼,即使在最初賦予該功能的函數之后也是如此。參考已返回。 相比之下,被賦予結構作為ref參數的例程可以對結構進行任何操作,直到返回為止,但返回后將無法直接或間接修改結構的字段。

您不會顯示“ Player”數據類型的內容,因此尚不清楚它應該是結構還是類。 然而,玩家的手似乎是一個結構的合理候選者,因為它只持有兩張牌。 在我看來,將其設置為可變的課程似乎真的很邪惡。 可以使玩家的手成為不可變的結構,並用GenerateHand函數替換Deal_Cards方法,該函數返回playerHand結構,或者將DealCards作為ref參數傳遞給playerHand 如果一個人走了“不變”路線,那么可以使用一類,但是在這種情況下,使用不變類而不是不變結構幾乎沒有好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM