Простые концепции классов в C ++ (карты в колоде) - PullRequest
0 голосов
/ 30 сентября 2010

Классы смущают меня! Для этого конкретного задания мы должны сделать классическую программу «Карты в колоде». Мы должны сделать два класса, один называется «Карта», а другой - «Палуба». Сейчас я сделал большую часть этого, но концепция, кажется, ускользает от меня.

Когда мы вызываем конструктор по умолчанию для класса Card, все 52 карты должны быть созданы так, чтобы класс Deck мог использовать эти объекты и ... хорошо создать колоду! Теперь я посетил сеанс с нашей TA, и он подчеркнул тот факт, что конструктор по умолчанию должен инициализировать значения, в то время как класс Deck берет эти объекты и проходит по ним циклически, чтобы использовать функцию, которая присваивает реальные значения карт объектам Card.

Мой вопрос таков: каков наилучший подход для создания этих объектов, чтобы колода могла ссылаться на них? Моя идея сейчас состоит в том, чтобы создать фиксированный массив с именем initialCard [4] [13]. Оттуда класс Deck выберет значение - скажем, «initialCard [0] [0]» и назначит его на туз пик только из строки и столбца двумерного массива. Тем не менее, мой ТА продолжает говорить «создай массив объектов Card». Что он мог этим сказать? Я немного понимаю, но я просто не уверен ... у кого-нибудь есть идеи? Спасибо!

Может быть, это поможет; прямо со страницы задания:

Класс вашей карты должен иметь публичные функции получения и установки для обе эти переменные (getValue, setValue и т. д.), а также функция, которая будет возвращать к-строковое представление карты. (Вы если хотите, можете вызвать его в CString.) следующим образом:

void toCString (char cardString []) INPUT: массив символов для хранения выходной OUTPUT: NONE Эта функция должна возвращать символьную строку представляющий объект карты. Эта строка должна иметь следующее Форма: два символа, за которыми следует третий нулевой байт. Первый персонаж представляет костюм; вторая представляет ценность. Костюмы должны быть «S», «H», «C» или «D» для пиков, сердец,

клубы, бриллианты. Второй символ представляет значение: «A» для Ace, 2-9 для пронумерованных карт, «T» для 10, «J» для Джека, «Q» для Королевы »,« K » для короля. Несколько примеров: 2 пики = 'S2' 10 червей = 'HT' Джек бриллиантов = 'DJ' Королева клубов = 'CQ' Пиковый туз = 'SA' и т. д.

В дополнение к этому у вас должен быть как минимум конструктор по умолчанию для инициализации значений. Вы можете создавать другие конструкторы (возможно, тот, который инициализирует карту из ее C-строки представление?) но это не обязательно.

Класс колоды: В дополнение к классу вашей карты, вам нужно будет создать Класс колоды для инкапсуляции всех ваших карточных объектов. В этом объекте вы должен иметь закрытый член многомерного массива (размером SUITS ЦЕННОСТИ) объектов Вашей Карты. Когда объект Deck создан, вы он должен инициализировать многомерный массив карт. Карта костюмы представлены перечислимым типом; значения карты представлен целым числом от 1 до 13 (1 - туз, 2-10 - пронумерованы значения, 11 - это Джек, 12 - это Королева, а 13 - Король).

Ваш конструктор должен перебрать многомерный массив и инициализировать все значения, чтобы полная колода карт представлена.

Ответы [ 4 ]

2 голосов
/ 30 сентября 2010

Не похоже, что вы получаете лучший совет.

Всегда чище построить объект в действительно правильном состоянии.Таким образом, вместо создания по умолчанию карточек с бессмысленным значением и последующего заполнения, составьте их с правильным значением.Это можно сделать с помощью vector, который имеет большинство преимуществ массива.

Таким образом, вы бы получили

class deck {
    std::vector< Card > cards;
    ...
    deck() {
        // no cards yet at this point
        for ( size_t i = 0; i < 52; ++ i ) {
            cards.push_back( Card( i ) );
        }
        // now array is valid
        ...

Избегайте массивов классов в стиле C с нетривиальнымиконструкторы.

1 голос
/ 30 сентября 2010

Всегда есть сотни способов что-то сделать. Что касается меня, когда я создаю классы и структуру своей программы, я всегда думаю, как вещи связаны друг с другом.

В вашей задаче, Карты в колоде, указана связь. Каждый объект карты принадлежит колоде. Я бы начал с создания класса Card, поскольку он не имеет ничего ниже, чем класс Deck. Похоже, вы зашли так далеко.

Я бы разработал класс Card для описания только карты, и ничего больше. Значение и костюм. В классе Deck у меня будет приватная переменная, содержащая массив карт. В конструкторе классов Deck я бы создал 52 карты. Если вы хотите получить фантазию, используйте список, а не массив, чтобы вы могли добавить столько карт, сколько захотите. Не все карточные игры используют 52 карты в колоде.

После создания колоды все ее методы получат доступ к массиву карт.

0 голосов
/ 30 сентября 2010

Подумайте об использовании контейнеров STL

class deck{
   private:
       std::vector<Card>;
       int card_pointer; //points to the element in the vector that is the "top" card in the deck
   public:
       shuffle_cards();//shuffles the deck
       deal_a_card(); //deals out one card and increments card_pointer

       deck();//initialize the deck in here and set card_pointer to 0

       ~deck();
};

Карта может быть целым числом от 1 до 52 для представления всех карт.Нет необходимости в двухмерном массиве.

0 голосов
/ 30 сентября 2010
Class Deck {
private:
  Card cardArray[52];
public:
  Card* getCard(int n) { ... };
    ...

Массив объектов Card.

Deck::Deck() {
  for (int i=0;i<52;i++) {
    cardArray[i].setValue(i);
  }
}

Назначение каждому значению.

Simple

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