ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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. Однако, как мы увидим позже, данная проблема разрешима с помощью пе- регрузки операций.

 

11