Объекты в IF языках программирования это хорошо - можно задать общие для объектов вещи и более не мучиться... Проблемы есть, но их не много и они довольно просто решаются/избегаются. Это, например, приписывание не тех свойств объектам = простая невнимательность. Но, возможно, кто-нибудь скажет, что ООП (объектно-ориентированное программирование) сложнее, чем линейное программирование.
Короче не знаю.
Просто ищу оправдание внезапно наплывшему желанию написать простую платформу на Python для IF. Команды там будут обрабатываться совершенно линейно, как в "Васе". Т.е. те команды, кот. программист не задал пониматься просто не будут. Хотя будут некоторые вспомогательные механизмы - такие, как маски команд. Скажем, игрок набирает "отдать топор гоблину", находясь в комнате room1. Тогда последовательно будут вызываться следующие команды: room1_отдать_топор_гоблин, room1_отдать_топор_*, room1_отдать_*_гоблин, room1_отдать_*_*, room1, отдать_топор_гоблин, отдать_топор_*, отдать_*_гоблин, отдать_*_*, *. Вот примерно так. Надеюсь, что идея понятна. Следует ли пытаться сделать такую систему, или она по сути слишком примитивна и не стоит затраченного времени? А?
Неактивен
Eten, см. личку.
Неактивен
Ох... Полный оффтоп пошел - прошу прощения у тех, кто писал в эту тему с совсем другими целями, нежели полемика по поводу ООП... Но не ответить 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)
Неактивен
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)
Неактивен
noname написал:
по логике вещей, вся обработка должна быть прописана отдельно от описания структуры данных.
Поправьте меня, программисты-профессионалы - но, по-моему, инкапсуляция методов (обработчиков) в объекте - это составная (и практически неотъемлемая) часть ООП.
Неактивен
noname написал:
uux, ну и причём тут ООП? ни Русский язык, ни Аристотелевская логика, ни моё больное воображение, никогда не претендовали на то, чтобы быть объектно-ориентированными.
Ладно, согласен, был неправ - слишком засмотрелся на заголовок темы. Про ООП ты действительно ни слова не говорил.
Неактивен