2015-10-23 2 views
-3

Я начинаю изучать Coder для C# для своего класса, и у меня проблемы с практикой, когда мы должны сделать колоду карт и разобраться с ними.Почему мой массив карточек пуст?

Нам нужно создать класс, который создает карты, получая параметры из другого класса через конструктор. Затем используйте эти значения в методе Tostring, чтобы установить значение и порядок этих карт с операторами switch и вернуть карту. Во втором классе мы заполняем массив карточками и вызываем метод Tostring в методе Dealing, чтобы случайным образом генерировать заданное пользователем количество карт, вытаскивая их из массива.

Проблема заключается в том, что мой массив не заполняется. Я попытался передать части массива 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); 

ответ

0

Ваш код очень близок к тому, чтобы быть верным. Кажется, у вас непонимание, когда использовать 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; 
    } 
} 

Это устраняет проблему дубликат карты.

+0

Спасибо за помощь –

1

В вашем классе карты есть переменные value и suit помечены как static.

private static int value; 
private static int suit; 

Поскольку эти две переменные являются статическими, ссылка на эти переменные будет поддерживаться через экземпляры объектов Карты.Это означает, что каждый раз, когда вы создаете новый объект Card, вы непреднамеренно обновляете все другие объекты карты value и suit переменные с тем же значением. Итак, всякий раз, когда вы получаете экземпляр Карты, это будет та же самая карта, что и все другие экземпляры (последняя созданная Карта).

Удалите статическое ключевое слово из этих объявлений, и вы должны быть в порядке.

Кроме того, я хотел бы предложить чтение на статичном более ознакомиться с его использованием: Static keyword in c#

+0

Спасибо за помощь –

Смежные вопросы