logo
Харви Дейтел, Пол Дейтел Как программировать на С++ / 02-Deitel-Стр-115-214

3.9. Пример: азартная игра

Одной из наиболее популярных азартных игр считается игра в кости, известная как «крепс», в которую играют и в казино, и в глухих закоулках по всему миру. Правила игры просты:

Игрок бросает две кости. Каждая кость имеет шесть граней. Эти грани помечены как 1, 2, 3, 4, 5 и 6. После броска вычисляется сумма цифр двух верхних граней. Если сумма после первого броска равна 7 или 11, игрок выиграл. Если после первого броска сумма равна 2, 3 или 12 (это называется «крепс»), игрок проигрывает (т. e. выигрывает «банк»). Если после первого броска сумма равна 4, 5, 6, 8, 9 или 10, то эта сумма становится «очками» игрока. Чтобы выиграть, игрок должен продолжать бросать кости до тех пор, пока не выпадет сумма, равная его очкам. Игрок проигрывает, если во время этих бросков ему выпадет сумма 7.

Программа на рис. 3.10 моделирует игру крепс. На рис 3.11 показано несколько примеров ее выполнения.

Заметим, что игрок должен бросать каждый раз по две кости. Мы описали функцию rollDice, которая имитирует бросок костей, подсчитывает выпав­шую сумму и печатает ее. Функция rollDice описана один раз, но она вы­зывается из двух мест программы. Интересно, что rollDice не требует аргу­ментов, поэтому в списке параметров мы указали void. Функция rollDice возвращает сумму двух костей, возвращаемый тип int указывается в заго­ловочном файле.

Игра разумно запутана. Игрок может выиграть или проиграть после пер­вого же броска или после серии бросков. Переменная gameStatus использу­ется для запоминания состояния игры. Переменная gameStatus объявлена как имеющая тип с именем Status. Строка

enum Status { CONTINUE, WON, LOST );

объявляет определенный пользователем тип, называемый перечислимым (enu-meration). Перечислимый тип, вводимый ключевым словом enum перед именем

196