Freigeben über


Подземелья, подземелья, язык DSL для подземелий…

 

Грег Дункан

clip_image002

Поднимите руки те, у кого первый опыт программирования был связан каким-то образом с подземельями. Игра D&D (Подземелья и драконы)? Генератор символов? Утилита DM? Ролевые игры? Все перечисленное?

[Поднимаются руки]

Когда я увидел эту статью, то понял, что должен рассказать о ней. Язык Dungeon DSL? Это здорово, но факт, что конечный автомат, стоящий за DSL также общедоступен, делает его замечательным++

За DSL скрыта мощь и магия, и ее изучение делает эту магию менее ужасной и значительно более привлекательной…

Создание внешнего языка описания карты подземелий, основанного на C# .NET

Создание собственного языка программирования может быть устрашающей задачей. В конечном счете, именно поэтому разработчики выбирают существующие языки программирования, такие как С#, Ruby, Perl JavaScript или другие традиционные языки. Однако иногда может случиться, когда пользователям, не являющимся профессиональными программистами понадобиться настроить или изменить программную логику. Так как не все бизнес-пользователи могут программировать на естественных языках, может оказаться выгодно реализовать язык, специфичный для некоторой области, которым могут воспользоваться пользователи сторонних фирм. Простые примеры такого языка могут включать INI-файлы Windows или конфигурационные файлы в формате XML. Однако можно создать даже более специфические пользовательские языки программирования, даже для собственных нужд с помощью внешнего языка, специфичного для определенной области – External Domain Specific Language.

...

В этой статье мы создадим собственный простой язык программирования для создания карты подземелий в ролевой игре. Наш язык будет состоять внешний язык, специфичный для определенной области, включая типы, секции исходного кода и строки. Наша главная программа загрузит внешний файл с DSL-кодом в конечный автомат и выполнит программу, позволяя нам бродить в глубоких, темных подземельях в поисках сокровищ!

...

Зачистка подземелья SweepingtheDungeonCleanПодобно рассмотренному выше внутреннему языку DSL пример внешнего языка, специфичного для данной области может иметь следующий вид:

events moveSouth south moveNorth northendstate emptyRoom "Empty Room"endstate treasureRoom "Treasure Room"endconnect emptyRoom to treasureRoom by moveSouthconnect treasureRoom to emptyRoom by moveNorth

Этот пример не ни требует знания C# .NET, ни какого-то другого языка программирования, и еще он позволяет реализовать полностью работающую программу. Создаваемый далее DSL будет походить на приведенный пример, но мы добавим в него дополнительные конструкции, для включения в состояния действий.

...

Ползаниепоподземельям

Запуск экземпляра программы сфайлом кодаdungeon.txt приведет к следующим результатам:...Executing idleExecuting waitingForStateExecuting waitingForActionExecuting waitingForStateExecuting waitingForTransitionExecuting waitingForTransitionStateExecuting waitingForTransitionExecuting waitingForStateExecuting waitingForActionExecuting waitingForTransitionStateExecuting waitingForTransitionExecuting waitingForStateExecuting waitingForActionExecuting waitingForStateExecuting idleLoading of External DSL completed.> Q = Quit, ? = Available Commands> Entering the dungeon.Executing idlelight (You see an endless white light.)> ?northsouth> northExecuting treeStatetree (You see a circle of trees.)> southExecuting idlelight (You see an endless white light.)> southExecuting pitStatepit (You see a dark bottomless pit.)> eastExecuting boxStatebox (You see an ominous box with a smaller glitter inside.)>?westopen> openExecuting treasureStatetreasure (You find a pile of sparkling treasure!)> q

...

Признайте это… После чтения статьи размышления о построении собственного мира Zork будут вертеться у вас в голове. Произойдут действительно магические события, когда вы воплотите всё что можно сделать с помощью этой идеи.