Форум » » Примеры кода » Ответить

Примеры кода

Nex: В этой теме будут примеры работающего кода для QSP.

Ответов - 84, стр: 1 2 3 4 5 All

noname: на сайте урк ваши фаны писали, что в QSP есть аналог xbtn - это правда? а есть ли аналог функции разбиения на токены tokens? можно ли писать QSP-квест в своём любимом блокноте(формат- виднузовский txt)? просто для интереса спросил - я готов к тому, что у вас всё по-другому

Nex: noname пишет: можно ли писать QSP-квест в своём любимом блокноте(формат- виднузовский txt)? Можно. Для этого понадобится txt2gam. Если ещё не читал Уроки QSP, читай. Справку скачай последнюю версию с http://qsp.su, смотри там работу со строками. Со строками в QSP можно сделать что угодно, если что-то конкретно нужно, то говори, что. xbtn и прочие "кнопки" делаются через ACT для URQL xbtn <метка>,{оператор&оператор},<Название кнопки> Для QSP ACT 'Название действия':оператор & оператор & GT 'локация'

noname: вот это по делу! уроки просмотрел ещё давно, но хочется начать побыстрее, а с непривычки в новую вещь врубиться сложно, так что буду рад, если будешь подсказывать даже то, что в уроках описано. лишний пример использования знакомых конструкций никогда не помешает . разбиения по словам или по токенам нет, я так понимаю?


Byte: можно сделать и по словам, и по символам, и вообще всё, что можно себе представить.

noname: Byte пишет: можно сделать и по словам, и по символам, и вообще всё, что можно себе представить. можно сделать это одно а кратко и просто- это другое. впрочем, я пока только начинаю разбираться.

noname: итак, примеры кода будем обсуждать в этой теме в массив занесено N имён, в другой массив N описаний (пара слов в каждом) задана переменная N и переменная M написана процедура, выводящая на экран описание номер M нужно: предложить игроку N кнопок с именами, по нажатию на любую из них в M заносится соответствующий номер и вызывается процедура которая выводит соответствующее описание ну потом- возврат процедуры, конец программы. решение от Byte: $name - массив из n имён $name[0]='name1' $name[1]='name2' $name[2]='name3' n=3 ind=0 :next act $name[ind]:m=arrpos(0, '$name', $selact) & gs 'вывод' ind=ind+1 if ind<n:jump 'next'

noname: работает! ну, кое-что начинает проясняться. и интерфейс очень даже ничего... да, и помогите лентяю: как из текста проги управлять окнами? хочу оставить только два окна: 1 куда все тексты буду выводить 2 для кнопочек внизу

noname: и ещё вопрос: иногда необходимо вызвать процедуру, которая предлагает игроку (не во всплывающем сообщении, а в игре) несколько кнопок на выбор. что сделает такая процедура: выведет кнопки и вернёт управление исходной программе или выведет кнопки и подождёт, пока игрок сделает свой выбор по-моему второй вариант полезней, но если возможны оба варианта- было бы совсем хорошо решение от Byte: по поводу п.2 - вариант 1. вариант 2 реализуется через дополнительную локацию. также можно сделать ограничение выбора по времени, etc...

noname: а ведь точно: допустим вызываются хоть 10-ть раз вложенные функции, но если последний переход был по goto то, выведя кнопки прога будет ждать их нажатия... а в действиях по каждой кнопке будет прописано дополнительное действие 'конец локации' (у вас он кажися минусиком делается) и тогда кнопка по нажатию своё дело сделает и вернётся из процедуры P.S. почему нельзя чаще, чем каждые 15сек постить сообщения?

noname: остался открытым вопрос про управление окнами: включать/отключать/изменять расположение и размер из проги - что возможно?

Byte: noname пишет: можно сделать это одно а кратко и просто- это другое. впрочем, я пока только начинаю разбираться. Смотря что нужно.. Для разбиения по символам можно, например, воспользоваться функцией mid. mid('строка',2,1) - получим букву 'т' mid('строка',4,1) - получим букву 'о' Для разбиения по словам можно воспользоваться поиском через instr пробелов и опять же функцией mid: [pre2] tokens=0 lastpos=1 :next pos=instr(lastpos,$stok,' ') $tokens[tokens]=$mid($stok,lastpos,iif(pos,pos-lastpos,len($stok))) lastpos=pos+1 tokens=tokens+1 if pos:jump 'next' [/pre2] Здесь идёт разбиение строки $stok.. в результате количество слов будет находиться в tokens, сами слова в массиве $tokens.

Byte: noname пишет: включать/отключать/изменять расположение и размер размеры и расположение окошек меняет сам играющий, как ему удобнее.. включение / выключение окошек описано в "Уроках" и помощи: SHOWACTS [#выражение] - если значение выражения отлично от 0, то показывает список действий, иначе скрывает его. SHOWINPUT [#выражение] - если значение выражения отлично от 0, то показывает строку ввода, иначе скрывает ее. SHOWOBJS [#выражение] - если значение выражения отлично от 0, то показывает список предметов, иначе скрывает его. SHOWSTAT [#выражение] - если значение выражения отлично от 0, то показывает дополнительное описание, иначе скрывает его. noname пишет: хочу оставить только два окна: 1 куда все тексты буду выводить 2 для кнопочек внизу SHOWINPUT 0 SHOWSTAT 0 SHOWOBJS 0

noname: Byte пишет: Здесь идёт разбиение строки $stok.. в результате количество слов будет находиться в tokens, сами слова в массиве $tokens. так то оно так. и процедурка вроде бы небольшая. а всё равно я буду вредничать, и писать покороче. так, например, для моего простейшего парсера, в QSP можно обойтись функцией удаления пробелов. (просто на случай, если игрок введёт пробел в начале и/или в конце строки). в остальном- команды парсера просты и понятны, и я жду от игрока их точного ввода. P.S. а кнопочки иногда всё равно нужны. P.P.S. и вообще, возможность делать полупарсер-полуменюшный квест очень прикалывает, только вряд ли я додумаюсь, как это получше использовать.

noname: да, 'Великая Пустота' меня малость потрясла. вот это задумка! только предисловие вначале хорошо бы продумать получше. делаю свои первые шаги в QSP: " #Начало gosub 'инициализация' gosub 'отображение ситуации' ------------ Конец Локации --------------- #инициализация set $поле11вид = 'лес' set $поле11выходы = '....юг..' set поле11юг = 22 set $поле22вид = 'море' set $поле22выходы = 'се......' set поле22се = 22 set $актёр1имя = 'Робинзон' set $актёр1вид = 'тощий европеец' set актёр1место = 22 set $актёр2имя = 'Пятница' set $актёр2вид = 'мускулистый дикарь' set актёр2место = 11 set игрок = 1 ------------ Конец Локации --------------- #отображение ситуации *pl $поле<<актёр<<игрок>>место>>вид ------------ Конец Локации --------------- "

noname: вопрос: как правильно написать строчку отображения ситуации? в данном случае она должна просто вывести 'лес' или 'море'- в зависимости от того, где находится игрок.

Nex: Я попробовал разобраться со вложенными подвыражениями, и не смог. O_O Ждём Байта.

noname: на самом-то деле дело не только во вложенных выражениях (ни в каком виде не получается вывести ЭТО одной строкой). ПОЯСНЯЮ: в приведённом мной примере организован массив в QSP это делается по-другому, ну и почему бы не сделать как положено: $полеимя[11]='лес'? А ПОТОМУ ЧТО: в локации может быть несколько персонажей и вещей и чего угодно ещё. и как тогда правильно писать строки: $поле11вещь2=37 (некто положил в локацию ещё одну вещь) $поле11вещей=2 (теперь в локации две бесхозных вещи)? P.S. вполне возможно, что это возможно, только в хелпе про многомерные массивы ничего не сказано. P.P.S. а со второй строчкой как? вот эти две строки связать с одним полем... разве в QSP это возможно?

Byte: noname, "подвыражения" доступны только для строк. в твоём случае можно использовать индексацию массивов через строки. сделать можно так: $вещи['<<индекс>>_<<вещь>>'] = 'камень' как вариант делать просто $вещь_локация['камень']='лес' и т.п. Nex, подвыражения вычисляются по одному и тому же принципу - в строке идёт поиск парных "<<" / ">>". то есть для вычисления вложенного подвыражения необходимо присутствие вложенной строки.. например: $ss='a' $pos2='s' 'pos<<$ss+''_<<$pos2>>''>>q' выведет 'posa_sq'

Byte: Описал подобный случай в новой справке...

noname: Byte пишет: noname, "подвыражения" доступны только для строк. в твоём случае можно использовать индексацию массивов через строки. это как? " #Начало gosub 'инициализация' gosub 'отображение ситуации' ------------ Конец Локации --------------- #инициализация set $полевыходы['лес'] = '....юг..' set $полеюг['лес'] = 'море' set $полевыходы['море'] = 'се......' set $полесе['море'] = 'лес' set $актёрвид['Робинзон'] = 'тощий европеец' set $актёрместо['Робинзон'] = 'море' set $актёрвид['Пятница'] = 'мускулистый дикарь' set $актёрместо['Пятница'] = 'лес' set $игрок = 'Робинзон' ------------ Конец Локации --------------- #отображение ситуации *pl '<<$актёрместо[<<$игрок>>]>>' ------------ Конец Локации --------------- "

noname: не то что бы код стал выглядеть понятней, зато работает. со стороны человек если глянет- не поймёт, что я написал. остался вопрос насчёт многомерных(например двумерных)массивов: Byte пишет: сделать можно так: $вещи['<<индекс>>_<<вещь>>'] = 'камень' в моём случае это как? на поле, например лес ложат вторую вещь, камень. т е поле#место$вещь2=37 на QSP: $место='лес' $вещь='2' $поле['<<$место>>_<<$вещь>>']='камень' м-да, возможности-то есть, но к конструкциям надо привыкнуть

noname: #Начало gosub 'инициализация' gosub 'отображение ситуации' ------------ Конец Локации --------------- #инициализация set $полевид['11'] = 'лес' set $полевыходы['11'] = '....юг..' set $полеюг['11'] = '22' set $полевид['22'] = 'море' set $полевыходы['22'] = 'се......' set $полесе['22'] = '11' set $актёримя['1'] = 'Робинзон' set $актёрвид['1'] = 'тощий европеец' set $актёрместо['1'] = '22' set $актёримя['2'] = 'Пятница' set $актёрвид['2'] = 'мускулистый дикарь' set $актёрместо['2'] = '11' set $игрок = '1' ------------ Конец Локации --------------- #отображение ситуации *pl '<<$полевид[$актёрместо[$игрок]]>>' ------------ Конец Локации ---------------

noname: приведённый выше пример работает. жаль, только что индексы массива всегда в конце, из-за этого непонятно, что к чему относится. например в $актёрместо['1'] = '22' 1-номер актёра, а 22-занимаемое им место логичнее выглядело актёр1место=22 ну да ладно, это дело десятое. вернусь с работы- проверю двумерные массивы

Byte: noname, даже если оставить так как ты написал - то зачем там подвыражение? можно так: #отображение ситуации $полевид[$актёрместо[$игрок]] ------------ Конец Локации ---------------

noname: Byte пишет: noname, даже если оставить так как ты написал а можно лучше? Byte пишет: то зачем там подвыражение? с непривычки. к тому же всё равно это выражение будет подвыражением в строчке типа: "вы видите <<..>>" спасибо за помощь!

Byte: noname, что-то ты перешёл на строки там где не нужно.. [pre2] #Начало gosub 'инициализация' gosub 'отображение ситуации' ------------ Конец Локации --------------- #инициализация set $полевид[11] = 'лес' set $полевыходы[11] = '....юг..' set полеюг[11] = 22 set $полевид[22] = 'море' set $полевыходы[22] = 'се......' set полесе[22] = 11 set $актёримя[1] = 'Робинзон' set $актёрвид[1] = 'тощий европеец' set актёрместо[1] = 22 set $актёримя[2] = 'Пятница' set $актёрвид[2] = 'мускулистый дикарь' set актёрместо[2] = 11 set игрок = 1 ------------ Конец Локации --------------- #отображение ситуации *pl $полевид[актёрместо[игрок]] ------------ Конец Локации --------------- [/pre2]

noname: хмм... QSP мне начинает нравиться... хрен с ними, с этими токенами. попробую перевести свою прогу с урк на qsp. там как раз подошёл к важному моменту: хочу избавиться от дублирования процедур- что бы действия игрока обрабатывались теми же процедурами, что и действия неписей. тогда и баги будет гораздо проще вылавливать- я буду уверен, что возможности обычного непися и непися, которым управляет игрок одинаковы.

noname: сделать можно так: $вещи['<<индекс>>_<<вещь>>'] = 'камень' что-то не очень понятно... массив типа a[x,y] как сделать? a,x,y- числа. как туды присвоить значение и как оттуда его получить?

Nex: Двумерный массив размерностью M на N : mass[x,y] отображается в виде одномерного так: mass[y*M+x] в QSP массивы - одномерные.

Byte: Из нового хелпа: Как организовать многомерный массив? 1) Самый удобный способ - использование массивов, индексируемых через строки. Например: [pre2] $карта_вещь['<<x>>_<<y>>'] = 'палка' карта_нпс['<<x>>,<<y>>,<<z>>'] = 12 [/pre2] 2) Отображение многомерного массива на одномерный. Например: [pre2] $карта_вещь[x+y*ширина] = 'палка' карта_нпс[x+y*ширина+z*ширина*высота] = 12 [/pre2]

Byte: noname пишет: сделать можно так: $вещи['<<индекс>>_<<вещь>>'] = 'камень' что-то не очень понятно... массив типа a[x,y] как сделать? a,x,y- числа. как туды присвоить значение и как оттуда его получить? если a,x,y - числа, то: [pre2] $имя_массива['<<a>>_<<x>>_<<y>>'] = 'строковое значение' $имя_массива['<<a>>_<<x>>_<<y>>'] & ! вывод значения [/pre2] если a - имя массива, то [pre2] a['<<x>>_<<y>>'] = 3 a['<<x>>_<<y>>'] & ! вывод значения [/pre2]

noname: Nex пишет: Двумерный массив размерностью M на N : mass[x,y] отображается в виде одномерного так: mass[y*M+x] не так всё просто- мне нужны массивы неизвестной/переменной размерности т.е. в первой версии было 4-ре локации, во второй- их уже 9-ть, потом придумаю, как их генерить- будет тысяча. хотелось бы, чтоб добавление локаций не было сопряжено с изменениями в программе. код должен быть легко расширяем хотя... если в M и N засунуть при инициализации максимальные координаты... всё равно не пойдёт: кол-во чего-нибудь(то же хранится по массивам) может увеличиваться по ходу игры. а ещё в большом проекте код должен быть легко читаем. mass[y*M+x] не очень наглядно будет выглядеть при использовании хотя, это-дело десятое

noname: м-да... в урке с массивами было гораааздо проще нравилась мне простота урки. и ещё: можно ли хелп сделать в виде не-help, а чего угодно другого: ваш help долго листать- не срабатывает функция ускоренного колёсика мыши. и желательно, чтоб это был один длиннючий лист, усыпанный гиперссылками. в *.chm и *.doc и *.html всё в порядке.

Byte: noname, новый хелп уже в chm. возможно, будет сразу pdf - вариант. а с простотой массивов - здесь просто немного построже.. в урке код и данные смешаны, это имхо как раз минус.. это "удобство" скрывает за собой кучу ограничений / ошибок. например, если в урке "a#x$_#y$", то аналогично в куспе "a['<<x>>_<<y>>']"..

noname: а если в урке поле11вещь7свойство2 ='несъедобно' поле11вещь7форма ='куб' поле11вещей_здесь = 9 и т д ну да ладно, всё равно это никто не использует. что мне нужно от платформы? простота работа с данными (урка устраивает, qsp то же, но не так) нормальное оформление (досурка не устраивает сложностями с русификацией) что мне нравится в qsp, так это: "(круглое | зелёное) яблоко" - где-то в хелпе вычитал надо это опробовать. для парсера- то, что нужно! хотя тогда уж лучше: "[круглое][зелёное]яблоко" поймёт и яблоко и круглое яблоко и зелёное яблоко и круглое зелёное яблоко (но не поймёт зелёное круглое яблоко) буду изучать всякие эти закорючки. хорошо бы их снабдить краткими примерами (хотя бы в одну строку) так как не ясно, как использовать /n перевод строки

noname: что-то я не понял. символы * и + применимы только к отдельным символам? а если "(круглое)*(зелёное)*яблоко" - не прокатит? к словам применим только | ? есть такой язык регулярный выражений не язык программирования, а скорее из какого-то раздела математики- так там было это попродуманнее. пытаюсь наковырять из QSP всё, что может пригодиться. получается странный набор... сразу скажу: возможности привлекательнее, чем на урке, но... но удобства- во дворе. причём во дворе у соседей.

noname: *pl STRCOMP($text,'.осм.+') выдаёт или '0' - если строка не соответствует шаблону или '-1' - если соответствует. почему '-1'? какие ещё значения можно ожидать от STRCOMP? в хелпе вообще не сказано, что возвращает эта функция. и вообще: в хелпе о каждой функции, как правило сказано, что она делает. в данном случае сравнивает то с этим, НО от ФУНКЦИИ требуется в первую очередь- возвращаемое значение. важно- что она возвращает. что она при этом делает- неважно, лишь бы не слишком долго.

noname: не подумайте, что я противник QSP- наоборот, я на него уже фактически перешёл. пишу 'живой игровой мир' - у меня появились свежие идеи. прога будет маленькая- для начала, чтоб пальцы размять.

Byte: noname, фактически, тебе должно быть важно возвратила она 0 или нет. "-1" (не 0) для QSP это "истина", "0" - ложь. в хелп добавил описание возвращаемого значения.. noname пишет: а если в урке поле11вещь7свойство2 ='несъедобно' поле11вещь7форма ='куб' поле11вещей_здесь = 9 и т д не понимаю, почему у тебя с этим какие-то сложности возникают... [pre2] $свойство['11_7_2'] = 'несъедобно' $форма['11_7'] = 'куб' вещей[11] = 9 [/pre2] можно и "более читаемо": [pre2] $свойство['поле11_вещь7_2'] = 'несъедобно' $форма['поле11_вещь7'] = 'куб' вещей['поле11'] = 9 [/pre2]

Byte: "(круглое)*(зелёное)*яблоко" - такое тоже допустимо.. будет работать для "круглоеяблоко", "круглоекруглоеяблоко", "зелёноеяблоко", "круглоезеленоеяблоко", "круглоекруглоезелёноезелёноеяблоко" и т.п. я так понял, ты хотел написать: "(круглое\s)?(зелёное\s)?яблоко" тогда [pre2] $pattern = '(круглое\s)?(зелёное\s)?яблоко' strcomp('круглое зелёное яблоко', $pattern) strcomp('круглое яблоко', $pattern) strcomp('зелёное яблоко', $pattern) strcomp('яблоко', $pattern) [/pre2] все строчки вернут -1. PS: это уже стандарт регулярных выражений.. то есть такой формат использует далеко не только QSP.. справку и учебники можно найти в интернете ("Perl Compatible Regular Expressions" / PCRE).

noname: ладно-ладно. НО хорошо бы, что бы в новом хелпе было упомянуто, какие значения может возвращать та или иная функция. в-принципе, информации о том, что ложь=0 , истина= не 0 вполне достаточно, НО в хелпе не было сказано и этого и я думал так: ложь=0, истина=1. не ожидал других значений.

Korwin: noname пишет: QSP мне начинает нравиться... Ну мы же тебе говорили! :)

Byte: noname, значение "-1" было выбрано не спроста :) в том же basic'е "истина" тоже -1. сделано для того, чтобы сократить число булевых / логических операций (т.к. отрицание 0 это не 1, а именно -1. отрицание -1 как раз 0). если бы 1 означала "истину", то пришлось бы вводить дополнительные операции, схожие с "and","or","no".. а это сильно запутывает новичков. для примера - в c/c++ есть "||","&&","!" и есть "|", "&", "~".

Byte: noname пишет: хорошо бы, что бы в новом хелпе было упомянуто, какие значения может возвращать та или иная функция. похоже, что только для strcomp забыл это указать :) уже добавил в новую версию...

noname: следующий код получился в процессе разборок с массивами и вставками: A['актёр1место']=22 $A['игрок']='1' $x='1' *pl $A['игрок'] *pl $x if $A['игрок']=$x: *pl 'O.K!' *pl A['актёр<<$x>>место'] *pl '--------------' *pl A['актёр<<$A['игрок']>>место'] *pl '--------------' как вы думаете, что выведет этот кусок кода? по результатам я понял, что с массивами и вставками я разобрался, а вот как теперь относиться к QSP? я попробую организовать данные ещё как-нибудь иначе, но терпение уже на исходе.

noname: Byte пишет: $свойство['11_7_2'] = 'несъедобно' свойство чего? вещи, непися, контейнера или ещё чего? в большом проекте я хочу видеть: $A['поле11вещь7свойство2'] где $A-все переменные создаваемого мира 'поле11вещь7свойство2'- второе свойство 7-й вещи из тех, что находятся на поле с координатами 1,1 (в моём случае мир пока небольшой)

Byte: в строке *pl A['актёр<<$A['игрок']>>место'] ошибка. у тебя строка содержит внутри строку, которая задана неверно. нужно через дублирование кавычек (кавычки, включенные в строку): [pre2] *pl A['актёр<<$A[''игрок'']>>место'] [/pre2]

Byte: Плюс код можно немного сократить до: ("*pl" можно убрать, также как лишние строки) [pre2] A['актёр1место']=22 A['игрок']=1 x=1 A['игрок'] x if A['игрок']=x: 'O.K!' A['актёр<<x>>место'] '--------------' A['актёр<<A[''игрок'']>>место'] '--------------' [/pre2]

noname: Byte пишет: в строке *pl A['актёр<<$A['игрок']>>место'] ошибка. у тебя строка содержит внутри строку, которая задана неверно. нужно через дублирование кавычек (кавычки, включенные в строку крайне странно... в чём тут логика? сдаётся мне, что эту 'особенность' языка хорошо бы исправить. собственно мне нужна такая строка: *pl ' Вы находитесь '+$A['поле<<A[''актёр<<$A[''игрок'']>>место'']>>вид'] надеюсь, сработает... без операторов *pl ИМХО текст проги труднее читать и вообще, зря вы так URQL изуродовали. добавили бы всяких функций- и ладно. ну и интерфейс тоже неплох. управление инвентарём и кнопками(ACT) реализовано- суперкласс! моя первая прога на qsp будет обязательно кнопочной. хочу с вашими кнопочками побаловаться.

noname: *pl ' Вы находитесь '+$A['поле<<A[''актёр<<$A[''игрок'']>>место'']>>вид'] не фурычит. не соответствие открывающих и закрывающих... причём не помогает делание $A[''актёр<<$A[''игрок'']>>место''] строковой переменной та же ошибка

Byte: noname, это ни разу не ошибка, всё логично.. в строках ты используешь ещё строки.. интерпретатор изначально должен получить исходную строку (пропустив "вложенные"). вложенность кавычек задается их дублированием.. то есть 2 подряд идущих апострофа "превращаются" в один апостроф. затем полученная строка проверяется на "подвыражения".. если нашли, то в подвыражении получаем ещё строку, которая, опять же, должна быть верно задана.. снова вложенность кавычек.. noname пишет: собственно мне нужна такая строка: *pl ' Вы находитесь '+$A['поле<<A[''актёр<<$A[''игрок'']>>место'']>>вид'] не сработает. опять же у тебя с вложенными кавычками проблемы.. [pre2] A['игрок']=1 a['актёр1место']=2 $a['поле2вид']='лес' *pl ' Вы находитесь ' + $A['поле<<A[''актёр<<A[''''игрок'''']>>место'']>>вид'] [/pre2] как это разбирается: сначала получаем строку 'поле<<A[''актёр<<A[''''игрок'''']>>место'']>>вид', и определяем кавычки, включенные в строку. получаем: поле<<A['актёр<<A[''игрок'']>>место']>>вид далее здесь есть подвыражения. при вычислении A['актёр<<A[''игрок'']>>место'] находим строку 'актёр<<A[''игрок'']>>место', и определяем кавычки, включенные в строку. получаем: актёр<<A['игрок']>>место далее здесь есть подвыражения. при вычислении A['игрок'] находим строку 'игрок'. в ней нет кавычек, включенных в строку. то есть при обратных подстановках получаем: $a['поле<<A[''актёр1место'']>>вид'] затем $a['поле2вид'] и далее 'лес'

Byte: noname пишет: причём не помогает делание $A[''актёр<<$A[''игрок'']>>место''] строковой переменной та же ошибка представь что ты ничего не знаешь об этой строке и начинаешь её разбирать.. находишь первую кавычку. считается, что началась строка.. в QSP строка завершается кавычкой, после которой нет ещё одной кавычки (если там 2 подряд кавычки, то это кавычка, включенная в строку).. то есть в твоём примере движок определяет сначала пустую строку '', что сразу же "ломает" дальнейший разбор.. в итоге получаем странные ошибки.

Byte: noname пишет: 'поле11вещь7свойство2'- второе свойство 7-й вещи из тех, что находятся на поле с координатами 1,1 если здесь "поле11" это 2 координаты, то нужно разделить их каким-нибудь символом "_","," ... иначе, к примеру, для строки "поле112" - не ясно, толи это координаты "1,12", толи "11,2".

Byte: noname пишет: и вообще, зря вы так URQL изуродовали. добавили бы всяких функций- и ладно. у QSP и URQ крайне отдалённое сходство. URQL уродлив изначально. повторю, что за поверхностной "простотой" скрывается куча ограничений (я говорю о непосредственно самом языке).

noname: Byte пишет: повторю, что за поверхностной "простотой" скрывается куча ограничений например? я так увидел, что qsp отличается только неудобством языка (чего стоят хотя бы те же кавычки!), добавленными полезными функциями и интерфейсом. очень схожая организация данных, но различный доступ к ним.

Byte: noname, например, в текущем синтаксисе URQL (можно ли формально описать грамматику языка?) невозможно реализовать нормальную работу со строками. могу заверить, что кавычки - это наоборот положительная сторона. кстати, в 5.4 с ними более удобно работать.. "схожая организация" - в отличии от URQ, QSP похож на Basic. в URQ не понятно, где идёт код, а где данные.. всё вперемешку подстановками..

noname: Byte пишет: невозможно реализовать нормальную работу со строками пример? Byte пишет: в URQ не понятно, где идёт код, а где данные.. всё вперемешку подстановками.. в qsp не понятная фигня с этими кавычками, к тому же ты сам убираешь *pl и тебе всё равно понятно, где данные, где код, хотя "x" - она переменная, но в то же время это её вывод на экран. в URQ гораздо удобнее и понятнее. и это не ИМХО. смотри сам: в строчке "поле11вещь7свойство2" я разделяю числа понятными и удобными мне "пояснениями" а ты предлагал: "$свойство['11_7_2']" - где тут понятность? для больших проэктов наглядность и простота критичны- иначе можно запутаться и никогда его не закончить что привлекает как в QSP, так и в URQ- так это "вольности" обращения с данными и подстановки <<>> #$ так же привлекает неструктурность и необъектность языка- на URQ я отдыхаю после дельфей, в которых обязательно всё заранее описывать и заморачиваться с организацией процедур. и ещё по поводу QSP: Byte пишет: представь что ты ничего не знаешь об этой строке и начинаешь её разбирать.. я бы понял, что в выражении 'fhg<<$fhg<<$a>>>>' кавычки соблюдены. начинаем разбор с самого глубокого вхождения (насколько я понял, в ОПЗ ты не переводишь). делаем подстановку переменной $a (тут сложностей не больше, чем если бы вместо <<>> были обычные круглые скобки), допустим, она равна 'qqq'-> подставляем переменную $fhgqqq-> подучаем искомую строку. конечно, одинаковые кавычки открытия и закрытия уменьшают читабельность кода и добавляет головной боли автору языка, конечно двойной знак <<>> не так краток, как #$. НО своими 2*n кавычками во вложениях ты ещё раз показал мне, что QSP- хотя и лучшее, что есть на сегодняшний день, но томится это лучшее в уродливом синтаксисе. Byte пишет: в отличии от URQ, QSP похож на Basic. проги на URQ пожалуй, больше похожи на Basic.

Byte: noname пишет: пример? пример - код: if #aaa$ = sdsdsds sdfsdf then oooo=7 если строка aaa это "sdfsdf<4 then end & " или "sdasd = asdasd" то при подстановке будет: if sdfsdf<4 then end & = sdsdsds sdfsdf then oooo=7 if sdasd = asdasd = sdsdsds sdfsdf then oooo=7 и т.п. аналогично - подстановки среди другого кода.. данные смешались с кодом. как задать строку "asdfasd asdasd & asdasd & if sdsd else" без кавычек? как определить где начало, а где конец строки? noname пишет: а ты предлагал: "$свойство['11_7_2']" - где тут понятность? был предложен и "более понятный" вариант. а если при подстановке в "поле11вещь7свойство2" вместо 11 / 7 / 2 будет строка с пробелом или недопустимым в имени переменной символом - будет ошибка при выполнении. см. 1ый "пример". noname пишет: я бы понял, что в выражении 'fhg<<$fhg<<$a>>>>' кавычки соблюдены. это не логично. идея такова, что внутри << и >> находится выражение. в данном случае $fhg<<$a>>. здесь уже нет строки, поэтому <<$a>> воспринимается как часть выражения. для того, чтобы воспринималось как подвыражение, необходима строковая константа. чтобы сделать то, что ты предлагаешь, необходимо присутствие подвыражений не только для строк, но и для кода. а это уже отрицательно скажется на языке. noname пишет: проги на URQ пожалуй, больше похожи на Basic. смешно :)

noname: Byte пишет: как задать строку "asdfasd asdasd & asdasd & if sdsd else" без кавычек? кавычки в URQ использовать можно. я использовал. строки, подобные твоей пробовал- всегда можно реализовать понятным для интерпретатора способом и вывести что угодно (хотя не знаю, зачем выводить такое) и строка будет простой для понимания и вообще, я не знаю такого случая, когда бы синтаксис URQL помешал сделать что-либо мой же пример более реален. на дельфях ему соотвествуют массивы записей с массивами в них. точнее, не массивы, а какие-нибудь индексированные связанные списки (через указатели) я стремлюсь не напечатать какое-нибудь выражение с невыразимым сочетанием кавычек (кому это нужно?) а реализовать кратко, просто и понятно свою структуру данных. похоже, что в QSP ты хотел, чтоб можно было вывести абсолютно любую строку как можно проще- похвальное желание. но ты увлёкся и переборщил. да, на урке может быть и можно придумать трудновыводимую строку, но это можно обойти (с трудом) на куспели можно (с трудом) работать со структурами данных, аналогичным вышеупомянутым Byte пишет: необходимо присутствие подвыражений не только для строк, но и для кода вот, этого-то QSP и нехватает. URQL хорош свободой программирования в QSP за каким-то непонятным делом её урезают. неужели ты на самом деле думаешь, что проги на QSP понятнее аналогичных на URQL? ну, бэйсик я почти не знаю- спорить не буду и ещё: при отладке "в строке 43 ошибка" - как её найти? пишу потихонечку небольшую прогу на куспели. дело продвигается со скрипом, но хочу разобраться. по-моему rand(1,2) в 75% случаях даёт '1' - буду сделать спец-прогу для проверки рандома.

noname: извиняюсь, с random всёв порядке. просто в моём двумерном массиве несколько раз подряд получилось очень необычное распределение иду вдоль одной строки, и вижу одно и тоже. а зачем jump-у кавычки? при отладке "в строке 43 ошибка" - как её найти?

Byte: noname пишет: вот, этого-то QSP и нехватает. этого не было и не будет, так как приводит к проблемам. при отладке "в строке 43 ошибка" - как её найти? там указано имя локации, на ней в "выполнить при посещении" ищешь 43ю строку.. QGen 3 - старый, один из минусов - не показывает номера строк :( сейчас (пока нет более нового QGen'а) вариант - писать в текстовом редакторе, там проще с номерами строк. по-моему rand(1,2) в 75% случаях даёт '1' - буду сделать спец-прогу для проверки рандома. используется генератор псевдослучайных чисел из стандартной библиотеки. PS: у меня, честно говоря, нет никакого желания что-то писать про урку и её подстановках. повторю, что это фактически 2 разных языка, с разными принципами исполнения кода. насчёт строк - тоже не хочу объяснять то, что кажется мне очевидным.

noname: есть ли возможность сделать переход на метку другой локации? т е войти не в начало локации, а куда-нибудь в середину или конец. это нужно для реализации ожидания нажатия игроком баттонов, если баттоны вызываются из локации 'ход_игрока', на которую переходили по gosub. после обработки ACT-а нужно вернуться в конец локации 'ход_игрока', которая передаст управление вызвавшей её локации. пользуюсь gosub так как ход_игрока вызывается в цикле, который перебирает всех персонажей (один из которых- игрок), и после обработки ход_игрока нужно продолжитьь обработку цикла.

Byte: именно в том виде, что ты описал - например, через дополнительную переменную, которая хранит имя метки.. то есть на локации, где необходимо "продолжение работы с заданной метки", в самом начале делаешь проверку: [pre2] if $ret!'':jump $ret ...код... :lab1 ..код.. (продолжение от какого-то действия) exit :lab2 ..код.. exit [/pre2] при вызове из act - $ret='lab1' & gt $prevloc ну или $ret='lab2' & gt $prevloc

Nex: noname очень странная реализация - наверняка можно было бы сделать гораздо проще, без таких извращений, ну ладно. перед вызовом gosub 'ход_игрока' запоминай имя текущей локации в переменную, вместо gosub пиши goto: $вернуться=$CURLOC & goto 'ход_игрока' При добавлении действия делай так: ACT 'Действие такое-то': оператор & оператор & choice_taken=1 & goto 'ход_игрока' В локации 'ход_игрока', в самом начале пишем if choice_taken:choice_taken=0 & jump 'after_choice'

Byte: Одно и то же написали :)

noname: Nex пишет: noname очень странная реализация - наверняка можно было бы сделать гораздо проще, без таких извращений, ну ладно. что, вызов процедуры через gosub так странно, или то, что процедура может кнопочки-ACTы делать? или то, что мне хотелось бы, чтоб игрок успевал на них нажать? ну я понимаю- странно то, что игрок у меня- обычный персонаж. точнее игрок- играет за любого из персонажей игры. и ходит в порядке общей очереди. такого ещё не делали и поэтому начинает проявляться неуниверсальность языка и всякие неувязки. ещё скажите, что я пример придумал специально под урку.

Byte: "странно" то, что ты хочешь весь цикл на одной локации уместить (все итерации). вообще что приходило в голову - на одной локации делать выбор, после него переходить на ещё одну, в которой реализовано "тело цикла".. тогда никаких jump'ов не нужно. noname пишет: начинает проявляться неуниверсальность языка и всякие неувязки. о какой "универсальности" идёт речь? на мой взгляд кусп более универсален (возможности языка), чем урка. взять хотя бы то, что ты в урк-стиле пишешь на куспе. возможно ли обратное? :)

noname: Byte пишет: взять хотя бы то, что ты в урк-стиле пишешь на куспе. возможно ли обратное? :) на урк возможно делать мои задумки (они там выложены в отдельной теме). я в урке года полтора назад написал два квеста не пользуясь почти ничем, кроме btn и pln т е языка практически не знал (чтоб разобраться с массивами запросил qwerty-bench-vic) потом забросил эту тему по личным причинам сейчас, имея такую задумку я за пару часов освоился с языком и создал пример№1 на тему живого игрового мира, ну и далее- в той же теме. остановился только из-за того, что хочу сделать то же самое на qsp (ну ещё из-за пассивности ихнего форума) на урк можно легко и просто писать проги в стиле урк можно ли на qsp писать в стиле qsp и что из этого выйдет? - можно. но сложно. варианты писать на урк в стиле qsp, как и наоборот, меня не интересуют. так же, как и возможность вывести строку, специально подобранную для того, чтоб её было невозможно вывести. у меня вполне нормальные авторские запросы. задумка- необычная. ну и что?

Byte: имхо просто у тебя за спиной багаж "установок" от урки. потому тебе и кажется всё неудобным.

noname: ну, буду осваиваться. некоторые фичи на qsp просто подкупают: у меня готов пример, где всё доступное игроку заносится в OBJ, выбираешь объект (пока только направления: сзюв), к примеру, север: видишь сразу в доп окне краткое описание северной локации и что там есть в панели действий видишь: "идти на север" (позже планирую вставить возможность "бросить кинжал в минотавра" - если он там и действия с дверями/окнами северной стены локации). выбираешь меч и видишь его описание в доп окне, а в панели действий- что с ним можно сделать. я сумел сделать всё корректно, хоть баги и мучали поначалу. P.S. для Зоны было бы полезно реализовать такое "подглядывание" в соседнюю локацию

Byte: Королева и конь (порнофильм?) noname, конь и ферзь ходят по-разному же :) и ещё - не понимаю, зачем тут массивы.. [pre2] #Начало showobjs 0 & showinput 0 & showstat 0 конь_x=2 & конь_y=1 ферзь_x=4 & ферзь_y=8 ход_коня=0 'Начало системы координат доски находится в её левом нижнем углу.' act 'Начать':gt 'ход' - #ход 'Ваша позиция: <<конь_x>>,<<конь_y>>' 'Позиция ферзя: <<ферзь_x>>,<<ферзь_y>>' '----------' ход_коня=no ход_коня & xgt $iif(ход_коня, 'ход коня', 'ход ферзя') - #ход коня x = конь_x & y = конь_y if x>2 and y<8:act 'Идти на (<<x-2>>,<<y+1>>)':конь_x=x-2 & конь_y=y+1 & xgt 'ход' if x>1 and y<7:act 'Идти на (<<x-1>>,<<y+2>>)':конь_x=x-1 & конь_y=y+2 & xgt 'ход' if x<8 and y<7:act 'Идти на (<<x+1>>,<<y+2>>)':конь_x=x+1 & конь_y=y+2 & xgt 'ход' if x<7 and y<8:act 'Идти на (<<x+2>>,<<y+1>>)':конь_x=x+2 & конь_y=y+1 & xgt 'ход' if x<7 and y>1:act 'Идти на (<<x+2>>,<<y-1>>)':конь_x=x+2 & конь_y=y-1 & xgt 'ход' if x<8 and y>2:act 'Идти на (<<x+1>>,<<y-2>>)':конь_x=x+1 & конь_y=y-2 & xgt 'ход' if x>1 and y>2:act 'Идти на (<<x-1>>,<<y-2>>)':конь_x=x-1 & конь_y=y-2 & xgt 'ход' if x>2 and y>1:act 'Идти на (<<x-2>>,<<y-1>>)':конь_x=x-2 & конь_y=y-1 & xgt 'ход' - #ход ферзя gs 'проверка для коня' & gs 'проверка для ферзя' :выбор x=ферзь_x & y=ферзь_y d=rand(1,8) & l=rand(1,7) if d=1:y=y-l if d=2:x=x+l & y=y-l if d=3:x=x+l if d=4:x=x+l & y=y+l if d=5:y=y+l if d=6:x=x-l & y=y+l if d=7:x=x-l if d=8:x=x-l & y=y-l if y>8 or x>8 or x<1 or y<1:jump 'выбор' ферзь_x=x & ферзь_y=y xgt 'ход' - #проверка для ферзя if ферзь_x=конь_x or ферзь_y=конь_y:xgt 'победа ферзя' разница_x=конь_x-ферзь_x if ферзь_y+разница_x=конь_y or ферзь_y-разница_x=конь_y:xgt 'победа ферзя' - #проверка для коня if конь_x=ферзь_x and конь_y=ферзь_y:xgt 'победа коня' - #победа ферзя 'Вы проиграли!' - #победа коня 'Вы победили!' - [/pre2]

noname: Byte, когда я выкладываю кусок кода- его легко копировать с экрана когда ты выкладываешь- у тебя нет символов переноса строки. ну что ж. буду править. сделал без массивов- тем лучше, хотя конструкция вида длинаXширинаY - уже массив

noname: м-да, пошли по упрощениям: 1. без наглядного представления тяжело тестировать (и получать удовольствие от реализации) - но мне, в принципе, этого и не надо- мне для дела хотя, когда на досурке был выложен qwerty-bench-vic им многие заинтересовались 2. выбора за кого играть- нет? ну и ладно. я в принципе, понял, как разобраться с проблемой, возникавшей при отрисовке кнопок в процедуре, вызываемой из цикла. пожалуй, разобью цикл по локациям. не то, чтоб это было удобно, но всё же не так уродливо, как искуственно монтировать jump в другую локацию. p.s. в-общем, спасибо и на этом.

Byte: Небольшая доработка (рисуется поле и ход ферзя выбирается немного по-другому): [pre2] #Начало usehtml=1 & fsize=14 showobjs 0 & showinput 0 & showstat 0 конь_x=2 & конь_y=1 ферзь_x=4 & ферзь_y=8 ход_коня=0 'Вы играете белым конём.' act 'Начать':gt 'ход' - #ход белая=-1 '<table border="1">' i=8 :строки *p '<tr height="30">' j=0 :колонки $поле=' ' белая=no белая if i>0 and j>0:$цвет=$iif(белая, 'FFFFFF', 'DDDDDD') else $цвет='00FF00' if j=0:$поле=$str(i) if i=0:$поле=$str(j) if ферзь_x=j and ферзь_y=i:$поле='Ф' if конь_x=j and конь_y=i:$поле='К' *p '<td width="30" bgcolor="#<<$цвет>>"><<$поле>></td>' j=j+1 if j<=8:jump 'колонки' *p '</tr>' i=i-1 if i>=0:jump 'строки' '</table>' 'Ваша позиция: <<конь_x>>,<<конь_y>>' 'Позиция ферзя: <<ферзь_x>>,<<ферзь_y>>' ход_коня=no ход_коня & xgt $iif(ход_коня, 'ход коня', 'ход ферзя') - #ход коня x = конь_x & y = конь_y if x>2 and y<8:act 'Идти на (<<x-2>>,<<y+1>>)':конь_x=x-2 & конь_y=y+1 & gt 'ход' if x>1 and y<7:act 'Идти на (<<x-1>>,<<y+2>>)':конь_x=x-1 & конь_y=y+2 & gt 'ход' if x<8 and y<7:act 'Идти на (<<x+1>>,<<y+2>>)':конь_x=x+1 & конь_y=y+2 & gt 'ход' if x<7 and y<8:act 'Идти на (<<x+2>>,<<y+1>>)':конь_x=x+2 & конь_y=y+1 & gt 'ход' if x<7 and y>1:act 'Идти на (<<x+2>>,<<y-1>>)':конь_x=x+2 & конь_y=y-1 & gt 'ход' if x<8 and y>2:act 'Идти на (<<x+1>>,<<y-2>>)':конь_x=x+1 & конь_y=y-2 & gt 'ход' if x>1 and y>2:act 'Идти на (<<x-1>>,<<y-2>>)':конь_x=x-1 & конь_y=y-2 & gt 'ход' if x>2 and y>1:act 'Идти на (<<x-2>>,<<y-1>>)':конь_x=x-2 & конь_y=y-1 & gt 'ход' - #ход ферзя gs 'проверка для коня' & gs 'проверка для ферзя' x=ферзь_x & y=ферзь_y влево=x-1 & вправо=8-x & вверх=8-y & вниз=y-1 k=0 if вниз>0:ход[k]=1 & длина[k] = вниз & k=k+1 if вниз>0 and вправо>0:ход[k]=2 & длина[k] = min(вниз, вправо) & k=k+1 if вправо>0:ход[k]=3 & длина[k] = вправо & k=k+1 if вправо>0 and вверх>0:ход[k]=4 & длина[k] = min(вправо, вверх) & k=k+1 if вверх>0:ход[k]=5 & длина[k] = вверх & k=k+1 if вверх>0 and влево>0:ход[k]=6 & длина[k] = min(вверх, влево) & k=k+1 if влево>0:ход[k]=7 & длина[k] = влево & k=k+1 if влево>0 and вниз>0:ход[k]=8 & длина[k] = min(влево, вниз) & k=k+1 выбор=rand(0,k-1) d=ход[выбор] l=rand(1, длина[выбор]) if d=1:y=y-l if d=2:x=x+l & y=y-l if d=3:x=x+l if d=4:x=x+l & y=y+l if d=5:y=y+l if d=6:x=x-l & y=y+l if d=7:x=x-l if d=8:x=x-l & y=y-l ферзь_x=x & ферзь_y=y gt 'ход' - #проверка для ферзя if ферзь_x=конь_x or ферзь_y=конь_y:xgt 'победа ферзя' разница_x=конь_x-ферзь_x if ферзь_y+разница_x=конь_y or ферзь_y-разница_x=конь_y:xgt 'победа ферзя' - #проверка для коня if конь_x=ферзь_x and конь_y=ферзь_y:xgt 'победа коня' - #победа ферзя 'Вы проиграли!' - #победа коня 'Вы победили!' - [/pre2] UPD: Выложил пример в каталоге, раздел "В помощь разработчикам игр / Примеры, заготовки игр".

noname: спасибо! графика вдохновляет. даже не знаю за что больше хочется взяться: приделать буковки a..h и картинки фигур к твоему примеру, или свою прогу ковырять дальше. наверное, буду ковырять свою...

WladySpb: Касательно РПГ. Для вычисления повреждений по системе AD&D бросаются кубики, сначала пробовал в коде локации "бой" указывать вычисление урона как damage=rand(weapon_min_dam,weapon_max_dam) первая и вторая переменные это соответственно минимальный и максимальный урон. Потом вспомнил одну особенность работы с костями.. При уроне 1d8 вполне подходит вычисление через rand(1,8) а вот при уроне 2d4 нет. Дело в том, что хотя диапазон примерно тот же, но вероятность выпадания значений другая. Грубо говоря, при 1d8 есть 1/8 вероятность любой цифры. А при 2d4 есть 1/16 вероятность выпадения 2 или 8, 2/16 выпадения 3 или 7, 3/16 выпадения 4 или 6, и 4/16 выпадения 5. Непринципиально, но мысль запала. Увеличивать и без того громоздкий код боёвки не стал, но набросал функцию) result=0 :1 result=result+rand(1,args[1]) args[0]=args[0]-1 if args[0]>0: jump '1' В функцию передаются два аргумента: первый это количество костей, второй - грани кости. То есть для броска 2d4 передаём 2 и 4. На мой взгляд, получилось довольно изящно) Первую строчку наверное можно убрать, это так, перестраховка

Ajenta: WladySpb Прикольно, надо будет посмотреть как оно в коде получится.

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

WladySpb: Ещё, не сказал бы что оригинальный ход, но мне он пришёл в голову случайно,и не факт что до него все додумались) Часто нужно просто проверить посещалась ли локация, или - сколько раз посещалась. Для этого в локации-обработчике onnewloc прописываем либо: vizited['<<$curloc>>']=1 либо: vizited['<<$curloc>>']=vizited['<<$curloc>>']+1 и после этого там где надо просто проверяем: if vizited['название_локации']=1:

Byte: '<<$curloc>>' это то же самое, что просто $curloc: vizited[$curloc]=1 Вроде такой пример есть в стандартном хелпе.

WladySpb: Byte А да) Есть в faq - я туда не заглядывал давно..

Byte: Кстати, при разработке парсера могут пригодиться такие конструкции: [pre2] $осмотреть['банка']=" 'Обычная банка' " $использовать['банка']=" if $curloc='asdasd': 'что-то' else 'пример' end "[/pre2] Выполняем это через DYNAMIC $осмотреть[$obj] / DYNAMIC $использовать[$obj]

poweruser: А аргументы у dynamic поддерживаются?

Byte: В версии 5.6.2 будут.



полная версия страницы