|
Программирование >> Унарные и бинарные операторы
Карты 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 не создали.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.094
При копировании материалов приветствуются ссылки. |