Структура программы игры

Разработка программной реализации данной игры, как и большинства других игр подобного типа, должна быть основана на использовании принципов наследования и полиморфизма ООП. В большинстве случаев при разработке объектно-ориентированной программной реализации оптимистических игр, где 2 и более предметов, бывает целесообразно применение принципов наследования и полиморфизма. Наследование обеспечивает тиражирование общих свойств игроков, которые передаются им из описания абстрактного игрока. Полиморфизм снабжает игроков виртуальным методом хода, который имеет одинаковый интерфейс, но реализует различные стратегии игроков. В данном случае основу информационной объектно-ориентированной структуры программы игры должны составить: абстрактный базовый класс Gambler, производные от него классы игроков PEN и MAN, а также класс кучи Heap, разделяемый игроками.

Абстрактный базовый класс Gambler предназначен для описания общих свойств и возможностей, которые присущи обоим игрокам. Его спецификацию образуют защищенные (protected) компонентные данные и общедоступные (public) компонентные методы их обработки. Это обеспечивает доступ к его компонентным данным только собственным компонентным методам производных классов игроков, но исключает любое несанкционированное обращение к ним из любых внешних функций программы игры.

В защищенную (protected) часть декларации базового класса Gambler целесообразно включить спецификацию целочисленных полей heap и limit, определяющих текущий размер кучи и предельное число предметов, которые можно выбирать из кучи за один ход. Кроме целочисленных компонентных данных в классе Gambler нужно предусмотреть указатель поля типа (char *) для идентификации символического имени игрока.

Обработку защищенных компонентных данных класса Gambler должны обеспечивать общедоступные (public) компонентные методы query (запрос) и move (ход) с целочисленным кодом возврата, значение у которого определяет текущий размер кучи.

Компонентный метод query предназначен для отображения в потоке стандартного вывода информационных запросов, сопровождающих ходы игроков по сценарию игры. Для отображения запроса может быть использована библиотечная функция printf системы программирования C/C++ или класс потока стандартного вывода cout.

Компонентный метод swap должен обеспечивать синхронизацию значения размера кучи в производных объектах класса Gambler.

Наиболее простым из них является класс кучи Heap. Он должен содержать закрытые (private) данные о размере кучи (int size), общедоступный (public) компонентный метод (get), конструктор класса полей данных. Он должен использоваться для хранения текущего размера кучи, который измеряется целочисленным значением. Компонентный метод get должен обеспечить доступ игроков к куче, чтобы извлечь требуемое число предметов или контролировать текущий размер кучи. Причем текущий размер кучи идентифицирует целочисленный код возврата метода get. Таким образом, общедоступный метод get позволяет оценить текущий размер кучи без извлечения предметов. Начальный размер кучи в поле должен устанавливаться конструктором класса Heap по значению своего целочисленного параметра.

Абстрактный класс Gambler предназначен для описания общих свойств и возможностей, которые присущи обоим участникам игры. Его спецификацию образуют защищенные (protected) компонентные данные и общедоступные (public) компонентные методы. В защищенной области спецификации класса Gambler должны быть декларированы 1 целочисленное поле (limit) и поля (heap и name). Компонентные данные в поле limit должны фиксировать ограничении по числу предметов, которые могут быть извлечены из кучи за 1 ход. Компонентное поле name предназначено для хранения указателя типа (char *) на символьное имя игрока. Компонентные данные в поле heap должны иметь тип указателя на объект класса Heap (Heap *), чтобы обеспечить адресацию кучи предметов участниками игры. Перечисленные поля компонентных данных должны инициализироваться конструктором класса Gambler, который должен иметь 3 аргумента соответствующих типов. Значения полей компонентных данных должны устанавливаться по аргументам конструктора через список инициализации. Конструктор должен быть специфицирован в общедоступной части класса Gambler. Кроме конструктора в общедоступной части класса Gambler должны быть определены 2 общедоступных компонентных метода query (запрос) и move (ход). Оба метода имеют целочисленный код возврата. Через query (запрос) передается текущий размер кучи. Класс Gambler специфицируется чистой виртуальной функцией с нулевым кодом, которая декларирует только внешний интерфейс хода игрока. В описании класса Gambler она должна быть объявлена следующим образом:

Пример 1

Class Gambler {

Public:

Virtual int move()=0;

};

Различные реализации метода хода должны быть даны в классах игроков PEN и MAN, которые являются производными от базового класса Gambler, учитывая особенности ходов человека и компьютера, соответственно. Компоненты базового абстрактного класса Gambler перегружают в виртуальную функцию хода в каждом из производных классов конкретным кодом.

Рекомендуемая литература

1. Д. Кнут. Искусство программирования для ЭВМ, т.2 Получисленные алгоритмы - М, Мир, 1977 г.

2. П. Лукас. C++ под рукой - Киев, НИПФ "ДиаСофт", 1993 г.


 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: