Объекты в IF языках программирования это хорошо - можно задать общие для объектов вещи и более не мучиться... Проблемы есть, но их не много и они довольно просто решаются/избегаются. Это, например, приписывание не тех свойств объектам = простая невнимательность. Но, возможно, кто-нибудь скажет, что ООП (объектно-ориентированное программирование) сложнее, чем линейное программирование.
Короче не знаю.
Просто ищу оправдание внезапно наплывшему желанию написать простую платформу на Python для IF. Команды там будут обрабатываться совершенно линейно, как в "Васе". Т.е. те команды, кот. программист не задал пониматься просто не будут. Хотя будут некоторые вспомогательные механизмы - такие, как маски команд. Скажем, игрок набирает "отдать топор гоблину", находясь в комнате room1. Тогда последовательно будут вызываться следующие команды: room1_отдать_топор_гоблин, room1_отдать_топор_*, room1_отдать_*_гоблин, room1_отдать_*_*, room1, отдать_топор_гоблин, отдать_топор_*, отдать_*_гоблин, отдать_*_*, *. Вот примерно так. Надеюсь, что идея понятна. Следует ли пытаться сделать такую систему, или она по сути слишком примитивна и не стоит затраченного времени? А?
Неактивен
Можете посоветовать какую-нибудь менюшную ООП платформу?
желательно с простым языком типа QSP, Паскаля
(в принципе не важно русская она или нет,
только бы русская кодировка отображалась правильно)
Неактивен
ТОМ под Миленой.
Простой С++ подобный язык.
А парсер можно не использовать. ![]()
Неактивен
В приложении микро-мини-демка для Милены.
Тестировалось на Милене 2.0 с подключенным модулем ТОМ.
Пример позволяет представить себе как бы выглядела менюшная игра на ТОМе.
--------------------------------------------------------------------------------
Прикрепленные файлы:
Milena_demo.tom, Размер: 2,031 байт, Скачано: 46
UPD: обновленный пример входит в набор примеров к платформе ТОМ, его можно скачать со станички ТОМа в иф-википедии.
Отредактировано ASBer (23.10.2009 09:55)
Неактивен
ASBer, видишь ли, у меня есть своё видение того, как должен быть устроен парсер
RTADS меня пока не устраивает проблемами со склонениями: я хочу, что бы мой парсер принимал команды на правильном русском языке, и выдавал ответную реакцию на правильном русском языке. в RTADS я могу добиться некорректных реакций от своего кода. и исправить это для меня так же сложно, как свой парсер написать
Delphi меня не устраивает большой подготовительной работой. хотелось бы сосредоточиться именно на написании движка и игры
URQ не устраивает, пожалуй, только отсутствием такого хорошего редактора, как QGen. а именно: для парсерного движка удобно разбиение текста на куски, м/ду которыми легко переключаться
QSP, так же, как и URQ, привлекает полным отсутствием поддержки парсера. собственно, все парсерные возможности в них сводятся к работе со строками. НО это- как раз то, что мне надо. делать свой движок на _другом_ движке было бы мучительно
да, и работая над своим движком, я начинаю понимать, что не всё так просто с запирающимися контейнерами, и что парсер написать не так уж и просто. ну, хотя бы ради этого понимания и стоило потрудиться.
насчёт ТОМа... попробовать что-ли сделать очередной заход? что-то с трудом даётся его освоение. это- главное, единственное, и большое препятствие для меня. хотя, язык- соблазнительный. что мне не нравится в существующих парсерных движках- разделение на типы объектов. почему бы не сделать 'контейнер', 'поверхность', 'переносимость', 'общительность' свойствами, которые можно комбинировать в любом порядке для любых объектов?
пойдём дальше:
почему бы каждому объекту не задать список свойств, связанных с каждым глаголом?
а каждому глаголу- задать по нескольку различных способов реагирования, и несколько различных сообщений об ошибке?
допустим, создаём новый объект 'яблоко'. для начала все его свойства=0, т е задана дефолтная обработка // как правило, просто выдаёт 'стандартное' сообщение, и ничего не делает
если автор хочет, что бы его можно было съесть- делаем свойство 'съесть' объекта 'яблоко' равным 1 // т е - стандартное поедание объекта
задав ещё несколько свойств (взять, и т п - исходя из того, что с ним нужно будет делать) - автор уже добавил новый объект в игру! // ну, правда, просклонять его ещё надо
если нужно добавить ядовитый объект- без проблем: добавляем функцию съесть_2, вызываемую, если свойство 'съесть' какого-то объекта равно 2 // т е - объект ядовит
добавить новый глагол- без проблем! - для этих всех добавлений можно даже прогу написать, типа Adrift, через которую можно добавлять в квест любые объекты и реакции
вот это было бы простой и понятной парсерной платформой
// не знаю, может быть, я несколько сумбурно описал, НО выше описано практически всё, что мне от платформы нужно. да, написание самих процедур, тут уж- да. потрудиться придётся. и у объектов свойств будет поболее, чем только глаголы. но в общем и целом я представляю себе парсер именно так
// давайте, разгромите мои бредни в пух и прах - буду рад конструктиву
Неактивен
мне не нравится в существующих парсерных движках- разделение на типы объектов. почему бы не сделать 'контейнер', 'поверхность', 'переносимость', 'общительность' свойствами, которые можно комбинировать в любом порядке для любых объектов?
Для этого есть много причин. ![]()
Попробую перечислить главные:
1. Практически невозможно сделать универсальный класс на все случаи жизни. Даже перечисленные тобой свойства дают 16 типов различных объектов. Помнож их на количество возможных действий и оцени объем разработки и тестирования всех возможных реакций. Страшно? Мне страшно.
Например поверхность+переносимость. Что будет если мы возьмем такой объект? Предметы с поверхность должны упасть на пол, или останутся на ней как приклееные?
Еще пример: контейнер+общительность. Если мы положим туда предмет, контейнер должен говорить "спасибо"? ![]()
Поэтому стандарные библиотеки и содержат узкоспециализированные классы. Только это дает возможность написать библиотеку в сколь бы то нибыло приемлемый срок.
2. Производительность. Сейчас возможно это не так актуально, но узкоспециализированные классы просчитываются быстрее нежели универсальные.
Если у тебя в локации только один НПС унаследованный от 'общительного' класса, парсер не будет на твой "Привет" перебирать все табуретки в локации в надежде, что какая нибудь из них ответит.
3. Стандартные классы вполне подходят для быстрого создания антуража игры. Если же мы конечно хотим написать игру, а не реалити-симулятор.
Игра должна вести игрока чтобы у него не возникало желания говорить с табуретками или двигать недвижимое...
А если к этому еще дописать несколько нестандартных объектов на главные роли - вообще Супер!
Неактивен
пойдём дальше:
почему бы каждому объекту не задать список свойств, связанных с каждым глаголом?
Я библиотеку к ТОМу именно так и буду делать. У объектов будут свойства .МожноВзять .МожноНадеть .МожноСъесть и т.п.
насчёт ТОМа... попробовать что-ли сделать очередной заход?
Велком ![]()
Надеюсь в ближайшее время выложить обновленную версию ТОМа, и стандартную библиотеку начну выкладывать кусками.
что-то с трудом даётся его освоение. это- главное, единственное, и большое препятствие для меня. хотя, язык- соблазнительный.
Кста, а может тебе с менюшных игр на ТОМе начать? это на порядок легче. Освоишься с языком и классами там и к парсеру мона перейти. ![]()
Отредактировано ASBer (17.04.2009 20:03)
Неактивен
Ох... Полный оффтоп пошел - прошу прощения у тех, кто писал в эту тему с совсем другими целями, нежели полемика по поводу ООП... Но не ответить noname просто не могу (настолько у него своеобразный - при этом имеющий мало общего с реальностью - взгляд на объектно-ориентированное программирование). Модераторы, секите и гнобите меня - я этого заслуживаю!
noname написал:
ASBer, видишь ли, у меня есть своё видение того, как должен быть устроен парсер
RTADS меня пока не устраивает проблемами со склонениями: я хочу, что бы мой парсер принимал команды на правильном русском языке, и выдавал ответную реакцию на правильном русском языке. в RTADS я могу добиться некорректных реакций от своего кода. и исправить это для меня так же сложно, как свой парсер написать
Добиться некорректных реакций? Или у тебя проблемы с формулировками, или у меня - с пониманием (но никак не у ТАДСа со склонениями; вернее, они есть, но сильно преувеличены). Добиться некорректной реакции кто угодно c легкостью cможет от любого языка и для любой области применения - достаточно в первой же инструкции, например, выполнить деление на ноль - вот и некорректная реакция. В свете этого прошу пояснить, что же конкретно имелось в виду.
Так, комментировать про то, чем тебя привлекает/отталкивает та или иная платформа для написания собственного парсерного движка - не буду. Выбор твой, в конце концов.
noname написал:
что мне не нравится в существующих парсерных движках- разделение на типы объектов. почему бы не сделать 'контейнер', 'поверхность', 'переносимость', 'общительность' свойствами, которые можно комбинировать в любом порядке для любых объектов?
А что, в RTADS - не так? Все это выполняется путем множественного наследования, например при следующем определенииShtukovina: container, surface, item
будет одновременно контейнером (класс container), поверхностью (surface) и переносимым объектом (item). Чем тебе не свободная комбинация свойств родительских классов? (В нюансы сейчас не углубляюсь, чтобы не раздувать и без того оффтопный пост).
noname написал:
пойдём дальше:
почему бы каждому объекту не задать список свойств, связанных с каждым глаголом?
И опять-таки: что, в RTADS - не так? Да ровно так и обстоит дело - у объекта имеется метод-обработчик, отвечающий за реакцию на конкретный глагол.
noname написал:
а каждому глаголу- задать по нескольку различных способов реагирования, и несколько различных сообщений об ошибке?
По-моему, достаточно сделать для глагола один обработчик, в котором проверяются некие условия и в зависимости от их (не)выполнения выводятся различные реакции/сообщения об ошибке, не находишь?
noname написал:
допустим, создаём новый объект 'яблоко'. для начала все его свойства=0, т е задана дефолтная обработка // как правило, просто выдаёт 'стандартное' сообщение, и ничего не делает
если автор хочет, что бы его можно было съесть- делаем свойство 'съесть' объекта 'яблоко' равным 1 // т е - стандартное поедание объекта
задав ещё несколько свойств (взять, и т п - исходя из того, что с ним нужно будет делать) - автор уже добавил новый объект в игру! // ну, правда, просклонять его ещё надо
если нужно добавить ядовитый объект- без проблем: добавляем функцию съесть_2, вызываемую, если свойство 'съесть' какого-то объекта равно 2 // т е - объект ядовит
добавить новый глагол- без проблем! - для этих всех добавлений можно даже прогу написать, типа Adrift, через которую можно добавлять в квест любые объекты и реакции
вот это было бы простой и понятной парсерной платформой
Все, что ты написал выше - ровно описание того, как это делается в RTADS;).
Если ты описываешь яблоко как
Yabloko: item
;
оно будет просто стандартным объектом с дефолтной обработкой команд. Если надо, чтобы его можно было съесть, задачу можно решить одним из следующих путей: определить яблоко как наследник класса foodItem
Yabloko: fooditem
;
(это в случае, если тебя устраивает стандартная для этого класса реакция - исчезновение яблока из инвентаря и вывод текста "Было очень вкусно!").
Если не устраивает, можно просто переписать обработчик для глагола "есть", например, так:
Yabloko: item
Nadkusano=0
verDoEat(actor)={}
doEat(actor)={self.Nadkusano:=self.Nadkusano+1;
"Ты надкусываешь яблоко. Кисловато, но есть можно.";
}
;
Про "добавить новый глагол": непонятно, что имеется в виду - то ли определение новых глаголов для игры, не прописанных в стандартной библиотеке, то ли добавление нового глагола динамически во время игры. В подробности вдаваться сейчас не хочу - слишком обширная тема, да и пересказывать мануал - занятие неблагодарное, но и та, и другая задача средствами RTADS решается.
noname написал:
// давайте, разгромите мои бредни в пух и прах - буду рад конструктиву
Ну, не знаю, есть ли в моем потоке возмущенного сознания конструктив. Вообще (извиняюсь за переход на личности) посты noname иногда напоминают пассаж из рассказа Тэффи "Взамен политики":
– А вы что же изволите изобретать?
– Да еще наверное не знаю. Что нибудь да изобрету. Господи, мало ли еще вещей не изобретено! Ну, например, скажем, изобрету такую какую нибудь машинку, чтобы каждое утро, в положенный час, аккуратно меня будила. Покрутил с вечера ручку, а уж она сама и разбудит. А?
– Папочка, – сказала дочь, – да ведь это просто будильник.
Капитан удивился и замолчал.
Отредактировано uux (17.04.2009 21:44)
Неактивен
по теме:
Следует ли пытаться сделать такую систему, или она по сути слишком примитивна и не стоит затраченного времени?
да, блин, делай что хочешь. хоть очередной квест а-ля Билли Хаст. примитивно- ещё не значит плохо
Можете посоветовать какую-нибудь менюшную ООП платформу?
нету такой. хотя в стиле ООП можно писать и на URQ, и на QSP. пример щазз давать лениво- можешь заглянуть в тему 'Живой Игровой Мир' на форуме урки, там можно нарыть чё-то вроде примеров программирования в стиле ООП на URQ
теперь оффтоп:
спасибо за ответы. после их прочтения почему-то захотелось писать на Delphi. изучать ТОМ буду по-любому. но не торопясь, и без особой надежды на нём что-нибудь сотворить
'добиться некорректных реакций' имелось ввиду, что играя в написанный мной на RTADS кусок игры, я завсегда могу ввести чё-нибудь такое, что выдаст сообщение в невполне корректой форме. текст упомянутого куска квеста с сейфом(контейнер и поверхность), столом, ключом и роботом выложен где-то на форуме. если интересно- могу поискать. он слегка не доделан- сейф работает не правильно(для правильной работы надо ввести дополнительный объект 'ячейка сейфа', что связано с наличием двух различных хранилищ в нём- НА и ВНУТРИ сейфа). да, упомянутый некорректный вывод, скорее всего вообще не будет замечен игроками, кроме самых въедливых. пожалуй, щазз у меня просто 'период несварения RTADS'
насчёт будильника- буду рад, если именно так дела и обстоят. хотя я в этом не уверен
у объекта имеется метод-обработчик, отвечающий за реакцию на конкретный глагол
ну, тут есть одно незначительное отличие: все реакции должны быть прописаны один раз. для каждого глагола(здесь я не противоречу себе- см объяснение ниже). глагол = функция, логично, не так ли? у объекта лишь должен быть набор свойств, в зависимости от значений которых, он и обрабатывается командами
По-моему, достаточно сделать для глагола один обработчик, в котором проверяются некие условия и в зависимости от их (не)выполнения выводятся различные реакции/сообщения об ошибке, не находишь?
одно и то же. объясняю: команда 'съесть' в зависимости от значения (-n..0..m) соотв свойства вызывает соотв функцию-обработчик (съесть_err_1..съесть_err_n, съесть_0..съесть_m). типа того
и, конечно, если я смогу писать 'моим стилем' в RTADS, или ТОМ- я предпочту писать на них. потому что тогда будет к кому направлять вопросы и пожелания по работе платформы
так, например, как задумаюсь о реализации вложения контейнеров на URQ- волосы встают дыбом. а ведь задача, далеко не надуманная: да, в квестах 'на прохождение', типа Билли Хаста, это- излишество, но если мне интересна проработка именно мира, в котором игрок может просто жить, тогда недостаточно просто автоматически вытаскивать содержимое контейнера при его осмотре. должна быть возможность и положить что-то в него. а среди вещей вполне может оказаться горшочек мёда, в который можно положить и не только мёд. типа того. и тогда задумка с примитивнейшим сюжетом оказывается настоящим вызовом для самодельного парсера
да, и я винду недавно переустановил. надо будет качать RTADS заново. попробую разобраться ещё раз, и сформулировать конкретные вопросы. пожалуй, идеальным для меня был бы такой режим работы: делаю что-нибудь на RTADS, а потом спрашиваю у ASBer, как это проще/короче всего сделать в ТОМе
Неактивен
Хорошо, что Билли Хаст промелькнул в качестве примера примитивной разработки текстового квеста. Это действительно так. По теме я бы хотел сказать, что использование того или иного метода программирования исходит от понимания, что будет "в конце". ООП создано, что бы облегчить программирование, не для того что бы "оно было". С его использованием код становится меньше, логичней и проще в использовании, но только в тех случаях, когда это действительно необходимо.
Вот, опять же, взять исходники моего квеста (Билли Хаст, исходники здесь - http://breakmt.narod.ru/billy_src.zip). Многие сказали бы, что это очень плохие исходники. Я сам понимаю, что они могли бы быть гораздо лучше, используй я ООП, да и, вообще, подходя к этому делу серьезней. Другой вопрос был бы ли этот Билли Хаст вообще, если бы я надумал усложнить задачу, сделать редактор карт, диалогов, расчет времени суток, используя ООП ввести всякие контейнеры, поверхности и т.д. да и вообще необходимы ли они были бы в данной игре?
Что лучше - сделать игру за несколько дней и затем оттачивать ее, либо сделать демку, в которую невозможно будет играть, но в ней будет все вышеперечисленное? Многие начинающие (да и знающие) разработчики переоценивают свои силы и пытаются сделать универсальный движок для разработки продолжений. Я считаю, что это не правильно лично из своего опыта.
Короче, мой вывод: если ты размышляешь использовать ли ООП или нет, если ты новичок - пиши как ты привык, потому что только в этом случае ты получишь результат (причем может быть в короткие сроки) + обучишься чему то новому... иначе пиши используя ООП, потому что это удобно, когда понимаешь, что это такое.
Извиняюсь, если не в тему, потому что писал не для платформ (в которых я не секу), а для тех, кто делает квест с нуля используя язык программирования.
Неактивен
uux написал:
Eten, см. личку.
Приношу публичное извинение за свою ошибку, т.к. в моих намерениях было желание дать человеку полный обзор того что имеется и что вскором времени будет выпущено. Посты увы убрать не возможно, иначе тема будет выглядеть нарушенной. ![]()
З.Ы.
Тот кто умеет признавать свои ошибки, хуже не становится! ![]()
----------
Убрал свои посты в спойлер, на том и остановлюсь. ![]()
Отредактировано Eten (18.04.2009 07:39)
Неактивен
BreakMT, абсолютно согласен, что такой простой подход к программированию парсера оправдан для игр определённого типа. пожалуй, любую задумку 'проходного квеста' (квеста на прохождение) можно реализовать таким способом. при таком подходе мир игры несколько 'огрублён', но в этом и плюс- гамер сосредотачивается на важном, не распыляясь на пустяки. НО у меня есть своя болезнь на эту тему, заключается в идее реализовать 'Живой Игровой Мир'. моё понимание ЖИМ постепенно меняется...
//
да, чуть не забыл: ТОМ = ООП платформа, с возможностью делать менюшные игры
RTADS- вроде бы тоже... в чём проще- не знаю
(хотя, вообще-то это парсерные платформы)
upd:
и ещё немного поддержки to BreakMT: дело, доведённое до конца заслуживает уважения
Отредактировано noname (18.04.2009 08:30)
Неактивен
noname написал:
теперь оффтоп:
спасибо за ответы. после их прочтения почему-то захотелось писать на Delphi. изучать ТОМ буду по-любому. но не торопясь, и без особой надежды на нём что-нибудь сотворить
'добиться некорректных реакций' имелось ввиду, что играя в написанный мной на RTADS кусок игры, я завсегда могу ввести чё-нибудь такое, что выдаст сообщение в невполне корректой форме. текст упомянутого куска квеста с сейфом(контейнер и поверхность), столом, ключом и роботом выложен где-то на форуме. если интересно- могу поискать. он слегка не доделан- сейф работает не правильно(для правильной работы надо ввести дополнительный объект 'ячейка сейфа', что связано с наличием двух различных хранилищ в нём- НА и ВНУТРИ сейфа). да, упомянутый некорректный вывод, скорее всего вообще не будет замечен игроками, кроме самых въедливых. пожалуй, щазз у меня просто 'период несварения RTADS'
Пример тот искать не надо, я его помню;). Да, согласен, это одна из слабостей стандартной библиотеки TADS - что автоматом подразумевается, что контейнером и поверхностью одновременно объект быть не может. Это лечится двумя способами - тебе дали вариант, более подходящий для новичков (создание служебного объекта, направленного на отработку одной из недостающих реакций). Другой способ - переписывание стандартного класса поверхности (или контейнера) так, чтобы коллизий не возникало.
noname написал:
у объекта имеется метод-обработчик, отвечающий за реакцию на конкретный глагол
ну, тут есть одно незначительное отличие: все реакции должны быть прописаны один раз. для каждого глагола(здесь я не противоречу себе- см объяснение ниже). глагол = функция, логично, не так ли? у объекта лишь должен быть набор свойств, в зависимости от значений которых, он и обрабатывается командами
По-моему, достаточно сделать для глагола один обработчик, в котором проверяются некие условия и в зависимости от их (не)выполнения выводятся различные реакции/сообщения об ошибке, не находишь?
одно и то же. объясняю: команда 'съесть' в зависимости от значения (-n..0..m) соотв свойства вызывает соотв функцию-обработчик (съесть_err_1..съесть_err_n, съесть_0..съесть_m). типа того
Кажется, начинаю понимать, хотя и не совсем. Т. е. ты имеешь в виду, что вся обработка прописана в глаголе, а у объектов имеются только флаги (не методы). Обработчик, целиком локализованный в объекте-глаголе, только проверяет эти флаги. Мда, в (R)TADS это реализуется, но будет выглядеть кривовато. Вообще я думаю, что тебе тогда и вправду лучше писать что-то свое, если по-другому писать не получается... Хотя за ТОМ я, конечно, зря говорю.
Неактивен
Возвращаясь к вопросу MixeratoR'а - наверное, действительно единственная менюшная платформа с ООП - это ТОМ. Любимый мною (R)TADS, конечно, позволяет писать менюшные игры, но это все-таки извращение. Рекомендую поймать ASBer'а на слове и выжать из него техподдержку в плане написания игры по максимуму;).
Отредактировано uux (19.04.2009 13:35)
Неактивен
Рекомендую поймать ASBer'а на слове и выжать из него техподдержку в плане написания игры по максимуму
Всегда пожалуйста, я готов ![]()
Какая же ТОМ "менюшная" платформа?
В ТОМе есть поддержка меню.
Отредактировано ASBer (19.04.2009 13:21)
Неактивен
uux, недостаток RTADS для меня скорее в том, что я могу добиться вывода на 'ломанном руском'. хотя, да- проблемма скорее надуманная, чем реальная. поверхности тут ни при чём- их действительно можно сделать, и это сделать довольно просто, и это недостатком я не считаю
---
по логике вещей, вся обработка должна быть прописана отдельно от описания структуры данных. как описывать объекты (свойства, и взаимосвязи,- тот же сейф)- отдельная тема. НО если герой съедает нечто, и насыщается, то это должно происходить НЕ потому, что он съел специально предназначенный для съедения с последующим насыщением объект, а потому, что герой насытился бы, съев любой объект с такими свойствами. такой подход максимально направлен именно на построение мира со своей целостной логикой
это- совершенно естественная идея, и- хороший способ избежать 'комбинаторного взрыва'
---
RTADS опять скачал... буду поразбираться ишщё
Платформа с "поддержкой меню" != менюшная платформа
а в томе специально предусмотрена автором возможность создавать меню. и автор постарался, чтоб это сделать было удобно... но да, парсерная платформа- уже не менюшная. я так вижу, по сообщениям of ASBer, что он скорее позиционирует её, как 'универсальную'. т е ООП-платформу с Си-подобным языком, предназначенную для создания как парсерных, так и менюшных квестов
to ASBer: будешь писать библиотку - не молчи, дай знать. для начала хотелось бы команд 'идти' и 'смотреть', затем- 'открыть' и 'закрыть' - двери, окна, сейфы, шкатулки и т п, потом - 'взять' и 'выложить' - хочу потестить по 'горячим следам'
Отредактировано noname (19.04.2009 18:05)
Неактивен
это- совершенно естественная идея, и- хороший способ избежать 'комбинаторного взрыва'
noname, к сожалению это очередное заблуждение.
Свойства объектов, как ты их хочешь использовать - это шаг назад.
Невозможно заранее предусмотреть все свойста, которые могут понадобиться автору игры. A код, который анализирует все свойства объекта, будет путанным и трудно модифицируемым. (см. спагетти-код)
Способ выполнения, результат и последствия любого действия зависят от субъекта действия (актера), прямого объекта действия, дополнительного объекта/ов и от окружающей среды, в которой производится действие.
Т.е мы имеем 4 фактора, каждый из которых выражен некоторым объектом, имеющим свой набор свойств и относящимся к различным классам.
Классический ООП позволяет разместить несколько обработчиков одного действия в методах одного из объектов с передачей остальных объектов как аргументов. Выбор конкретного обработчика зависит от классов переданных аргументов (см. полиморфизм, перегрузка методов).
В классическом объектно-ориентированнном языке мы смогли бы разнести обработку качественно отличающихся ситуаций по различным методам с одинаковыми именами. Появился нестандарт - пишем для него новый обработчик, не трогая существующих и все довольны.
Но это все в серьезных языках.
Но что мы имеем для РИЛ?
рТАДС комментировать не буду, смотрите документацию. ![]()
ТОМ
1. Добавлен объект для действия.
Выбор действия зависит не только от глагола и его предлога, но и от классов и свойств объектов, упомянутых в команде. Т.е. для одного глагола "съесть" может быть несколько действий - "съесть_съедобное", "съесть_несъедобное", "съесть_отравленное" и т.д. Это изначально разные объекты действий. Проверки на возможность выполнения действий также привязаны к объекту-действию и и могут быть различными для разных действий.
2. Обработчики действий привязаны к объектам-актерам, а не к объектам. Перегрузки пока нет, но надеюсь когда-нибудь появится.
Отредактировано ASBer (19.04.2009 20:13)
Неактивен
noname написал:
по логике вещей, вся обработка должна быть прописана отдельно от описания структуры данных.
Поправьте меня, программисты-профессионалы - но, по-моему, инкапсуляция методов (обработчиков) в объекте - это составная (и практически неотъемлемая) часть ООП.
Неактивен
я так вижу, по сообщениям of ASBer, что он скорее позиционирует её, как 'универсальную'. т е ООП-платформу с Си-подобным языком, предназначенную для создания как парсерных, так и менюшных квестов
Да, примерно так и есть. Менюшные квесты на ТОМе вполне реально делать, и это неплохое начало для освоения платформы с возможностью в дальнейшем перейти к использованию парсера.
to ASBer: будешь писать библиотку - не молчи, дай знать. для начала хотелось бы команд 'идти' и 'смотреть', затем- 'открыть' и 'закрыть' - двери, окна, сейфы, шкатулки и т п, потом - 'взять' и 'выложить' - хочу потестить по 'горячим следам'
Да, обязательно! noname, я на тебя рассчитываю ![]()
Неактивен
Невозможно заранее предусмотреть все свойста, которые могут понадобиться автору игры
похоже меня совершенно не поняли. не надо предусматривать ВСЕ свойства. ты щазз о библиотеке? я скажу, что нужно в библиотеке:
1) чтоб она не мешала делать всё по-своему, что бы могла быть легко изменена
2) при создании любого объекта значение всех неописанных свойств равно некоторому дефолтному значению(напр =0). это как в QSP и URQ- автору платформы не было известно заранее, какие переменные я буду использовать, но все они ДО изменения равны нулю(или пустой строке). и мне не нужно их специально прописывать ДО сравнения с чем-либо- операция сравнения вполне может оказаться первой операцией с впервые встреченной в коде переменной. в этом случае автору квеста достаточно прописать ТОЛЬКО те свойства объекта, которые важны для данного конкретного квеста
3) ну, раз уж платформостроителям так не можется без того, чтобы прописать за квестописателя реакции на команды, то пусть кроме "дефолтных" реакций (съесть_0, взять_0), которые _всегда_ выдают просто какое-то сообщение, и ничего не делают(раз уж в квесте не предусмотрено такое действие, то это- единственный нормальный способ реагирования, без риска похерить квест), будут ещё "нормальные" реакции. т е обычная реакция на это действие с предметом, исходя из того, что это действие над предметом возможно напр:(съесть_1, взять_1). (хотя, на моё ИМХО- эту работу можно оставить на долю автора. НО автору должно быть понятно, как это делать!). ну, и конечно, автору должно быть легко и удобно создавать свои нестандартные реакции съесть_2..съесть_n
// и да, идея называть свойства 'нормальными' именами, типа 'съедобно', 'отравлено', и т п сама просится в голову. НО она порочна в корне. числовое описание 0..n прямо указывает на то, как именно будет обработан такой объект, в то время как в случае описаний 'съедобный, мягкий душистый' и 'съедобный, но твердоватый, кислый, да ещё и отравленный'... ну, блин, если б мы задались целью создавать ИИ, то наверное так и стоило бы делать- между командами и объектами ввести ещё и третью сущность- свойства. НО в данном случае, процесс создания квестов это никак не упростит, а только усложнит. причём совершенно зря. так что вместо обработки смысловых свойств, предлагаю завести некий формальный суррогат свойств, а именно- просто указатель(номер) на конкретную функцию-обработчик. в этом случае сочинение словесных описаний только всё запутает, поскольку не всегда краткое описание будет полностью отражать все ньюансы в различии обработки
// и да, никак не обойтись без того, что бы автор какие-то функции прописывал сам. лучше стремиться к тому, что бы написание своих функций было как можно более простым и понятным процессом для авторов
uux, ну и причём тут ООП? ни Русский язык, ни Аристотелевская логика, ни моё больное воображение, никогда не претендовали на то, чтобы быть объектно-ориентированными. "по логике вещей"- я имел ввиду, что если для каждого предмета задавать способ его обработки, то это- херня полная, в перспективе ведущая к 'комбинаторному взрыву'. к счастью, ни RTADS, ни ТОМ не вынуждают пользоваться таким подходом. далее, развивая эту мысль- логично иметь отельно полностью прописанные объекты с их отношениями и свойствами, и отдельно- функции-обработчики, НЕ для каждого объекта, а по кол-ву свойств, связанных с данной командой(ну, раз уж свойства такие 'бутафорские',- то так). напр съесть_0, съесть_1 и съесть_2, которые вызываются из функции съесть- это уже больше, чем нужно в большинстве квестов. для некоторых команд может понадобиться чуть больше функций- зависит от квеста и от авторской задумки. это даже не особый подход, это- просто такой способ упорядочивания записи данных и методов
// блин, ну я заранее знаю, что ASBer не успокоится, и приплетёт словесные значения свойств. блин, шо ж делать-то? слышь, асб, мож сойдёмся на том, что бы где-нить в комментах писать, типа съесть_1 - это .... то - да сё, .... такой-то растакой-то случай .... , а циферки таки оставим, а?
Неактивен
что-то я не могу успокоиться. надеюсь, господа, задававшие вопросы по основной теме топика либо уже нашли ответ в теме, либо переспросят, если им всё ещё что-то не понятно
итак, в библиотеке имеем: для каждой команды "дефолтную реакцию" (выдаёт дефолтное сообщение, и ничего не делает), и почти для каждой- "нормальную реакцию". НО по-любому, автор платформы должен иметь ввиду, что для создания своего собственного хорошего квеста игрописатели захотят писать свои команды, или свои варианты реакции команд. и надо бы подумать о простоте и удобстве этого занятия
при создании нового объекта игрописателю достаточно задать лишь значения тех свойств, которые отличаются от дефолтных. (у каждого объекта ровно столько свойств, сколько всего команд. на самом деле больше- но об этих подробностях напишу чуть позже). далее, игрописатель прописывает реакции соотв команд на особые свойства(если они ещё не описаны). после этого он запросто может изменить свойства ещё парочки объектов- раз уж обработка готова. так же и с добавлением новой команды. изначально у всех объектов связанное с ней свойство будет дефолтным. но это будет легко изменить // простота и порядок- вот моя идея
и да, ООП удобен в программировании, но он никак не ограничивает меня в способах организации данных в моей программе. это же ясно, как ясный день. какой бы не была структура предназначенных для обработки данных - всегда можно написать программу в стиле ООП(либо структурном, либо ещё каком), которая с этим справится. стиль программирования никак не ограничивает область применения (не должен, во всяком случае)
Неактивен
noname написал:
uux, ну и причём тут ООП? ни Русский язык, ни Аристотелевская логика, ни моё больное воображение, никогда не претендовали на то, чтобы быть объектно-ориентированными.
Ладно, согласен, был неправ - слишком засмотрелся на заголовок темы. Про ООП ты действительно ни слова не говорил.
Неактивен