ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 треф
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
