Пользователь
0,0
рейтинг
13 октября 2009 в 18:37

Разработка → Ненормальное программирование. Разработка IF игр

Разработка игр



Кто не мечтал попробывать разработать собственную игру. Мы будем создавать игру в стиле interactive fiction Сюжет я взял на сайте одной из систем программирования RTADS. Система локализована на русский язык и содержит полный набор средств и руководств для программирования. Но… Программировать мы будем в другой системе Inform7 Она мне больше нравится, т.к. я люблю английский. Итак сюжет.

Сюжет


… В качестве примера мы разработаем игру, действие которой будет происходить в небольшом аэропорту. Наш аэропорт будет иметь терминал, центральный зал, а также выходы к самолетам.

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

На этой карте имеется парочка закрытых зон, что очень удобно при создании загадок. Кроме того, нам пригодится и металлодетектор, поскольку он не позволит игроку проносить через него некоторые предметы. Самолет также может использоваться для пазла, поскольку обычно для того, чтобы попасть в самолет, нужен билет. Плюс к этому, доступ в кабину экипажа разрешен только летному персоналу.

Пусть конечной целью отрезка игры, разворачивающегося в аэропорту, будет покинуть аэропорт. Игрок начнет игру в здании главного терминала, но он не сможет выйти из аэропорта — мы придумаем какую-нибудь причину, типа толпы людей, сгрудившихся у входа в аэропорт, через которую не пробиться. (Конечно, если бы это была законченная игра, часть игрового мира располагалась бы, вероятно, вне аэропорта, и мы бы не стали использовать такую надуманную причину для ограничения перемещений игрока. Но для этого примера мы ее будем использовать, чтобы, что называется, «не расползаться» без нужды). Единственный другой возможный способ покинуть аэропорт — это улететь на самолете; так пусть это и будет целью нашей игры.

Чтобы поднять самолет в воздух, игроку необходимо будет проникнуть в кабину пилотов. (Наш пример окончится на том, что игрок туда проник; в полноразмерной игре мы бы, вероятно, позволили игроку улететь куда-нибудь). Однако в кабину пилотов разрешено входить только летному персоналу — стюардесса не пускает в кабину пассажиров. Таким образом, нам нужно найти способ пробраться мимо стюардессы. Один такой способ — отвлечь ее на достаточно долгое время, чтобы проскользнуть мимо нее в кабину; в нашей игре, однако, от игрока потребуется найти форму пилота.

В каком месте логично поместить форму пилота? Например, в комнате отдыха летного персонала; что ж, поместим в эту комнату чемодан, в котором будет лежать форма. К счастью, комната отдыха скрыта за запертой дверью, что автоматически создает еще одну, вспомогательную загадку. Чтобы попасть в закрытую служебную зону и взять оттуда форму, игроку потребуется магнитная карта-ключ, чтобы отпереть соответствующую дверь (вставив карту в щель ридера, расположенного рядом с дверью).

Магнитную карту мы поместим в легкодоступном месте — на билетной стойке в терминале. Однако мы не позволим игроку пронести ее через металлодетектор — при этом сработает сигнал тревоги, и офицер службы безопасности отберет карту (и положит ее обратно на стойку, чтобы игрок мог попробовать пронести ее еще раз). Чтобы пронести карту через металлодетектор, потребуется отключить его.

Выключатель мы поместим в уборочном помещении, запертом на ключ. Ключ от этого помещения мы поместим в туалете самолета вместе с некоторыми другими предметами уборочного инвентаря — ведром, тряпкой и мешком для мусора, чтобы игрок по ассоциации мог догадаться, что ключ, лежащий там же, скорее всего от уборочной комнаты.

Чтобы попасть в туалет на самолете, потребуется билет на этот самолет. Мы сделаем так, чтобы билет можно было обнаружить сравнительно легко: мы спрячем его в газете, забытой кем-то в буфете. Как только игрок поднимет газету, из нее выпадет билет.

Вот, собственно, и вся игра: вы идете в буфет, берете газету и находите билет. Взяв билет, вы садитесь на самолет, заходите в туалет и берете там ключ от уборочного помещения. Идете с этим ключом к уборочному помещению, отпираете его, заходите туда и отключаете металлодетектор. Затем возвращаетесь к билетной стойке, берете магнитную карточку, идете к служебной зоне и отпираете ведущую туда дверь при помощи карточки. Заходите в комнату отдыха летного персонала, достаете форму пилота из чемодана и одеваете ее. После чего снова идете в самолет и проходите в кабину мимо стюардессы.

Теперь мы можем нарисовать новую карту, нанеся на нее пометки с информацией о важнейших предметах и действиях, из которых, собственно, и будет состоять игра.


Реализация карты


В соответсвии с правилами языка Inform (а это практически естественный английский язык) смотрим на карту и пишем:

Section 1 Map

The Terminal is a room. "It is a large hall with many people.".
The Ticket Counters is east of the Terminal. "Some people choice the direction here and buy the ticket.".
The Security Gate is north of the Terminal.
The metal detector is a door. It is open. It is north of the Security Gate and south of the Concourse.
The Snack Bar is east of the Concourse.
The wood door is a door. It is lockable and locked. It is east of Security Area and west of the Concourse.
The Pilot Lounge is south of the Security Area.
The Security Centre is west of the Security Area.
The Gate Area is north of the Concourse.
The metal door is a door. It is lockable and locked.It is east of the Gate Area and west of the Maintance Room.
The Gate 1 is northwest of the Gate Area.
The Gate 2 is north of the Gate Area.
The Gate 3 is northeast of the Gate Area.
The Jetway is east of the Gate 3.
The Front of Plane is east of the Jetway. Stewardess is a woman in the Front of Plane.
The thin door is a door. It is south of the Cockpit and north of the Front of Plane.
The Rear of plane is south of the Front of Plane.
The Bathroom is south of the Rear of plane.

Не удивляйтесь это настоящий язык программирования. Платформа основана на принципах Литературного программирования. Компилируем, выбираем закладку Index-->World, получаем:

Очень близко к тексту. Можно пройтись по карте (закладка Game):
airport
An Interactive Fiction by AlexChin
Release 1 / Serial number 091013 / Inform 7 build 5Z71 (I6/v6.31 lib 6/12N) SD

Terminal
It is a large hall with many peoples.

>n

Security Gate
You can see a metal detector here.


Реализация предметов


Дописываем код:
Section 2 Items

The Ticket Counters contains counter. On the Counter is a ID card.

The electric switch is a switched on device in the Maintance Room. The electric switch is switched on.

The brass key unlocks the metal door. It is in the bathroom. The pail, sponge, garbage bag are in the bathroom.
The News Paper is in the Snack Bar. "You can see a News Paper here." It is closed, not transparent container. The description of it is
"You read a few articles, and promptly become depressed.
The federal deficit just went up by another twenty billion dollars, but it's
all off budget, so it doesn't really count. The economy had yet another downturn, but the
President says he's confident that the recovery is just around the
corner and picking up steam.".

The Boarding pass is in the News paper. The description of it is "Boarding pass. Luht franza board 0923. Place A. Row 25. Class B".

The slot is a container. The description of it is "Ordinary slot at wall".It is in the Concourse.
The suitcase is the openable closed container. It is in the Pilot Lounge. The Pilot uniform is in the suitcase. IT is wearable.


Реализация специальных реакций


Section 3 Special Behavior

Before opening the thin door:
if player wear the uniform:
say "Second pilot! Welcome on board!";
continue the action;
otherwise:
say "For staff only!";
stop the action.

After going to Cockpit:
end the game in victory;

After going through the metal detector:
if player carry id and electric switch is switched on:
end the game in death;
otherwise:
continue the action.

After taking the news paper:
Now the boarding pass is in the location;
say "The piece of paper fall down at the floor";
continue the action.

Carry out inserting something into the slot:
if noun is id:
say "Click!";
now the wood door is unlocked;
otherwise:
remove the noun from play.

Report inserting something into the slot: say "[if noun is not id][The noun] falls out of sight, and you know you will never see it again."

Instead of giving pass to Stewardess:
now Stewardess carries pass;
say "All Right, Please find your place rear of plane".

Instead of going from Front of Plane to Rear of plane:
if Stewardess carries the Boarding pass:
continue the action;
otherwise:
say "Stop. Give me pass";
stop the action;


Заключение


Мы написали скелет игры. Играть в нее можно, но конечно не хватает литературной описательной составляющей. Хотя экспериментов в ней достаточно. Можно поиграться со слотом или пройти с картой ID через металлодетектор.

Ссылки:


Ненормальное программирование. Может так писал Бог?
Конкурс Игр Interactive fiction Competition 2009

@alexchin
карма
38,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (30)

  • –5
    Хорошая статья, надо будет попробывать что-нибудь склепать
  • +6
    Не упомянуты популярные русскоязычные IF-платформы QSP (http://qsp.su) и URQ (http://urq.plut.info/).
    • +1
      Не нашел в этом ничего ненормального. Обычный код.
      i = 1
      :loop
      IF i <= COUNTOBJ:
      OBJECTS[$GETOBJ(i)] = OBJECTS[$GETOBJ(i)] + 1
      i = i + 1
      JUMP 'loop'
      END
      <code/>
      • 0
        я прошу прощения за свою необразованость, а на чем это оно такое с JUMPами и ключевыми словами капсом?
        • 0
          это внутренний язык упомянутого qsp. не по феншую.
  • +1
    Отличная помощь тем, кто по жизни визуал, в освоении принципов программирования.
    Респекты.
    • +1
      Мне больше импонирует такая вариация: www.lisperati.com/casting.html
      • 0
        Кстати, тоже неплохо.)
      • 0
        (setf *object-locations* '((whiskey-bottle living-room)
        (bucket living-room)
        (chain garden)
        (frog garden)))

        тоже ничего… но я пока замечаю скобки.
        а парсер на лиспе есть?
        • 0
          не понял вопроса :) парсер чего? лиспа на лиспе? ;-)
          • 0
            языка программирования и языка взаимодействия с игроком.
            Например:
            >give pass to Stewardess
            >insert id in slot
            • 0
              дык… в мире лиспа, это одно и то же. просто строится DSL для описания игры, которое может в том числе описывать язык взаимодействия игрока с миром. Собственно, код:
              www.lisperati.com/code.html

              и «интерфейс» для игрока:
              www.lisperati.com/cheat.html
              • 0
                а… понял! все на списках!
                А реально есть ли возможность написать парсер в AST(или другие структуры) на лиспе? Например на основе DCG или BNF.
                • 0
                  программа на лиспе и есть по сути AST. Более того, им можно вертеть как вздумается: читать/генерить код как данные, или evaluate'ить данные как код ;-)
      • 0
        www.amzi.com/AdventureInProlog/advfrtop.htm
        Adventure in Prolog
        Здесь с парсером!
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    и офицер службы безопасности отберет карту (и положит ее обратно на стойку, чтобы игрок мог попробовать пронести ее еще раз).

    After going through the metal detector:
    if player carry id and electric switch is switched on:
    end the game in death;

    Не стыкуется. :)

    А вообще прикольно. Вот бы времени найти…
    • 0
      у меня был еще вариант, типа детектор неисправен и ИД карта так нагревается, что зажигает бензин в зажигалке ЗИПО!
  • 0
    It is a large hall with many peoples
    говорите, английский любите? =) Шучу, конечно, но в глаза прыгает.
    • 0
      исправлено. спасибо за глаза.
  • 0
    старые добрые MUD вспомнились. =)
  • +3
    @Она мне больше нравиться, т.к. я люблю английский.@

    «ться-тся»

    Правильно, на русском не пишите, чтобы не позориТЬся.
    • 0
      исправлено.
  • 0
    ух ты как оно всё к 7 версии мутировало:) помню свои старые попытки переводить inform на русский, тогда это выглядело более привычно, как обычный язык программирования, разве что с прототипами объектов вместо классов
    • 0
      А 6ой-то уже хорошо переведён: rinform.stormway.ru.
      7ой, конечно, крут. :)
  • 0
    Помню, в начальной школе делал похожие игры. Типа пошагового дума=))

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.