【问题标题】:Why is my array of cards empty?为什么我的卡片阵列是空的?
【发布时间】:2015-10-23 23:16:53
【问题描述】:

我是一名新手编码员,正在为我的班级学习 C#,但在练习练习时遇到了麻烦,我们必须制作一副纸牌并将它们分发出去。

我们需要创建一个类,通过构造函数从另一个类接收参数来创建卡片。然后在 Tostring 方法中使用这些值通过 switch 语句设置这些卡片的值和花色并返回一张卡片。在第二个类中,我们用卡片填充数组,并在 Dealing 方法中调用 Tostring 方法,通过将卡片从数组中拉出,随机生成用户指定数量的卡片。

问题是我的数组没有被填充我试图 Console.WriteLine 数组的部分在它们被分配之后直接被分配并且它们是空的。你不必给我完整的答案,只要让我走上正轨。

代码如下:

这是卡片创建类

 `  class Card
{

    static int value; 
    static int suit;
    static string cdvalue;
    static string cdsuit;

    string card;

    public Card(int ranvalue, int ransuit) //constructor that sets value and suit
    {
        value = ranvalue;
        suit = ransuit;
    }
    public override string ToString()
    {
        switch (value) //switch statement for card value
        {
            case 1: cdvalue = "ace";
                break;
            case 2: cdvalue = "two";
                break;
            case 3: cdvalue = "three";
                break;
            case 4: cdvalue = "four";
                break;
            case 5: cdvalue = "five";
                break;
            case 6: cdvalue = "six";
                break;
            case 7: cdvalue = "seven";
                break;
            case 8: cdvalue = "eight";
                break;
            case 9: cdvalue = "nine";
                break;
            case 10: cdvalue = "ten";
                break;
            case 11: cdvalue = "jack";
                break;
            case 12: cdvalue = "queen";
                break;
            case 13: cdvalue = "king";
                break;
        }
        switch (suit) // switch for card suit
        {
            case 1: cdsuit = "Hearts ";
                break;
            case 2: cdsuit = "Spades ";
                break;
            case 3: cdsuit = "Diamonds ";
                break;
            case 4: cdsuit = "Clubs ";
                break;
        }
        card = cdvalue + " of " + cdsuit;

        return card;// returns a string in the form of "value of suit"`

这个类创建卡组

class Deck
{
    Random rng = new Random(); //Random object



    private static Card[] deck;
    static string[] cards; 
    public Deck()
    {
        deck = new Card[52];//creates array of 52 elements
        int l = 0;
        for (int i = 1; i <= 13; i++)//loops to create cards 
        {
            for (int j = 1; j <= 4; j++)
            {

                deck[l++] = new Card(i,j); // populates the array with all 52 cards



            }
        }

    }
    static string dealt;
    static int Rndm;
    public string deal(int number)//parameter received from user
    {
        cards = new string[number];//creates an array to contain dealt card objects
        int m = 0;

        for (int num=0;num<number;num++) // determines the amount of cards to be dealt
        {

            Rndm = rng.Next(0,53);
            cards[m++] = deck[Rndm].ToString();//fills the card array with randomly dealt cards from the deck
            dealt = string.Join(" ", cards); // turns the card array into a single string of the cards dealt



        }
        return dealt;//returns the cards dealt

这是测试类

  static void Main(string[] args)
    {

        // get the number of cards from the user - must be between 1 and 52
        int cardsDealt = -1;
        do
        {
            Console.Write("Enter number of cards to get (1-52): ");
            String dealStr = Console.ReadLine();
            Boolean parsed = int.TryParse(dealStr, out cardsDealt);
        } while (cardsDealt < 1 || cardsDealt > 52);

        // create a Deck object
        Deck cardDeck = new Deck();

        // Call the deal method
        String cards = cardDeck.deal(cardsDealt);

        // List the result
        Console.WriteLine("\nCards dealt:\n" + cards);

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    在您的 Card 类中,变量 valuesuit 标记为 static

    private static int value;
    private static int suit;
    

    因为这两个变量是静态的,所以对这些变量的引用将在 Card 对象的实例之间保持不变。这意味着每次创建新的 Card 对象时,您都会无意中更新所有其他 Card 对象 valuesuit 具有相同值的变量。因此,现在无论何时您获得 Card 的实例,它将与所有其他实例(创建的最后一张 Card)相同。

    从这些声明中删除 static 关键字,你应该没问题。

    另外我建议阅读静态以更熟悉它的用法:Static keyword in c#

    【讨论】:

      【解决方案2】:

      您的代码非常接近正确。您似乎对何时使用static 有误解。

      如果您需要一个在类的所有实例之间共享的变量,请使用static。但是,如果您需要每个实例的值,则不需要。

      您的代码中没有变量应该是static

      此外,为了帮助您编写代码,您无需在类级别定义所有变量。可以(并且应该)在每个方法中声明很多内容。

      这是代码的重构版本,以便您了解应该做什么。

      void Main()
      {
          // get the number of cards from the user - must be between 1 and 52
          int cardsDealt = -1;
          while (cardsDealt < 1 || cardsDealt > 52)
          {
              Console.Write("Enter number of cards to get (1-52): ");
              String dealStr = Console.ReadLine();
              Boolean parsed = int.TryParse(dealStr, out cardsDealt);
          }
      
          // create a Deck object
          Deck cardDeck = new Deck();
      
          // Call the deal method
          String cards = cardDeck.deal(cardsDealt);
      
          // List the result
          Console.WriteLine("\nCards dealt:\n" + cards);
      }
      
      public class Card
      {
          private int value;
          private int suit;
      
          public Card(int ranvalue, int ransuit) //constructor that sets value and suit
          {
              value = ranvalue;
              suit = ransuit;
          }
          public override string ToString()
          {
              string cdvalue = null;
              switch (value) //switch statement for card value
              {
                  case 1:
                      cdvalue = "ace";
                      break;
                  case 2:
                      cdvalue = "two";
                      break;
                  case 3:
                      cdvalue = "three";
                      break;
                  case 4:
                      cdvalue = "four";
                      break;
                  case 5:
                      cdvalue = "five";
                      break;
                  case 6:
                      cdvalue = "six";
                      break;
                  case 7:
                      cdvalue = "seven";
                      break;
                  case 8:
                      cdvalue = "eight";
                      break;
                  case 9:
                      cdvalue = "nine";
                      break;
                  case 10:
                      cdvalue = "ten";
                      break;
                  case 11:
                      cdvalue = "jack";
                      break;
                  case 12:
                      cdvalue = "queen";
                      break;
                  case 13:
                      cdvalue = "king";
                      break;
              }
              string cdsuit = null;
              switch (suit) // switch for card suit
              {
                  case 1:
                      cdsuit = "Hearts ";
                      break;
                  case 2:
                      cdsuit = "Spades ";
                      break;
                  case 3:
                      cdsuit = "Diamonds ";
                      break;
                  case 4:
                      cdsuit = "Clubs ";
                      break;
              }
              string card = cdvalue + " of " + cdsuit;
              return card;// returns a string in the form of "value of suit"`
          }
      }
      
      public class Deck
      {
          private Random rng = new Random(); //Random object
          private Card[] deck;
      
          public Deck()
          {
              deck = new Card[52];//creates array of 52 elements
              int l = 0;
              for (int i = 1; i <= 13; i++)//loops to create cards 
              {
                  for (int j = 1; j <= 4; j++)
                  {
                      deck[l++] = new Card(i, j); // populates the array with all 52 cards
                  }
              }
          }
      
          public string deal(int number)//parameter received from user
          {
              string[] cards = new string[number];//creates an array to contain dealt card objects
              for (int num = 0; num < number; num++) // determines the amount of cards to be dealt
              {
                  int Rndm = rng.Next(deck.Length);
                  cards[num] = deck[Rndm].ToString();//fills the card array with randomly dealt cards from the deck
              }
              string dealt = string.Join(" ", cards); // turns the card array into a single string of the cards dealt
              return dealt;//returns the cards dealt
          }
      }
      

      唯一的另一个问题是您的发牌代码会产生重​​复的牌。您可能需要为此做点什么。


      如果我编写这个代码,我会这样做:

      public class Card
      {
          private int value;
          private int suit;
          public Card(int ranvalue, int ransuit)
          {
              value = ranvalue;
              suit = ransuit;
          }
          public override string ToString()
          {
              var values = new []
              {
                  "ace", "two", "three", "four", "five", "six", "seven",
                  "eight", "nine", "ten", "jack", "queen", "king"
              };
              var suits = new []
              {
                  "Hearts", "Spades", "Diamonds", "Clubs"
              };
              return String.Format("{0} of {1}", values[value - 1], suits[suit - 1]);
          }
      }
      
      public class Deck
      {
          private Random rng = new Random();
          private Card[] deck;
      
          public Deck()
          {
              deck =
              (
                  from value in Enumerable.Range(1, 13)
                  from suit in Enumerable.Range(1, 4)
                  select new Card(value, suit)
              ).ToArray();
          }
      
          public string deal(int number)
          {
              string dealt = string.Join(" ", deck.OrderBy(x => rng.Next()).Take(number));
              return dealt;
          }
      }
      

      这解决了重复卡问题。

      【讨论】:

        猜你喜欢
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        相关资源
        最近更新 更多