ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 7) онлайн

Массивы карт

Вот другой, довольно длинный, пример массива объектов. Вы, конечно, помните пример CARDOBJ из главы 6. Мы воспользуемся классом card из этого примера и определим массив из 52 объектов этого класса, создав таким образом колоду карт. Вот листинг программы CARDARAY:

// cardaray.cpp // класс игральных карт #include  <iostream> #include  <cstdlib>

 

#include <ctime>

using namespace std;

enum Suit { clubs, diamonds, hearts, spades };

// от 2 до 10 обычные числа

const int jack = 11;

const int queen = 12;

const int king = 13;

const int ace = 14;

/////////////////////////////////////////////////////////////

class card

{

  private:

    int number;

    Suit suit;

  public:

    card ( ) // конструктор

      { }

    void set ( int n, Suit s ) // установка значения

      { suit = s; number = n; }

    void display ( );          // показ карты

};

/////////////////////////////////////////////////////////////

void card::display ( )

{

  if ( number >= 2 && number <= 10 )

    cout << number;

  else

  {

    switch ( number )

    {

      case jack: cout << 'J'; break;

      case queen: cout << 'Q'; break;

      case king: cout << 'K'; break;

      case ace: cout << 'A'; break;

    }

  }

  switch ( suit )

  {

    case clubs: cout << static_cast<char>( 5 ); break;

    case diamonds: cout << static_cast<char>( 4 ); break;

    case hearts: cout << static_cast<char>( 3 ); break;

    case spades: cout << static_cast<char>( 6 ); break;

  }

}

/////////////////////////////////////////////////////////////

int main ( )

{

  card deck [ 52 ];

  int j;

  cout << endl;

  for ( j = 0; j < 52; j++ )   // создаем упорядоченную колоду карт

  {

    int num = ( j % 13 ) + 2;

    Suit su = Suit ( j / 13 );

    deck [ j ].set ( num, su );

  }

// показываем исходную колоду

  cout << "Исходная колода:\n";

  for ( j = 0; j < 52; j++ )

  {

    deck [ j ].display ( );

    cout << "  ";

    if ( !( ( j + 1 ) % 13 ) ) // начинаем новую строку после каждой 13-й карты

      cout << endl;

  }

  srand ( time ( NULL ) );     // инициализируем генератор случайных чисел

  for ( j = 0; j < 52; j++ )

  {

    int k = rand ( ) % 52;     // выбираем случайную карту

    card temp = deck [ j ];    // и меняем ее с текущей

    deck [ j ] = deck [ k ];

    deck [ k ] = temp;

  }

  // показываем перемешанную колоду

  cout << "\nПеремешанная колода:\n";

  for ( j = 0; j < 52; j++ )

  {

    deck [ j ].display ( );

    cout << "  ";

    if ( !( ( j + 1 ) % 13 ) ) // начинаем новую строку после каждой 13-й карты

      cout << endl;

  }

  return 0;

}

 

Теперь, раз уж мы создали колоду карт, нам, наверное, стоит перемешать их. В программе мы показали карты, перемешали их и показали вновь. Для эконо- мии пространства мы использовали графические символы мастей: трефы, черви, пики и бубны. На рис. 7.8 показан вывод программы. В эту программу включе- ны несколько новых идей, давайте рассмотрим их по очереди.

Рис. 7.8. Вывод программы CARDARAY

Графические символы

Здесь мы использовали несколько специальных графических символов из кодов ASCII (см. приложение А «Таблица ASCII», список кодов ASCII.) В методе display() класса card мы использовали коды 5, 4, 3 и 6 для получения символов

треф, бубен, червей и пик соответственно. Преобразуя эти номера к типу char, как в следующей строке,

static_cast<char>( 5 )

мы сможем напечатать их в виде символов, а не номеров.

Колода карт

Массив обьектов, предназначенный для колоды карт, определен в строке

card deck [ 52 ];

Здесь создается массив, названный deck, содержащий 52 объекта типа card. Для вывода j карты колоды мы вызовем метод display();

deck [ j ].display ( );

Случайные номера

Всегда весело, но иногда даже полезно генерировать случайные числа. В этой программе мы используем их для перемешивания колоды. Для получения слу- чайных чисел необходимы два шага. Сначала генератор случайных чисел должен быть инициализирован, то есть должно быть задано начальное число. Для этого вызываем библиотечную функцию srand(). Эта функция использует в качест- ве начального числа системное время. Она требует двух заголовочных файлов: CSTDLIB и CTIME.

Здесь для генерации случайного числа мы вызвали библиотечную функцию rand(). Она возвращает случайное целое число. Для получения числа из диапа- зона от 0 до 51 мы применили операцию получения остатка от деления на 52 к результату функции rand().

int k = rand ( ) % 52;

Получившееся случайное число k затем используется как индекс для обмена двух карт. Мы выполняем цикл for, меняя местами карту, чей индекс принадле- жит картам от 0 до 51, с другой картой, чей индекс является случайным числом. Когда все 52 карты поменяются местами со случайной картой, колода будет счи- таться перемешанной. Эта программа может считаться основой для программ, реализующих карточные игры, но мы оставим детали для вас.

Массивы объектов широко используются в программировании на C++. Мы рассмотрим и другие примеры далее.

 

17