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

Пример карточной игры

Рассмотрим еще один, последний, пример использования перечисляемых типов данных. Вспомним, что в программе CARDS, созданной нами, использовалась груп- па констант типа const int, предназначенных для представления карточных мастей:

const int clubs = 0; const int diamonds = 1; const int hearts = 2; const int spades = 3;

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

// cardenum.cpp

// карточная игра с использованием перечислений

#include <iostream>

using namespace std;

const int jack = 11;              // именованные достоинства карт

const int queen = 12;

const int king = 13;

const int ace = 14;

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

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

struct card

{

  int number;                     // достоинство карты

  Suit suit;                      // масть

};

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

int main()

{

  card temp, chosen, prize;       // определение карт

  int position;

  card card1 = { 7, clubs };      // инициализация card1

  cout << "Карта 1: 7 треф\n";

  card card2 = { jack, hearts };  // инициализация card2

  cout << "Карта 2: валет червей\n";

  card card3 = { ace, spades };   // инициализация card3

  cout << "Карта 3: туз пик\n";

  prize = card3;                  // запоминаем карту 3

  cout << "Меняем местами карту 1 и карту 3\n";

  temp = card3; card3 = card1; card1 = temp;

  cout << "Меняем местами карту 2 и карту 3\n";

  temp = card3; card3 = card2; card2 = temp;

  cout << "Меняем местами карту 1 и карту 2\n";

  temp = card2; card2 = card1; card1 = temp;

  cout << "На какой позиции (1,2 или 3) теперь туз пик? ";

  cin >> position;

  switch (position)

  {

    case 1: chosen = card1; break;

    case 2: chosen = card2; break;

    case 3: chosen = card3; break;

  }

  if( chosen.number == prize.number && // сравнение карт

  chosen.suit == prize.suit)

    cout << "Правильно! Вы выиграли!\n";

  else

    cout << "Неверно. Вы проиграли.\n ";

  return 0;

}

 

Мы заменили серию констант, обозначающих масти, на перечисляемый тип:

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

Такой подход упрощает использование констант, поскольку нам известны все возможные значения мастей, и попытка использования некорректного зна- чения, например

card1.suit = 5;

вызовет предупреждающее сообщение от компилятора.

Задание целых значений для перечисляемых констант

Как мы говорили, первой из перечисляемых констант соответствует целое значе- ние, равное 0, второй — значение, равное 1, и т. д. Для того чтобы изменить зна- чение, с которого начинается нумерация, можно с помощью операции присваи- вания задать это значение первой из перечисляемых констант:

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

В этом случае следующим по списку константам будут соответствовать чис- ла 2, 3 и 4 соответственно. Фактически мы можем изменить величину целого числа, соответствующего любому элементу списка, применив к нему операцию присваивания, как это было показано выше.

 

16