ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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++. Мы рассмотрим и другие примеры далее.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
