C # не может содержать значение переменной структуры - PullRequest
1 голос
/ 08 января 2012

Я пытаюсь написать рамочную программу, которая позволит вам играть в Техасский Холдем. И у меня возникли проблемы с функцией 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 (структура), например:

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

Почему они не могут хранить свои ценности? Как я могу решить эту проблему? Спасибо за помощь.

Ответы [ 2 ]

6 голосов
/ 08 января 2012

Проблема, с которой вы столкнулись, заключается в том, что структуры передаются по значению в .Net. Следовательно, метод Deal_Cards получает копию экземпляра Player и назначает карты для этой копии. Исходное значение, переданное Deal_Cards, не изменяется.

Чтобы это исправить, вам нужно либо сделать Player a class, либо передать его по ссылке. Я настоятельно рекомендую сделать Player class. Изменчивые структуры - это просто путь к боли, и трудно выискивать подобные ошибки.

0 голосов
/ 09 января 2012

В C передача структуры по значению эффективно дает копию структуры вызываемой подпрограмме;независимо от того, что процедура делает со своей копией структуры, поля структуры вызывающей стороны не будут затронуты.Если вы хотите, чтобы вызываемая функция могла изменять структуру, вы должны сделать ее параметром "ref".

Обратите внимание, что передача структуры в качестве параметра ref имеет более строгую семантику, чем передача ссылки на объект класса.Подпрограмма, которой дается ссылка на объект класса, может не только делать со ссылкой все, что хочет, но и делать ее доступной для другого кода, который может делать все, что хочет , когда хочет , даже послефункция, которая была первоначально предоставлена ​​ссылка вернулась.Напротив, подпрограмма, которой дана структура в качестве параметра ref, может делать со структурой все, что захочет, до тех пор, пока не вернется, но она не будет иметь возможности прямо или косвенно изменять поля структуры после ее возврата.

Вы не показываете содержимое вашего типа данных Player, поэтому неясно, должна ли это быть структура или класс.Рука игрока, однако, может показаться логичным кандидатом для структуры, поскольку она просто держит две карты.Создание этого изменчивого класса показалось бы мне очень странным.Можно либо сделать руку игрока неизменной структурой и заменить метод Deal_Cards на функцию GenerateHand, которая возвращает структуру playerHand, либо передать playerHand в DealCards в качестве параметра ref.Если идти по «неизменяемому» маршруту, можно использовать класс, но я вижу небольшую выгоду в использовании неизменяемого класса вместо неизменяемой структуры в этом контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...