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

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

В качестве примера моделирования объектами реально существующего мира рассмотрим модификацию программы CARDS, созданную в главе 4. В новой ее версии мы будем использовать объекты. Никаких дополнительных действий в программу мы вводить не будем, но сохраним практически все основные возмож- ности старой версии.

Как и программа CARDS, ее версия CARDOBJ создает три карты фиксированной масти и достоинства, «перемешивает» их, раскладывает и предлагает вам уга- дать их очередность. Разница между программами состоит лишь в том, что каж- дая карта представлена объектом класса card.

// cardobj.cpp

// игральные карты в качестве объектов

#include <iostream>

using namespace std;

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

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 ()                  // конструктор без аргументов

      { }

                   // конструктор с двумя аргументами

    card (int n, Suit s) : number(n), suit(s)

      { }

    void display();          // вывод карты на экран

    bool isEqual(card);      // результат сравнения карт

};

//--------------------------------------------------------

void card::display()         // вывод карты на экран

{

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

    cout << number ;

  else

    switch(number)

    {

      case jack:   cout << "Валет ";  break;

      case queen:  cout << "Дама ";   break;

      case king:   cout << "Король "; break;

      case ace:    cout << "Туз ";    break;

    }

  switch(suit)

  {

    case clubs:     cout << "треф"   ;break;

    case diamonds:  cout << "бубен"  ;break;

    case hearts:    cout << "червей" ;break;

    case spades:    cout << "пик"    ;break;

  }

}

//--------------------------------------------------------

bool card::isEqual(card c2)  // сравнение двух карт

{

  return (number==c2.number && suit==c2.suit)? true : false;

}

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

int main()

{

  card temp, chosen, prize;  // 3 карты

  int position;

  card card1(7, clubs);      // определение и инициализация card1

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

  card1.display();           // вывод card1

  card card2(jack, hearts);  // определение и инициализация card2

  cout <<  "\nКарта 2: ";

  card2.display();           // вывод card2

  card card3(ace, spades);   // определение и инициализация card3

  cout <<  "\nКарта 3: ";

  card3.display();           // вывод card3

  prize = card3;             // карту prize будет необходимо угадать

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

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

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

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

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

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

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

  prize.display();           // угадываемая карта

  cout << "?";

  cin >> position;           // ввод позиции игроком

  switch (position)

  {                          // chosen – карта на позиции,

    case 1:chosen = card1; break; // выбранной игроком

    case 2:chosen = card2; break;

    case 3:chosen = card3; break;

  }

  if(chosen.isEqual(prize))       // сравнение карт

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

  else

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

   cout << " Вы выбрали карту ";

  chosen.display();               // вывод выбранной карты

  cout << endl;

  return 0;

}

 

Класс card содержит два конструктора. Первый из них не имеет аргументов и используется функцией main() для создания объектов temp, chosen и prize, ко- торые не инициализируются при создании. Другой конструктор имеет два аргу- мента, и с его помощью создаются объекты card1, card2 и card3, инициализиру- емые определенными значениями. Кроме конструкторов, класс card содержит два метода, оба из которых определены вне класса.

Функция display() не имеет аргументов; ее задача заключается в отображении на экране параметров той карты, к которой она применяется. Так, оператор

chosen, display();

отображает карту, которую ввел пользователь.

Функция isEqual() проверяет, совпадает ли карта, введенная пользователем, с той, которая передается функции в качестве аргумента. Для сравнения ис- пользуется условная операция. Функция могла бы быть реализована с помощью ветвления if...else:

if(number==c2.number && suit==c2.suit)

  return true; else   return false;

однако условная операция обеспечивает более краткую форму записи.

Название c2 аргумента функции isEqual() указывает на то, что сравниваются две карты: первая из карт представлена объектом, методом которой является функция isEqual(). Выражение

if ( chosen.isEqual(prize) )

в функции main() сравнивает карту chosen с картой prize.

Если игрок не угадал карту, то результат работы программы будет приблизи- тельно таким:

Карта 1: 7 треф

Карта 2: валет червей

Карта 3: туз пик

Меняем местами карты 1 и 3j

Меняем местами карты 2 и 3j

Меняем местами карты 1 и 2j

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

Неверно. Вы проиграли. Вы выбрали карту 7 треф

 

19