ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 4) онлайн
Пример карточной игры
Давайте рассмотрим еще один пример. В нем с помощью структуры будет соз- дана модель игральной карты. Эта программа имитирует действия уличного игрока. Игрок показывает вам три карты, перемешивает их и раскладывает. Если вам удастся угадать, в какой последовательности разложены карты, то вы выиграли. Все происходит у вас на виду, но игрок мешает карты настолько бы- стро и умело, что вы путаетесь в расположении карт и, как правило, проигрыва- ете свою ставку.
Структура, хранящая информацию об игральной карте, выглядит так:
struct card {
int number; int suit;
};
Эта структура содержит два поля, number и suit, предназначенных для хране- ния соответственно достоинства карты и ее масти. Достоинство карты определя- ется числом от 2 до 14, где числа 11, 12, 13 и 14 означают соответственно валета, даму, короля и туза. Масть карты — число от 0 до 3, где 0 означает трефовую масть, 1 — бубновую, 2 — червовую, 3 — пиковую.
Листинг программы CARDS выглядит следующим образом:
// cards.cpp
// представление игральных карт при помощи структуры
#include <iostream>
using namespace std;
const int clubs = 0; // масти
const int diamonds = 1;
const int hearts = 2;
const int spades = 3;
const int jack = 11; // достоинства карт
const int queen = 12;
const int king = 13;
const int ace = 14;
//////////////////////////////////////////////////////////
struct card
{
int number; // достоинство
int suit; // масть
};
//////////////////////////////////////////////////////////
int main()
{
card temp,chosen,prize; // три карты
int position;
card card1 = { 7, clubs }; // инициализация карты 1
cout << "Карта 1: 7 треф\n";
card card2 = { jack, hearts }; // инициализация карты 2
cout << "карта 2: валет червей\n";
card card3 = { ace, spades }; // инициализация карты 3
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;
}
Вот пример возможного взаимодействия с программой:
// вывод программы Карта 1: 7 треф Карта 2: валет червей Карта 3: туз пик
Меняем местами карту 1 и карту 3
Меняем местами карту 2 и карту 3
Меняем местами карту 1 и карту 2
На какой позиции (1.2 или 3) теперь туз пик? 3
Неверно. Вы проиграли.
В данном случае незадачливый игрок выбрал неверную карту (правильным ответом было число 2).
Программа начинается с объявления нескольких переменных типа const int, предназначенных для хранения величин, соответствующих четырем мастям и четырем достоинствам, имеющим словесное (нецифровое) название. В данной программе используются не все из объявленных переменных; «лишние» объяв- ления сделаны в целях сохранения общности алгоритма. Далее в программе оп- ределяется структура card и три неинициализируемые структурные переменные temp, chosen и prize. Позже определяются и инициализируются еще три струк- турные переменные: card1, card2 и card3, играющие роль трех карт, предназна- ченных для угадывания. Информация об этих картах выводится игроку на эк- ран. Далее одна из карт запоминается с помощью переменной prize, и эту карту будет предложено угадать игроку в конце игры.
Теперь программа перемешивает карты. Она меняет местами первую и третью карты, затем вторую и третью карты, и наконец, первую и вторую карты. При этом программа сообщает игроку обо всех перестановках (если такой вариант
игры покажется вам слишком простым, можете добавить в программу еще не- сколько операций по перемешиванию карт. Кроме того, можно усложнить пра- вила игры, ограничив время, в течение которого сообщение о перестановке карт будет присутствовать на экране).
Программа спрашивает пользователя, где находится одна из карт. Информа- ция о карте, находящейся в выбранной позиции, записывается в переменную chosen, значение которой сравнивается со значением переменной prize. Если эти значения совпадают, то игрок выигрывает; в противном случае игрок считается проигравшим.
Обратите внимание на то, насколько простой оказывается реализация пере- мешивания карт:
temp = card3; card3 = card2; card2 = temp;
Благодаря возможности выполнения операции присваивания над структур- ными переменными процесс перемешивания карт в программе очень похож на аналогичный процесс в реальной жизни.
К сожалению, сравнивать между собой структурные переменные, как и скла- дывать их друг с другом, нельзя. Конструкция
if ( chosen == prize ) // некорректно
недопустима потому, что операции == ничего не известно о переменных типа card. Однако, как мы увидим позже, данная проблема разрешима с помощью пе- регрузки операций.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
