Инструменты пользователя

Инструменты сайта


subjects:programming:urql

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

subjects:programming:urql [2015/10/25 14:25]
создано
subjects:programming:urql [2017/06/01 20:02] (текущий)
Строка 1: Строка 1:
 +====== URQL ======
 +**URQL**((Universal Ripsoft Quest Language)) -- язык, служащий для написания игр на платформе URQ.
 +
 +**URQ**((Universal RipSoft Quest)) -- "​менюшная"​ платформа предназначенная в основном для создания небольших текстовых игр в жанре Interactive Fiction((Интерактивная литература)). Представляет собой общее название семейства интерпретаторов специализированного языка URQL.
 +
 +===== Достоинства и недостатки URQL =====
 +**Достоинства** языка:
 +  * Простота освоения.
 +  * Огромное количество примеров в виде уже созданных квестов.
 +  * Работа с предметами инвентаря.
 +  * Возможна динамическая генерация фрагментов кода, что позволяет самомодификацию программ.
 +  * Есть реализации под все основные ОС, включая:​ MS-DOS((без поддержки картинок)),​ Windows, Mac, GNU/Linux, Android, iOS и т.п.
 +**Недостатки**:​
 +  * Отсутствие многих возможностей обычных языков программирования.
 +  * Бедная графика.
 +  * Это очень специализированный язык, предназначенный только для создания "​менюшних"​ текстовых игр.
 +  * Разная реализация диалектов в разных программах.
 +Интерпретаторы:​ RipSoft URQ, URQ_DOS, FireURQ, AkURQ, INSTEAD (URQ module), OverUrK, BEST_URK, aurk, SURK и др.
 +
 +===== Включение файлов =====
 +Файлы, обрабатываемые движком должны иметь расширением ''​qst''​ или ''​qs1''​. Файлы ''​qst''​ являются обычными
 +текстовыми документами,​ а файлы ''​qs1''​ являются зашифрованной копией файлов ''​qst''​.
 +
 +Возможно подключение дополнительных файлов.
 +При этом, происходит статическая обработка при их загрузке,​ а подстановки не работают.
 +Метки и переменные - сквозные.
 +При упаковке,​ основной файл должен называться:​ ''​main.qst''​ или ''​game.qst''​
 +  include file-name-002.qst
 +  ​
 +===== Основные конструкции =====
 +Разделителем операторов является символ конца строки или амперсанд ''&''​.
 +
 +Регистр не имеет значения.
 +
 +====Комментарии====
 +Начинаются с точки с запятой и продолжаются до конца строки.
 +Допустимы также комментарии в стиле языка [[cpp|Си]],​ расположенные между ''/​*''​ и ''​*/'',​ в том числе многострочные.
 +  ; Комментарий1
 +  /* Комментарий2 */
 +  p текст ; Комментарий3
 +
 +=====Локация=====
 +Каждая локация игры в исходном тексте должна начинаться с метки (**начинается с двоеточия**,​ без пробела) и заканчиваться ''​end''​.
 +  :метка
 +  end
 +
 +Пробелы в метках поддерживаются,​ но являются нежелательными.
 +
 +Допускаются символы,​ обозначающие буквы русского и латинского алфавита,​ цифры, знак подчеркивания и знаки арифметических операций ''​+''​ и ''​-''​ (лучше не злоупотреблять странными названиями).
 +
 +Недопустимы символы:​ '';''​ ''/​*''​ ''​*/''​ ''&''​ '',''​
 +
 +:!: Из двух одинаковых меток выполняется только первая!
 +
 +При входе на локацию после перехода (''​Btn'',​ ''​Goto'',​ ''​Proc''​) происходит увеличение переменной с именем ''​count_имя-локации''​ на 1.
 +
 +Специальная локация '':​Сommon''​ выполняется перед указанной в операторе ''​btn''​ при нажатии по кнопке.
 +
 +''​end''​ -- конец локации.
 +Оператор остановки ''​End''​ приостанавливает работу интерпретатора,​ чтобы пользователь мог сделать выбор между предложенными ему вариантами действий.
 +Если меткой локация открывается,​ то оператором остановки завершается.
 +
 +====Переход-кнопка====
 +  btn метка,​Название кнопки
 +Интерпретатором создается кнопка - переход на другую локацию.
 +Пробелы до и после '​Название кнопки'​ игнорируются.
 +
 +При наличии локации ''​common''​ сначала выполняются операторы на локации ''​common'',​ потом осуществляется переход на метку "​метка"​.
 +
 +====Безусловный переход====
 +  goto метка
 +После выполнения оператора ''​goto''​ метка происходит мгновенное перемещение на указанную метку.
 +При наличии локации ''​common''​ операторы на локации ''​common''​ при переходе по ''​goto''​ **НЕ ВЫПОЛНЯЮТСЯ**.
 +
 +==== Ссылка ====
 +:?: Формат:​
 +<​code>​[[текст ссылки|название локации]]</​code>​
 +Пример:​
 +<​code>​pln текст [[текст|метка]].</​code>​
 +
 +==== Функция / процедура ====
 +Локацию можно использовать как подпрограмму,​ осуществив переход на неё с помощью оператора ''​proc''​.
 +  :​функция001
 +   p 2
 +  end
 +  :метка
 +   p 1
 +   proc функция001
 +   p 3
 +  end
 +  ; 123
 +
 +Нормально обрабатываются последовательные переходы по ''​proc''​ - цепочка ведется до тех пор, пока не встретится первый ''​end''​. При этом кнопки и сообщения во всех пройденных локациях **накапливаются**,​ но при обнаружении ''​end'''​а происходит не опрос пользователя,​ а возврат к предыдущему ''​proc'''​у и так до самого начала цепочки.
 +
 +:!: При наличии локации ''​common''​ операторы на локации ''​common''​ при переходе по ''​proc''​ НЕ ВЫПОЛНЯЮТСЯ и системная переменная ''​current_loc''​ не меняется. ​
 +
 +=====Ввод,​ Вывод сообщений=====
 +==== Вывод ====
 +  * ''​p''​ просто добавляет новый текст \\ <​code>​p текст</​code>​
 +  * ''​pln''​ добавляет текст и делает переход на новую строку (создает абзац). Работает даже без текста. \\ <​code>​pln текст</​code>​
 +  * ''​cls''​ -- очищает экран ото всяческой информации.
 +  * ''​clsb''​ -- :?: удаляет кнопки выведенные командой ''​btn''​
 +
 +==== Ввод ====
 +  * Запрос числа x  \\ <​code>​Input x</​code>​
 +  * Запрос текста X \\ <​code>​instr X=
 +input X</​code>​ Разница в том, что мы вначале инициализируем пустую текстовую переменную X.
 +
 +=====Переменные=====
 +Если переменная не создана,​ то при обращении к ней она равна нулю.
 +Вся работа с переменными должна осуществляться внутри локаций.
 +
 +Имя числовой переменной подчиняется общим требованиям к строке,​ но лучше не использовать других знаков,​ кроме букв русского или латинского алфавита,​ знака подчеркивания,​ цифр.
 +
 +Нельзя использовать ключевые слова типа ''​if,​ then, not, and, or''​ и др., так как в выражениях такие имена будут распознаваться как ключевые слова.
 +
 +Для строки допустимы пробелы и практически любые символы,​ кроме: ''#''​ ''​$''​ '',''​ '';''​ ''/​*''​ ''​*/''​ ''&''​
 +
 +^ ^числовые^текстовые^инвентарь^
 +^Объявление|<​code>​имя=42</​code>​|<​code>​instr имя="​текст"</​code>​| ​ ---  |
 +^Использование|<​code>​имя=имя+1
 +имя=имя-1
 +имя=3</​code>​| ​ ---  |<​code>​inv+ 1,имя
 +inv- 1,имя
 +inv_имя=3</​code>​|
 +^Вывод|<​code>#​имя$
 +p #​имя$</​code>​|<​code>#​%имя$
 +p #​%имя$</​code>​|<​code>#​inv_имя$
 +p #​inv_имя$</​code>​|
 +
 +Процесс обработки строки идет слева направо. Ищется пара ''#''​ и ''​$'',​ их содержимое обрабатывается и строка обрабатывается снова, до тех пор, пока не кончатся ''#''​.
 +  * ''#​$''​ -- вывод символа пробела
 +  * ''#/​$''​ -- вывод символа переноса строки
 +  * ''##​ascii-код$''​ -- вывода символа по ascii-коду
 +  * ''​perkill''​ -- уничтожает все переменные
 +
 +==== Выражения ====
 +В порядке возрастания приоритета:​
 +  not, унарные + и - , *, /, +, -, <, <=, [n] предмет,​ >, >=, = (==), <>, and, or, скобки ( )
 +Пример:  ​
 +  pln #​5*((2<​3)and(3<​4))+2$
 +  ; выдаст 7
 +
 +====Текстовые переменные====
 +Возможно сравнение
 +  if <​стр1>​=<​стр2>​
 +  if <​стр1>​="​текст"​
 +  if <​стр1>​=="​текст"​ ; оператор неточного сравнения.
 +Работает так:
 +  instr k=
 +  ;​Внимание:​ '​='​ после instr k
 +  pln Напишите направление:​
 +  input k
 +  if k=="​*север*"​ then pln Белые медведи else pln Где-где?​
 +В данном примере,​ распознаются по условию ''​then''​ фразы "​идти на север",​ "​север",​ "​3,​14север-юг"​ и даже "​куда угодно,​ только не на север!"​
 +Возможно и распознавание целой фразы
 +  if k=="​*идти*север*"​ then pln Белые медведи else pln Где-где?​
 +Распознает фразы "​идти на север",​ "​идти в северном направлении"​ (и ошибается на "​идти подальше от всех северных медведей!"​) Кавычки обязательны,​ так как они в операторе ''​if then''​ служат для формирования из строки текста - текстовой переменной.
 +Кроме символа ''​*''​ заменяющего произвольное количество других символов (в том числе и их отсутствие) возможно применение символа ''?'',​ который заменяет ОДИН произвольный символ (или его отсутствие).
 +  instr k=
 +  pln Оружие
 +  input k
 +  if k=="​меч?"​ then pln Меч! else pln Пусто.
 +Распознает и "​меч"​ и "​мечи"​ и ‘не распознает’ "​мечту легионера - М-16"
 +
 +====Инвентарь====
 +  * ''​invkill''​ -- без параметров удаляет все предметы из инвентаря.
 +  * ''​invkill предмет''​ -- удаляет «предмет» из инвентаря.
 +  * ''​inv+''​ -- помещает предмет в инвентарь. Можно использовать с указанием количества. \\ <​code>​Inv+ [Количество,​]Предмет</​code>​
 +  * ''​inv-''​ -- удаляет предмет из инвентаря. Можно использовать с указанием количества. \\ <​code>​Inv- [Количество,​]Предмет</​code>​
 +Примеры:​
 +  inv+ 10,​Рублей
 +  if Рублей then pln У тебя есть деньги! else pln Так денег-то нет!
 +  if inv_Рублей>​5 then pln У тебя больше 5 рублей!
 +  if 5 Рублей then pln У тебя 5 рублей или больше!
 +Специальные метки вида '':​use_<​предмет>''​ и '':​use_<​предмет>​_<​действие>''​ указывают на описания действий (по умолчанию — «осмотреть предмет») по отношению к предмету.  ​
 +  :Use_Inv ; действие Инвентарь/​Осмотреть
 +  :​Use_Inv_действие1 ; действие Инвентарь/​действие1
 +  :​Use_предмет1 ; действие предмет1/​Осмотреть
 +  :​Use_предмет1_действие1 ; действие предмет1/​действие1
 +
 +====Массивы====
 +Используя ''#​$''​ и ''#​%$''​ легко организовать работу с массивами.
 +
 +**Массив** -- это множество переменных,​ имеющих кроме имени еще и число-индекс,​ например ''​a1,​a2,​a3''​ и т.д.
 +Для двух-, трех-, n-мерных массивов нужно просто ''​2,​3,​n''​ индексов разделенных каким-либо разделителем,​ например ''​a1_1,​ клетка2|5,​ кубик4x67y0z''​.
 +
 +Вывод значений таких переменных - элементов массива осуществляется при помощи ''#​$'':​
 +  кубик4x67y0z=56
 +  x=4
 +  y=67
 +  z=0
 +  pln Ответ: #​кубик#​x$x#​y$y#​z$z$.
 +  ; Ответ: 56.
 +
 +=====Конструкции языка=====
 +====Условие if====
 +Условный оператор ''​if <​условие>​ then …''​ позволяет,​ в числе прочего,​ проверять наличие и/или количество чего-либо в инвентаре.
 +  If Условие then Действия
 +  if Условие then Действия1 else Действия2
 +Если выполняется Условие,​ то производятся Действия.
 +Действия - несколько операторов в одной строке,​ разделенных &.
 +Пример:​
 +  if 1=1 then p текст1 & p текст2 else p текст3 & p текст4
 +=== Логические операции ===
 +  * ''​and''​ -- логическое "​и"​.
 +  * ''​or''​ -- логическое "​или"​.
 +  * ''​not''​ -- логическое "​нет"​.
 +  * ''​quit''​ -- оператор немедленного выхода из квеста.
 +  * ''​tokens''​ -- разложение строки на «токены»,​ то есть куски текста,​ отделенные друг от друга разделителями.
 +  * ''​==''​ (два знака равно) -- оператор неточного сравнения. Дает истину при сравнении текстовой переменной со строкой по правилам сравнения регулярных выражений,​ т.е. с учетом ''​*''​ и ''?''​
 +
 +====Циклы====
 +Циклы реализованы посредством рекурсии((см.рекурсия)).
 +=== Пример ===
 +  i=0
 +  imax=25 ;​Инициализация счетчика цикла
 +  :loop1 ;Метка - начало цикла
 +    i=i+1 ;​Увеличение счетчика на 1
 +    if i<imax then p #​i$#​$&​goto loop1 else pln #/​$Конец цикла! ; "​страшное"​ выражение
 +
 +:!: Применяйте разные названия меток начала циклов.
 +
 +== Разбор условия ==
 +  if i<imax
 +проверяется,​ что i пока меньше imax, то есть 25
 +  then p #​i$#​$&​goto loop1
 +если да, то печатаем значение числовой переменной i (#i\$), потом пробел (#\$), потом разделитель операторов & и переход goto на метку loop1, после которой снова увеличивается i и опять всё по кругу, пока значение переменной i не достигнет 25. Тогда сработает ветка
 +  else pln #/​$Конец цикла!
 +печатает перенос строки (#/$) и фразу "​Конец цикла!"​
 +
 +===== Стандартные функции / переменные =====
 +  * ''&''​ -- конкатекация или объединение команд.
 +  * ''​save''​ -- :?: оператор,​ сохраняющий в файл вида ''​имя_квеста.qsv''​ текущие значения переменных и предметы инвентаря,​ чтобы потом можно было этот квест с сохраненного места продолжить. \\ **Использование:​** //save локация_для_восстановления//​ \\ <​code>​save game-tower</​code>​
 +  * <​code>​gametitle = "​Текст в заголовке"</​code>​
 +
 +==== Rnd ====
 +''​Rnd[x]''​ - системная переменная (только для чтения) которая при пустом значении x хранит в себе случайное значение от 0 до 1, включая 1, а при целом x (к примеру,​ X=6) выдает выдает целые значения (от 1 до 6 включительно в нашем случае).
 +При каждом обращении к переменной она принимает другое значение.
 +  случай1=rnd ;​Переменная случай1 может быть равна 0.78 - справедливо для URQ_DOS
 +  случай2=rnd4 ;​Переменная случай2 может быть равна 3
 +Но вот одна неувязочка:​ В URQ выводятся на экран целые числа, а URQ_DOS - десятичные дроби с сотыми долями.  ​
 +
 +==== Time ====
 +Переменная Time теоретически хранит число секунд прошедших с полуночи.
 +
 +==== pause ====
 +''​pause <​время>''​ -- прекращение выполнения инструкций на <​время>​ в миллисекундах (1 миллисекунда=1/​1000 доли секунды),​ причем пользователь в это время может выбирать варианты с помощью кнопок выбора и квест будет работать дальше,​ но по истечении <​время>​ выполнение квеста продолжиться,​ одновременно двух работающих "​pause"​ не может быть, новая затирает старую - движок о ней "​забывает",​ забывает также он о паузе при нажатии кнопки действия.
 +  pause 3000 ;Пауза на 3 секунды
 +
 +==== anykey ====
 +''​anykey [числовая_переменная]''​ -- оператор останавливает выполнение квеста до нажатия любой клавиши на клавиатуре,​ значение ASCII кода клавиши заносится в переменную "​числовая_переменная"​ и может быть использовано впоследствии.
 +При помощи этого оператора можно попытаться реализовать простейшую текстовую аркаду!
 +
 +==== current_loc ====
 +Системная переменная ''​current_loc''​ .
 +
 +=====Оформление=====
 +С оформлением проблемы.
 +У многих программ разные требования и возможности.
 +
 +==== Вывод картинки,​ классический ====
 +Есть вывод изображения,​ которая работают почти везде (кроме URQ_DOS).
 +  * ''​imagetype''​ -- тип изображения. :!: Задаётся числом.
 +    * 0 -- bmp
 +    * 1 -- ico
 +    * 2 -- rle
 +    * 3 -- wmf
 +    * 4 -- emf
 +    * 5 -- gif (без анимации)
 +    * **6** -- **jpg**
 +  * ''​image''​ -- имя файла без расширения и пути. :!: Задаётся числом!
 +В локации нужно написать:​
 +<​code>​
 +imagetype=6
 +image=1
 +; Будет показан файл 1.jpg
 +</​code>​
 +При этом, при переходе в другую локацию,​ картинка останется. И будет висеть до тех пор, пока не назначить другую.
 +
 +Можно указать ''​imagetype''​ в самой первой локации и тогда менять нужно будет только ''​image''​.
 +=== Обработчик нажатия ===
 +<​code>​
 +:​image_click
 + ; Вызывается при клике на "​основную"​ картинку  ​
 + pln Клик по картинке
 +end
 +</​code>  ​
 +=====Пример простой программы=====
 +<​code>​
 +;​Комментарий
 +:menu-start
 + invkill; Очищаем инвентарь
 + perkill; Очищаем переменные
 + imagetype=6;​ задаём формат картинок .jpg
 + image=0; Будет показан файл 0.jpg
 + gametitle = "​Название игры"​
 + pln #​%gametitle$
 + pln
 + btn game-start, Запустить игру
 +end
 +;proc
 +:2plus2
 + pln 4
 +end
 +;
 +:game-start
 + image=1
 + proc 2plus2
 + btn menu-start, Вернуться в меню
 +end
 +</​code>​
 +
 +=====Источники=====
 +  * Описание URQL для URQ_DOS версии 1.35 от 23.11.2006 года Автор: Korwin (Евгений Туголуков)
 +  * FireURQ:​Руководство_пользователя
 +  * URQ:​Материал из Википедии
 +  * и т.п.
  
subjects/programming/urql.txt · Последние изменения: 2017/06/01 20:02 —

На главную страницу Обучение Wikipedia Тестирование Контакты Нашли ошибку? Справка

Записаться на занятия

Ошибка Записаться на занятия к репетитору

Телефоны:

  • +7 (910) 874 73 73
  • +7 (905) 194 91 19
  • +7 (831) 247 47 55

Skype: eduVdom.com

закрыть[X]
Наши контакты