繁体   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