Иструментарий создания игровой логики
Проанализированы возможности имеющихся средств декларативного программирования применительно к созданию деловой логики казуальных игр. Разработано средство для создания деловой логики игр на платформе flash с учетом выполненного анализа....
Gespeichert in:
| Veröffentlicht in: | Проблеми програмування |
|---|---|
| Datum: | 2012 |
| 1. Verfasser: | |
| Sprache: | Russisch |
| Veröffentlicht: |
Інститут програмних систем НАН України
2012
|
| Schlagworte: | |
| Online Zugang: | https://nasplib.isofts.kiev.ua/handle/123456789/86640 |
| Tags: |
Tag hinzufügen
Keine Tags, Fügen Sie den ersten Tag hinzu!
|
| Назва журналу: | Digital Library of Periodicals of National Academy of Sciences of Ukraine |
| Zitieren: | Иструментарий создания игровой логики / В.В. Кожаев // Проблеми програмування. — 2012. — № 4. — С. 64-74. — Бібліогр.: 16 назв. — рос. |
Institution
Digital Library of Periodicals of National Academy of Sciences of Ukraine| _version_ | 1860003213265076224 |
|---|---|
| author | Кожаев, В.В. |
| author_facet | Кожаев, В.В. |
| citation_txt | Иструментарий создания игровой логики / В.В. Кожаев // Проблеми програмування. — 2012. — № 4. — С. 64-74. — Бібліогр.: 16 назв. — рос. |
| collection | DSpace DC |
| container_title | Проблеми програмування |
| description | Проанализированы возможности имеющихся средств декларативного программирования применительно к созданию деловой логики казуальных игр. Разработано средство для создания деловой логики игр на платформе flash с учетом выполненного анализа.
|
| first_indexed | 2025-12-07T16:37:03Z |
| fulltext |
Інструментальні засоби та середовища програмування
© В.В. Кожаев, 2012
64 ISSN 1727-4907. Проблеми програмування. 2012. № 4
УДК 681.3
В.В. Кожаев
ИСТРУМЕНТАРИЙ СОЗДАНИЯ ИГРОВОЙ ЛОГИКИ
Проанализированы возможности имеющихся средств декларативного программирования применитель-
но к созданию деловой логики казуальных игр. Разработано средство для создания деловой логики игр
на платформе flash с учетом выполненного анализа.
Введение
В последние несколько лет рынок
казуальных [1] игр испытывает бурное
развитие – конкуренция между производи-
телями игр растет, игры усложняются. В
частности, всё более сложными становятся
правила поведения игровых сущностей.
Задача программирования игры с актора-
ми, поведение которых подчинено опреде-
ленному набору правил и быстрое их из-
менение, является не тривиальной, осо-
бенно, если это нужно сделать за ограни-
ченное время. Это обуславливает необхо-
димость создания средств, для упрощения
программирования таких правил. К сожа-
лению, средства применяемые для задания
логики в промышленных программах, тре-
буют серьёзной доработки из-за специфи-
ки программирования игр. В данной статье
проанализированы существующие подхо-
ды к созданию деловой логики и их недос-
татки для разработки игр, а также предло-
жен подход позволяющий избавиться от
ряда недостатков присущих существую-
щим средствам.
Под бизнес логикой понимается
совокупность правил, принципов, зависи-
мостей поведения объектов предметной
области (области человеческой деятельно-
сти, которую система поддерживает). Ина-
че можно сказать, что бизнес-логика – это
реализация правил и ограничений автома-
тизируемых операций. Является синони-
мом термина "логика предметной области"
(англ. domain logic).
В практике программирования час-
то используется явное разделение про-
граммы на логическую и семантическую
части. Под логической частью програм-
мы будем понимать декларативный набор
правил, характеризующий поведение акто-
ра. Под семантической частью – реализа-
цию конкретных действий производимых
в процессе работы программы.
Языки, описывающие логическую
часть программы, называются языками
описания бизнес логики, языками описа-
ния предметной области (англ. Domain
Specific Language или DSL - языки)
Под игровой логикой будем пони-
мать деловую логику характерную для той
или иной игры: совокупность правил игры
и правил, задающих поведение акторов.
Следует отметить, что в понятие игровой
логики не содержит указаний на графиче-
скую составляющую конкретной игры, или
принятую в определенной игре модель
физических, или других процессов.
Движок (от англ. engine – мотор,
двигатель) – выделенная часть программ-
ного кода для реализации конкретной при-
кладной задачи – программа, часть про-
граммы, комплекс программ или библио-
тека, в зависимости от задачи и реализа-
ции. Как правило, прикладная часть выде-
ляется из программы для использования в
нескольких проектах и/или раздельной
разработки/тестирования. Применительно
к разработке игр существуют графические
(для создания графики), физические (мо-
делирование физических процессов), изо-
метрические (создание игр в изометриче-
ской проекции). Существуют так же движ-
ки более высокого уровня, представляю-
щие собой композицию нескольких низко-
уровневых движков, часто от разных про-
изводителей. По сути, движки этого типа
являются архитектурными каркасами, ко-
торые могут быть превращены в игру
только заданием игровой логики.
Под структурами, используемы-
ми для задания деловой логики, будем
понимать продукционные системы, конеч-
Інструментальні засоби та середовища програмування
65
ные автоматы, деревья поиска и другие
структуры данных, применяемые в про-
граммировании логики.
Как правило, для управления каж-
дой игровой сущностью не создается от-
дельного потока. Вместо этого, сущности
объединяются в списки и обрабатываются
последовательно. Цикл в течении итера-
ции которого обрабатывается такой список
называется игровым циклом, итерация это-
го цикла – тиком. Название "тик" обуслов-
лено тем, что между итерациями цикла
проходит фиксированный интервал време-
ни. Существуют игры как с несколькими
циклами и созданием отдельного потока
для каждого, так и одним игровым циклом.
1. Обзор существующих подходов
к программированию деловой
логики применительно к
разработке игр
В промышленном программирова-
нии используется множество подходов
позволяющих выделить декларативную и
семантическую части программы. Однако
большинство из них требуют существен-
ной адаптации для применения в разработ-
ке игр ввиду того, что производство игр
существенно отличается от разработки
коммерческого программного обеспечения
(подробнее см. [16]). Далее представлен
обзор некоторых из существующих подхо-
дов и указание их основных недостатков
применительно к разработке игр.
1.1. Использование систем, осно-
ванных на правилах. Для задания деловой
логики в промышленном программирова-
нии широко используются разнообразные
системы, основанные на правилах. В этих
системах правила задаются в виде структу-
ры "Если – то". Для описания правил обыч-
но используются DSL языки, которые мо-
гут быть как интерпретируемыми, так и
компилируемыми. Во втором случае пра-
вила компилируются непосредственно в
бинарный код или в байт-код, исполняемый
на данной платформе. В обоих случаях су-
ществует возможность комбинировать дек-
ларативные выражения на DSL – языках с
вызовами кода на входном для данной
платформы языке. В качестве примера сис-
тем созданных на платформе Java можно
привести Jess [2], Drools [3], Algernon [4],
JEOPS [5] и другие. К достоинствам дан-
ных систем относится большое количество
документации и мощные средства, предос-
тавляемые платформой.
Однако применительно к разработ-
ке игр данный подход имеет ряд сущест-
венных недостатков, одним из которых
является отсутствие единого стандарта для
DSL-языков. На сегодняшний день не су-
ществует системы портированной на все
популярные платформы. Поэтому, при
переносе игры, например, с платформы
Java на flash придется полностью перепи-
сывать логическую часть программы, либо
переносить на данную платформу выбран-
ную систему. Кроме того системы осно-
ванные на правилах, не позволяют сохра-
нять состояние актора, что неудобно, по-
скольку при таком подходе приходится
каждый раз анализировать большое коли-
чество правил, часть из которых являются
значимыми только в небольшой промежу-
ток времени. Использование систем с со-
хранением состояний позволяет избежать
анализа всего множества правил при каж-
дом обращении.
В настоящее время данные системы
не используются широко в создании игр, но
могут быть использованы после адаптации.
1.2. Использование универсаль-
ных интерпретируемых языков высоко-
го уровня. Для декларативного задания
игровой логики часто используются ин-
терпретируемые такие языки с динамиче-
ской типизацией, как JavaScript, Python,
Lua, причем особенно популярен послед-
ний. К достоинствам этих языков относят-
ся простота их использования и изменения
ввиду безтиповости. Одним из недостатков
данных языков является невысокая ско-
рость работы, другим – то что, возможно-
сти встраиваемых версий таких языков
весьма ограничены. Сложную систему,
используя их создать тяжело.
Данный подход используется в соз-
дании не казуальных игр, для задания ин-
терфейса пользователя, или логических
связок очень высокого уровня.
Інструментальні засоби та середовища програмування
66
1.3. Использование дополнитель-
ных языков программирования. Более
общим, чем предыдущий случай, является
подход, в котором деловую логику разра-
батывают на универсальном языке, отлич-
ном от принятого на данной платформе в
качестве основного, без использования
логического движка. Как правило, это ди-
намические или функциональные языки.
Для платформы "Java" такими языками
являются Clojure [6], Scala [7], Groovy [8] и
некоторые другие. Для платформы .net –
F# [9], Nemerle [10] и так далее. Про-
граммный код на этих языках компилиру-
ется непосредственно в байт–код испол-
няемый виртуальной машиной. Ввиду при-
сутствия в данных языках функционально-
го подхода и их высокоуровневости игро-
вую логику на них создавать много проще,
чем на языках, которые являются основ-
ными для той или иной платформы. Кроме
того, данный подход позволяет переносить
игровую логику с платформы на платфор-
му в случае, если язык создания логики
реализован на обеих платформах.
Недостаток данного подхода к раз-
работке игровой логики состоит во-
первых, в отсутствии реализаций данных
языков программирования для популярных
игровых платформ, в частности для плат-
формы flash. Другой проблемой является
малая распространенность указанных язы-
ков среди разработчиков игр ввиду слож-
ности указанных языков.
1.4. Использование мультиплат-
формных языков. При разработке игр (и
других приложений, предназначенных для
кроссплатформенного использования) яв-
ляется подход, при котором код пишется
на кросс-платформенном языке, либо при-
ложение, написанное для одной платфор-
мы, конвертируется для запуска на другой.
В качестве примера можно привести
язык HaXe [11] и технологию Adobe
Alchemy [12].
К недостаткам этого подхода отно-
сится то, что в различных языках про-
граммирования различными являются и
библиотеки программ. Библиотеки для
решения одной и той же задачи на разных
языках могут иметь совершенно разную
архитектуру, или вовсе отсутствовать.
Кроме того, указанные средства совер-
шенно не упрощают собственно разработ-
ку игровой логики. Язык "HaXe" является
универсальным, объектно-ориентирован-
ным языком и разработка игровой логики с
его использованием ничем не проще, чем с
использованием Java, C#, C++ или других
универсальных языков программирования
высокого уровня. Adobe Alchemy пред-
ставляет собой технологию преобразова-
ния кода программ написанных на С++ в
промежуточный байт-код AVM2 (вирту-
альная машина для выполнения flash –
приложений).
1.5. Создание деловой логики с
использованием автоматного програм-
мирования. Задачи программирования
деловой логики как задачи реализации си-
стем с сложным поведением можно ус-
пешно решать с помощью автоматного
программирования (Этот термин впервые
введен в работе [13]). При таком подходе
управляющая (логическая) часть програм-
мы реализуется в виде конечного автомата.
В процессе перехода между состояниями
производятся действия (так называемые
управляющие), влияющие на акторов или
систему в целом (которую можно рассмат-
ривать как частный случай актора) и таким
образом, осуществляется управление.
Можно выделить следующие виды
управляющих действий:
действие входа выполняется при
входе в состояние;
действие выхода, выполняется при
выходе из состояния;
действие ввода, которое выполняет-
ся в зависимости от данного состояния и
входного условия;
действие перехода, выполняемое
при выполнении определенного перехода.
Действие неизменного состояния,
выполняется в системах с дискретным
временем, когда ни одно из условий пере-
хода не выполняется и состояние остается
неизменным.
К достоинствам автоматного про-
граммирования относится следующее:
автомат, полученный при создании
деловой логики, является моделью про-
граммы. Таким образом, в отличие от тра-
диционных способов программирования
Інструментальні засоби та середовища програмування
67
собственно созданию программы предше-
ствует её проектирование;
графическая диаграмма переходов
конечного автомата является наглядным и
интуитивным средством проектирования.
(В ходе рассуждений часто используется
людьми без специального образования в
виде стрелочной схемы);
позволяет легко тестировать логи-
ку: измерить покрытие тестами, сгенери-
ровать виды тестов, создать прототип сис-
темы и так далее;
представление логической части
программы в виде автомата удобно для
строгого доказательства её коррекции;
DSL-языки, используемые при соз-
дании автоматов, удобно использовать для
частичной генерации семантического кода.
Основным недостатком автоматно-
го программирования является увеличение
времени разработки программы. Другими
словами, к разработке добавляется время
необходимое на оформление кода в авто-
матном стиле.
1.5.1. Способы описания структу-
ры конечного автомата. Существует
большое разнообразие средств позволяю-
щих реализовать автоматный подход (пе-
речисление всех их выходит за рамки дан-
ной статьи). Тем не менее, их можно раз-
делить по подходу к заданию структуры
конечного автомата на использующие для
описания структуры языки полные и не
полные по Тьюрингу соответственно.
В первой группе средств часто ис-
пользуются расширения функциональных
языков, а во второй – метаязыки на основе
XML. Однако это – не правило: существу-
ют реализации средств использующих для
описания конечного автомата универсаль-
ные, сильно типизированные языки, такие
как Java или С# равно как и метаязыки
самой причудливой формы.
В качестве полного по Тьюрингу
языка можно привести Язык ASML
(Abstract State Machine Language) [14],
который разработан компанией Microsoft в
качестве языка реализации управляемых
моделей. Является одной из реализаций
формализма абстрактных машин состоя-
ний, описанных в [7] в виде языка про-
граммирования. Это объектно-
ориентированный, динамический слабо
типизированный язык, по идеологии име-
ющий некоторое сходство с Python и
Visual Basic. Является .net языком и в этом
качестве имеет доступ к любому .net со-
вместимому коду и стандартным сервисам
.net framework. (существует несколько реа-
лизаций данного формализма в виде языка
программирования, эта выбрана ввиду
большей распространенности).
Основное предназначение языка
ASML – разработка выполняемых специ-
фикаций, другими словами разработка мо-
делей программ с целью изучения их по-
ведения и структуры.
Центральными понятиями данного
языка являются abstract state (абстрактное
состояние) и step.
Под абстрактным состоянием по-
нимают состояние модели системы, кото-
рое абстрагировано от несущественных
для моделируемых процессов деталей. В
языке программирования не существует
соответствующей структуры, это скорее
некая концепция всего языка: конкретные
состояния системы задаются в виде мно-
жества пар (имя переменной, значение).
Step – конструкция языка (в отли-
чие от первого понятия), предназначенная
для задания действий, которые произво-
дятся при переходах между состояниями.
В терминологии предлагаемой в ра-
боте [13], данный язык предназначен для
создания конечных автоматов с активными
переходами.
Типичным средством использую-
щим метаязык является UniMod [15].
Представляет так называемое Case-
средство реализованное в виде plug-in а
IDE Eclipse, который включает графиче-
ский редактор графов состояний, парсер
XML – языка описывающего деловую ло-
гику и генератор кода по созданной диа-
грамме состояний. В отличие от предыду-
щего, средство предназначено для реали-
зации автоматов с пассивными пере-
ходами. Прогрессивным является то, что
возможна кодогенерация на различных
языках программирования (доступны Java
и Simbean C). В настоящее время разра-
ботка и поддержка этого средства прекра-
щена, что естественно является серьезным
Інструментальні засоби та середовища програмування
68
аргументом против использования его в
разработке.
Достоинством языков полных по
Тьюрингу является то, что они являются
исполняемыми, то есть позволяют протес-
тировать программную модель без реали-
зации семантической части программы.
Однако, реализация полного по Тьюрингу
языка на конкретной платформе является
на порядок более сложной задачей, чем
создание парсера метаязыка. Поэтому, ес-
ли предполагается перенос логики на не-
сколько платформ целесообразно исполь-
зование именно метаязыков. С другой сто-
роны, использование метаязыков более
удобно при создании графических редак-
торов графа перехода состояний.
2. Описание реализованного сред-
ства автоматного программиро-
вания
Хотя автоматное программирование
широко используется при создании про-
мышленных программ, не существует
средства, которое повсеместно использо-
валось бы в производстве игр. В качестве
причины можно указать некоторую кон-
сервативность разработчиков игр, а тот
факт, что игры менее требовательны к от-
казоустойчивости по сравнению с про-
мышленными программами. Действитель-
но, в случае отказа программы управления
атомной электростанцией может случиться
техногенная катастрофа, при сбое про-
граммного обеспечения банка возникнут
ошибки в финансовых операциях – люди
не получат деньги. При ошибке же работы
игры катастрофы не произойдет – пользо-
ватель просто перезапустит программу.
Поэтому, в практике разработки игр доби-
ваются исправления лишь часто возни-
кающих сбоев.
Однако необходимость в создании
версий одной и той же игры для разных
платформ и все усложняющееся поведение
игровых сущностей обуславливают необ-
ходимость создания такого средства. Что-
бы восполнить этот пробел, автором было
разработано средство под названием
"casual intellect". Это средство создано на
платформе "flash" (виртуальная машина -
AVM2) с использованием языка програм-
мирования ActionScript 3.0.
При разработке поставлены сле-
дующие задачи:
средство предназначено для разра-
ботки игр с коротким сроком жизни. Это
означает, что время в течении которого
пользователи активно играют составляет
от одного до нескольких месяцев. Особые
требования в создании таких игр предъяв-
ляются к скорости разработки. Поэтому
средство должно быть интуитивно понят-
ным;
должна быть возможность создания
редактора графических диаграмм, визуа-
лизирующих игровую логику;
должно давать возможность задать
все типы управляющих реакций;
соответствовать принятой методо-
логии производства игр;
позволять генерацию программ-
много кода для разных платформ.
В результате было решено создать
архитектурный каркас для реализации ко-
нечных автоматов с активными перехода-
ми с метаязыком на базе XML. В термино-
логии [13], средство реализует процедур-
ное программирование с явным выделени-
ем состояний. Например, таких как робот.
Рис. 1. Диаграмма классов робота игр
2.1. Описание демонстрационной
программы. Положим, необходимо реа-
лизовать следующую игру. На игровом
поле стоит несколько башен стреляющих
по противнику. Ремонт башен после раз-
рушения, зарядку пушек и улучшение так-
тических характеристик башен производят
роботы, специализированные для этих
операций: роботы ремонтники, заряжаю-
щие и инженеры соответственно.
Силы противника состоят из назем-
ных и воздушных боевых единиц. Воз-
Інструментальні засоби та середовища програмування
69
душные подразделяются на бомбардиров-
щики и вертолеты, наземные – на танки и
картечницы. За каждый уничтоженный
робот противника игроку начисляются
очки, за которые можно построить новых
роботов. Цель игры – найти оптимальную
стратегию постройки роботов.
2.1.1. Поведение робота игрока.
Типы поведения роботов игрока можно
представить в виде диаграммы наследова-
ния (см. рис. 1). Как видно из диа-
граммы, тип "робот" является базовым
поведенческим типом для боевых роботов
и механиков.
Поведенческий тип "робот – меха-
ник" базовый для типов ремонтник, за-
рядчик и инженер.
Поведение роботов задается конеч-
ным автоматом с помощью управляющих
воздействий. Рассмотрим диаграмму со-
стояний графа управляющего роботом
(рис. 2). Изначально робот находится в
состоянии покоя, если возникает необхо
димость в обслуживании башни движется
Рис. 2. Диаграмма состояний робота – ме-
ханика
к ней, обслуживает и переходит в состоя-
ние покоя до тех пор, пока в нем не поя-
вится необходимость. Поскольку по робо-
ту ведется стрельба, рано или поздно на-
ступает момент, когда его жизненные ре-
сурсы исчерпываются и он переходит в
состояние агонии из которого следует пе-
реход в конечное состояние – смерть.
Спецификация языка UML не по-
зволяет раскрыть все особенности поведе-
ния роботов. Невозможно указать, что
управляющие воздействия при переходах
из состояния в состояние в общем случае
зависят не от выходного состояния I или
входного J, а от вектора (I,J) Кроме того,
отсутствует возможность наследования
автоматов и переопределения управляю-
щих воздействий без изменения графа пе-
реходов состояний. Разработанный DSL
язык имеет указанные возможности.
2.2. Описание реализованного
DSL языка. Поскольку разработанный
DSL язык является XML – языком его спе-
цификация задана в виде DTD – схемы
(см. Листинг 2.1.).
Проверка условий перехода, и пере-
ход в новое состояние (если соответст-
вующее условие выполняется) произво-
дится единожды за тик. При переходах
между состоянием над актором выполня-
ются соответствующие методы, реализо-
ванные на языке программирования яв-
ляющимся входным для данной платфор-
мы (ActionScript 3.0 в данной реализации).
Каждое состояние имеет методы,
<!element object_logic (consts?, states?)>
<element variables (varialble+)>
<!variable @name>
<!element states state+>
<!element state (rooles?,methods?,extends?)>
<!element rooles roole+>
<!element roole (condition, roole_methods?)>
<!condition #equation>
<!roole_methods method+>
<!extends #statename)> (methods_before?,methods_after?,methods_in_process?)>
<!methods_before method+>
<!methods_after method+>
<!methods_in_process method+>
<!method #methodname>
<!roolemethod method>
Листинг 2.1. XSD схема языка программирования
Інструментальні засоби та середовища програмування
70
выполняемые после входа в него актора,
перед выходом, и методами выполняемы-
ми если состояние актора не изменилось.
Эти методы задаются тегом methods кото-
рый может содержать вложенные теги
methods_before, «methods_after» и
«methods_in_process» для задания множе-
ства методов выполняемых перед входом в
состояние, перед выходом и если состоя-
ние не изменилось, соответственно.
Вышеописанные теги содержат в
себе один или несколько тегов «method»
для задания списков выполняемых мето-
дов.
Условия перехода из данного со-
стояния задаются с помощью тега «rools»,
который содержит в себе список правил
(«roole»). И тега «roole_methods», содер-
жащего методы выполняемые, если усло-
вие истинно. Правило состоит из условия
…
<states>
<state name="move_to_tower">
<!--секция задающая состояния в которые можно перейти из текущего-->
<usecases>
<!-- Cостояние зарядка -->
<usecase name="charging">
<roole> <!--Переход происходит, если выполняется условие-->
((not energyIsLow) and
(not needRepairTower))
or (goalIsGetted)
</roole>
<!--Перед переходом выполняются
управляющие воздействия-->
<methods>
<!--В частности endMoving-->
<method name="endMoving"/>
</methods>
</usecase>
<!--Состояние "агония"-->
<usecase name="agony">
<roole>
energyIsLow
</roole>
<methods>
<method name="showAnger"/>
</methods>
</usecase>
</usecases>
<!--Секция методов выполняющихся всегда-->
<state_methods>
<!--Перед входом в состояние-->
<methods_before>
<method name="beforeMoving"/>
</methods_before>
<!--Перед выходом-->
<methods_after>
<method name="afterMoving"/>
</methods_after>
<!--Каждый игровой тик, пока актор находится в состоянии-->
<methods_in_process>
<method name="move"/>
</methods_in_process>
</state_methods>
</state>
…
Листинг 2.2. Декларативное задание состояния «Движение к башне»
Інструментальні засоби та середовища програмування
71
перехода «condition» представляющих со-
бой логическое выражение с атомами –
функциями языка программирования, воз-
вращающими логическое значение. Вы-
числение этого выражения осуществляется
с помощью перевода в обратную польскую
запись.
При обработке состояния произво-
дится проход по списку, содержащемся в
«rools». Для каждого элемента «roole» оп-
ределяется истинно — ли условие перехо-
да содержащееся в condition. Если это так,
производится последовательное выполне-
ние методов содержащихся в элементе
«roole_methods». Затем выполняются ме-
тоды, содержащиеся в теге
«methods_after», который в свою очередь
содержится в теге «methods» текущего со-
стояния. После этого выполняются мето-
ды, содержащиеся в теге «methods-_before»
нового состояния.
Если ни одно из условий перехода
из данного состояния не является истин-
ным, выполняются методы, содержащиеся
в теге «methods_in_process» текущего со-
стояния.
В качестве примера рассмотрим ре-
ализацию состояния «Движение к башне»
показанном в фрагменте программного
кода 2.2.
Из данного состояния можно перей-
ти в состояние «обслуживание башни»,
либо в состояние «агония» если жизнен-
ные силы истощились. Переход происхо-
дит, если истинны логические выражения
заданные тегом rules. Перед переходом
выполняются управляющие воздействия с
именами «endMoving» в случае перехода в
состояние «обслуживание» или
"showAnger" если происходит переход в
состояние «Агония».
2.3. Спецификация методов – об-
работчиков. Одна и та же декларативная
часть программы может быть интерпрети-
рована по-разному, в зависимости от спо-
соба её обработки императивной частью.
В качестве примера рассмотрим реа-
лизацию поведения роботов механиков.
Данные роботы управляются одним авто-
матом, разнятся лишь управляющие воз-
действия. Так для робота – ремонтника в
состоянии «обслуживание башни» управ-
ляющим воздействием будет «ремонт». Для
робота – заряжающего «зарядка орудия», а
для робота – инженера – «улучшение».
В разработанном программном
средстве управляющие воздействия ассо-
циируются в императивном стиле, с по-
мощью входного языка программирования
ActionScript 3.0 (см. Листинг 2.3).
Листинг 2.3. Императивное задание методов
//Инициализируем обработчик состояний
var _statesProcessor:StatesProcessor;
_statesProcessor = StatesProcessor.statesProcessor;
//Создаем контейнер операций
var opContainer:OperationsContainer = new OperationsContainer();
//Ассоциируем итендификаторы управляющих воздействий с конкретными методами
opContainer.addFunction("finishMoving", _robotController.endMoveCondition);
opContainer.addFunction("move", _ robotController .move)
opContainer.addFunction("beforeMoving", _ robotController .beforeMoving)
opContainer.addFunction("afterMoving", _ robotController .afterMoving);
opContainer.addFunction("endWating", _ robotController .endWating);
opContainer.addFunction("movingIsFinished", _ robotController .endMoveCondition);
opContainer.addFunction("watingIsFinished", _ robotController .watingIsFinished);
opContainer.addFunction("beforeWating", _ robotController .beforeWating);
opContainer.addFunction("afterWating", _ robotController .afterWating);
opContainer.addFunction("wait", _ robotController.wait);
//передаем обработчику состояний контейнер операций
_statesProcessor.operationsContainer = opContainer;
Інструментальні засоби та середовища програмування
72
Как видно из представленного кода,
за хранение ассоциированных методов
отвечает класс OperationsContainer, с по-
мощью метода addFunction методы – обра-
ботчики ассоциируются с идентификато-
рами. Таким образом, ассоциировав один и
тот – же идентификатор метода shoot c
разными обработчиками можно изменить
характеристики выстрела оставив при этом
неизменным общий характер поведения
робота.
<!‐‐Унаследовано от состояния airplane‐‐>
<extends parent=”airplane”/><!‐‐Константы‐‐>
<variables>
<variable name=”speed”>5</variable>
<variable name=”armour”>3</variable>
</variables>
<!‐‐Измененное состояние‐‐>
<states>
<state name="moving">
<usecases>
<usecase name="bombarding ">
<!‐‐Конкретно изменено текущее правило‐‐>
<roole>hasGroundTargets </roole>
<methods>
<method name="endMoving "/>
</methods>
</usecase>
</usecases>
<!—Методы выполняемые ‐‐>
<state_methods>
<!—Перед входом в состояние ‐‐>
<methods_before>
<method name="beforeMoving"/>
</methods_before>
<!—Перед выходом из состояния ‐‐>
<methods_after>
<method name="afterMoving"/>
</methods_after>
<!—На каждый тик ‐‐>
<methods_in_process>
<method name="move"/>
</methods_in_process>
</state_methods>
</state>
<!‐‐Запрещенное состояние‐‐>
<state name="shooting">
<forbidden/>
</state>
<state name="bombarding">
</state >
</states
</direction>;
Листинг 2.5. Декларативная часть программы, управляющая бомбардировщиком
<direction>
<extends parent=”airplane”/>
….
</direction>
Листинг 2.4. Использование тега extends
Інструментальні засоби та середовища програмування
73
2.4. Наследование декларативных
частей программы. Для декларативных
частей программы, реализованных с по-
мощью DSL–языка, реализовано наследо-
вание. Как и наследование классов в тра-
диционных языках, оно позволяет расши-
рить, изменить или запретить свойства
предка.
Указать, что управляющий элемент
программы наследуется от другого, можно
с помощью тега “extends”, как показано в
листинге 2.4.
…
<variables>
<variable name=”speed”>5</variable>
<variable
name=”armour”>3</variable>
…
</variables>
…
Листинг 2.6. Пример создания переменных
В качестве примера использования
рассмотрим два таких робота как самолет
и наследующий его поведение бомбарди-
ровщик. У первого из состояния полета
производится переход в состояние стрель-
бы по наземным целям. У второго же – в
режим бомбардировки, при этом состояния
стрельбы по наземным целям не существу-
ет. Кроме того, у бомбардировщика ско-
рость передвижения будет отличаться, от
самолета.
Листинг 2.7. Интерфейс «состояние»
Таким образом, необходимо изме-
нить значение константы “speed”, доба-
вить состояние bombarding, изменить со-
стояния, из которых актор-предок может
перейти в состояние “shoot” и удалить со-
стояние “shoot” актора-наследника. Насле-
дование декларативной части программы
показано в листинге 2.6 (детали для про-
стоты опущены). Изменено состояние
moving базового класса и добавлено со-
стояние bombarding.
Состояние shooting удалено из ав-
томата с помощью тега forbidden.
2.5. Константы. Поведение акторов
зависит не только от их реакции на опре-
деленные события, но и от таких началь-
ных условий, как, например, скорость
движения, количество выстрелов в секун-
ду, толщина брони и так далее.
В первом приближении можно счи-
тать, что начальные условия задаются с
помощью численных значений констант,
используемых в императивной части про-
граммы. Изменив их, можно специфици-
ровать поведение акторов, управляемых
одним и тем же конечным автоматом.
В DSL–языке константы задаются с
помощью тега variables. Название тега
подчеркивает тот факт, что константы
можно менять в течении игрового процес-
са. Константы подлежат переопределению
в ходе наследования, для этого нужно объ-
явить константу заново. При этом тип зна-
чения константы диаграммы предка дол-
жен быть совместим с типом константы
родителя.
2.6. Детали реализации каркаса.
Реализованный каркас состоит из трех час-
тей: парсера XML – языка задающего ма-
шину состояний, интерпретатора условий
перехода и машины состояний. В начале
работы программы парсер строит по XML
– текстам конкретные реализации машин
состояний управляющих акторами. При
этом, условия перехода преобразовывают-
ся в обратную польскую запись и вычис-
ляются уже в процессе работы программы
с помощью интерпретатора условий. Кар-
кас поддерживает архитектуру «модель –
вид – контроллер»: обрабатывающие ме-
тоды являются методами контроллера.
Эти методы должны принимать экземпляр
класса реализующего интерфейс
IStateObject. Другими словами все классы
акторов обрабатываемые с помощью реа-
лизованной машины состояний должны
реализовывать данный интерфейс.
package org.casualintellect.statemachineclases
{
public interface IStateObject
{
//Геттер и сеттер имени cостояния
function get state():String;
function set state(val:String):void;
//Итендификатор конкретного класса
//реализующего данный интерфейс
function get className():String;
}
}
Інструментальні засоби та середовища програмування
74
Как видно из листинга 2.7, объект
принимаемый методами контроллера дол-
жен иметь возможность изменить имя со-
стояния (функция сеттер), вернуть его
(функция геттер) и вернуть имя обрабаты-
ваемого класса.
Выводы и перспективы
дальнейшего развития
Реализованный каркас является од-
ним из первых применений автоматного
программирования к разработке казуаль-
ных игр, что обуславливает научную но-
визну (других применений автору не из-
вестно). Декларативную часть программы
можно легко перенести на другие плат-
формы, поскольку задается в виде XML.
В перспективе развития программы
стоит реализация графического редактора
декларативной части и генерации по ней
семантической части.
1. Статья в википедии об автоматном
программировании
ru.wikipedia.org/wiki/Автоматное_програм
мирование
2. Домашняя страница проекта Jess
http://www.jessrules.com/
3. Домашняя страница проекта Drools
http://www.jboss.org/drools/
4. Домашняя страница проекта Algernon
http://algernon-j.sourceforge.net/
5. Домашняя страница проекта Jeops
http://www.jeops.org/
6. Официальный сайт языка Clojure
http://clojure.org/
7. Официальный сайт языка Scala
http://www.scala-lang.org/
8. Официальный сайт языка Groovy
http://groovy.codehaus.org/
9. Официальный сайт языка F#
http://msdn.microsoft.com/ru-
ru/fsharp/default%28en-us%29.aspx
10. Официальный сайт языка Nemerlie
http://nemerle.org/Main_Page
11. Домашняя страница проекта Haxe
http://haxe.org/
12. Домашняя страница проекта Alchemy
http://labs.adobe.com/technologies/alchemy/
13. Автоматное программирование. Н. И.
Поликарпова, А. А. Шалыто M. 2008
14. Спецификация языка ASML
http://research.microsoft.com/en-
us/groups/foundations/AsmL/
15. Домашняя страница проекта UniMod
http://unimod.sourceforge.net/
16. Кожаев В.В. Разработка и тестирование
игр // Компьютерная математика. – 2011. –
№ 1. – С. 79 – 85.
Получено 08.08.2012
Об авторе:
Кожаев Владимир Викторович,
аспирант.
Место работы автора:
Институт кибернетики
имени В.М. Глушкова НАН Украины,
03680, Киев-187,
проспект Академика Глушкова, 40.
Тел. (044) 526 3603.
dep145@gmail.com
|
| id | nasplib_isofts_kiev_ua-123456789-86640 |
| institution | Digital Library of Periodicals of National Academy of Sciences of Ukraine |
| issn | 1727-4907 |
| language | Russian |
| last_indexed | 2025-12-07T16:37:03Z |
| publishDate | 2012 |
| publisher | Інститут програмних систем НАН України |
| record_format | dspace |
| spelling | Кожаев, В.В. 2015-09-24T13:26:05Z 2015-09-24T13:26:05Z 2012 Иструментарий создания игровой логики / В.В. Кожаев // Проблеми програмування. — 2012. — № 4. — С. 64-74. — Бібліогр.: 16 назв. — рос. 1727-4907 https://nasplib.isofts.kiev.ua/handle/123456789/86640 681.3 Проанализированы возможности имеющихся средств декларативного программирования применительно к созданию деловой логики казуальных игр. Разработано средство для создания деловой логики игр на платформе flash с учетом выполненного анализа. ru Інститут програмних систем НАН України Проблеми програмування Інструментальні засоби і середовища програмування Иструментарий создания игровой логики published earlier |
| spellingShingle | Иструментарий создания игровой логики Кожаев, В.В. Інструментальні засоби і середовища програмування |
| title | Иструментарий создания игровой логики |
| title_full | Иструментарий создания игровой логики |
| title_fullStr | Иструментарий создания игровой логики |
| title_full_unstemmed | Иструментарий создания игровой логики |
| title_short | Иструментарий создания игровой логики |
| title_sort | иструментарий создания игровой логики |
| topic | Інструментальні засоби і середовища програмування |
| topic_facet | Інструментальні засоби і середовища програмування |
| url | https://nasplib.isofts.kiev.ua/handle/123456789/86640 |
| work_keys_str_mv | AT kožaevvv istrumentariisozdaniâigrovoilogiki |