Программирование >>  Унарные и бинарные операторы 

1 ... 15 16 17 [ 18 ] 19 20 21 ... 37


Карты 135

Для И1ры В козла нужны две пары игроков, то есть каждому достанется по девять карт. Программа, раздающая карты, показана в листинге 7.6.

Листинг 7.6

#include <iostreani> #include <deque> include <algonthni> #include play.h using namespace std; #define NOFP 4 #define NOFC 9 int fnain(){

player p[NOFP];

deck d;

d.iniO;

forCint i=0;i<NOFP;i++){ p[i].ini():

forCint j=0;j<NOFC;j++) p[i].add(d.get());

forCint i=0;i<NOFP;1++) p[i].show();

В .этой npoipaMMC описания объектов card, deck и player помещены в файл play.h и вюшчаются в текст директивой linclude. Далее директивы #define задают две константы; NOFP - число игроков и NOFC - число карт у каждого игрока.

Выполняемые программой действия крайне просты. С!!ачала создаются массив игроков (р1 ауег p[NOFP];) и колода (deck. d;). Затем в колоду добавляются карты, и она тасуется. Все это делает функция d.iniС). После .этого карты сдаются игрокам. Делают это два цикла for(). Во внешнем цикле forCint i=0;i<NOFP;i++){} функция pCi ]. ini С) отнимает карты у каждого игрока, если они у пего остались от прежней игры. Далее цикл forCint j=0;j<NOFC:j++) p[i].add(d.getC)) вытаскивает из колоды NOFC карт подряд и передает их одну за другой игрок>

под номером i. Очередная карта вытаскивается из колоды функцией d.getC) и передается i-му игроку функцией р[ i ]. add С). В констру кции р[ i ]. addC d. get С)) нет ничего страшного. Ведь функция p[i].addC) принимает объект типа card, а функция d.getC) возвращает объект типа card. Так что d.getC) можно считать неким объектом типа card, передаваемым функции p[i ] .addC) в качестве аргумента.

Заверп1ается наша программа выводом на экран карт, оказавшихся у игроков. Деластся это в цикле:

forCint i=0;i<NOFP:i++)p[i].showC):

В этом разделе мы успели только сдать карты игрокам. Читателю было бы крайне полезно научить программу какой-нибудь примитивной игре (например, тому же козлу ). Освоить С++ можно, только самостоятельно размышляя над устройством и взаимодействием объектов, а затем пытаясь воплотить эти мысли в работающей програ.мме.

Подумаем вместе, какие объекты должны быть доступны ифоку (объекту типа player). Прежде всего, это текущая взятка, количество карт в которой колеблется от О (первый ход) до 3 (игрок кладет последнюю карту). Наверное, нужно создать класс trick (в.зятка) и передавать соответствующий объект игрокам для записи в него очередного хода. Чтобы пе запутаться, лучше создать сначала игрока, знающего только текущую взятку. Пусть он тупо ходит в масть , не думая о числе набранных очков.

Обучившись примитивной игре по правилам , можно переходить к определенной стратегии (если взятка наша , кладем карту с максимальным числом очков и т. д.). Такая игра уже требует знания ценности карт, а также предыдущих взяток. Видимо, придется создать еще один объект, храпяп1ий прошлые Взятки и подсчитывающий очки после завершения



партии. При .этом нужно позаботиться о том, чтобы игроки даже в принципе не смогли подглядеть чужие карты. Тогда можно устроить конкурс на лучшую пару игроков (для одной пары создается класс playerl, для другой - р1ауег2). Описания (классы) соревнующихся игроков можно включить в программу директивой #i ncl ude, а победу присуждать тем, кто чаще выигрывает.

ГЛАВА 8 Рождение и смерть объектов




Богатые и бедные классы

в начале предыдущей главы мы сначала создавали объект а типа myclock, азатем переводили его стрелки с помощью собстветюй функции void clocksetCint h. int m.int s), хотя нам уже известно, что начальное состояние стандартных объектов С++, таких, нанример, как string, можно задать при объявлении: string sCMAMA ):

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

myclock с1(11.0.0):

Собственные функции в этом классе для краткости только объявлены; чтобы класс заработал, нужно определить функции, как в главе 7 (см. листинг 7.1).

Листинг 8.1

class myclock{ public:

myclockCint h.int m.int s){ sec=s: min=:hour=h:

void dispO:

void clocksetCint h.int m.int s):

void tickO:

private:

Обратите впимаппе на другой включаемый файл myclockl.h, содержащий новое олрсдсление класса с конструктором myclock (int h.int m.int s){}.

НапомЕ1ю, что С++ разрешает использовать несколько функций с одинаковыми именами - в том случае, когда список параметров позволяет отличить одну функцию от другой (см. раздел Функции-тезки в главе 5).

void swO:

int hour: int min: int sec: }:

С гаким определением класса myclock npoi-рамма из главы 7 (см. листинг 7.2) может быть переписана так, как показано в лисгинге 8.2.

Листинг 8.2

#include <iostream> #include myclockl.h using namespace std: int main(){ myclock a(10.59.30): for(int i=0; i<1000: i++){

a.tickO:

a.dispO:

return 0: }

Ho стоит объявить переменную типа myclock по старинке (myclock а:), и компилятор сообщит об опшбке:

по matching function for call to myclock;:rayclock () В этом сообщении компилятор говорит, что не может вызвать функцию rayclockO, описанную в классе myclock, то есть не может вызвать конструктор. Причина сообщения понятна: у нас есть конструктор, принимающий три аргумента, а при объявлении (щус1оск а;) должен вызываться конструктор, Boo6nie не имеющий аргументов, а мы такой euie не создали.



1 ... 15 16 17 [ 18 ] 19 20 21 ... 37

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.094
При копировании материалов приветствуются ссылки.
Яндекс.Метрика