[[help:tuples|Назад: Кортежи]]
====== Условия ======
Условия — это такие особые конструкции в **QSP**, которые позволят сделать вашу игру по настоящему интерактивной. Они позволяют разветвлять события, происходящие в игре в зависимости от уже сложившихся условий, и таким образом вносить разнообразие в игровой процесс. Операторы, которые используются в конструкциях условий, в программировании называются **операторами ветвления**.
===== Операторы условий =====
* ''%%IF%%'' — основной оператор для записи конструкций условий. Конструкции, записываемые с помощью этого оператора (назовём их "простыми условиями"), имеют две формы: однострочную и многострочную, — и в общем виде выглядят так:
! однострочная форма записи
IF [#выражение]: {команда 1} & {команда 2} & …
! многострочная форма записи
IF [#выражение]:
{команда 1}
{команда 2}
…
END
В данном случае, если верно условие ''[#выражение]'', выполняются команды ''{команда 1}'', ''{команда 2}'' и т.д. Для однострочной формы записи это будут только те команды, которые идут в той же строке, что и оператор ''IF'' до конца строки; а для многострочной формы записи это будут те команды, которые идут в последующих строках после двоеточия и до специального ключевого слова ''END''.
* В качестве условия могут выступать операции сравнения, логические операции и иные выражения, возвращающие числовые значения.
* Ключевое слово ''%%END%%'' при многострочной форме записи должно стоять отдельной строкой.
* Если условие ''%%[#выражение]%%'' не верно, команды выполнены не будут.
* Примеры однострочной формы записи условий:
! если сумма a и b равна двум,
! переменной c присваивается значение 30
if a+b=2: c=30
! Если в инвентаре нет апельсина, выводится текст
if no obj "Апельсин": pl "У Вас нет апельсина."
! это тоже простая однострочная форма
if ((a+b)/c)=45+54 or (b<5 or c>45) and no obj 'лопата' and $f=$vvv+'RRRRR': p 'OK' & goto 'Next'
* Примеры многострочной формы записи условий:
if библиотека = 0:
узнал_о_тусовке = 0
библиотека_вернулся = 1
gt 'библиотека'
end
if a+b=2:
c=30
end
* **Обратите внимание!!!** При многострочной форме записи после двоеточия в той же строке, в какой находится оператор ''%%IF%%'', не должны идти никакие команды, иначе плеер посчитает такой оператор условия однострочным, и команды в последующих строках будут выполняться в любом случае, независимо от того, верным окажется условие или нет. Пример такой ошибочной записи:
if библиотека = 0: узнал_о_тусовке = 0
библиотека_вернулся = 1 &! эта строчка будет выполняться в независимости от верности условия
gt 'библиотека' &! и эта
end &! ключевое слово end - просто игнорируется
* ''%%ELSE%%'' — ключевое слово, использующееся совместно с оператором ''%%IF%%'', и которое служит для предоставления альтернативы, если условие не выполнено. Ключевое слово ''%%ELSE%%'' так же имеет две формы записи: однострочную и многострочную. Многострочную форму записи ''%%ELSE%%'' можно использовать только в многострочной конструкции оператора ''%%IF%%'', тогда как однострочную форму записи можно использовать как в однострочной, так и в многострочной, конструкции оператора ''%%IF%%''. Общая форма записи:
! однострочная форма записи
IF [#выражение]: {команда д1} & {команда д2} & … ELSE {команда н1} & {команда н2} & …
! в многострочном IF
! многострочная форма ELSE
IF [#выражение]:
{команда д1}
{команда д2}
...
ELSE
{команда н1}
{команда н2}
...
END
! однострочная форма ELSE
IF [#выражение]:
{команда д1}
{команда д2}
...
ELSE {команда н1} & {команда н2} & ...
! команды в следующих строках
! до END игнорируются
END
Здесь, если условие''[#выражение]'' верно, выполняются команды от двоеточия до ключевого слова ''ELSE'', а если условие ''[#выражение]'' не верно, выполняются команды от ключевого слова ''ELSE'' и до конца конструкции условия.
* После ''%%ELSE%%'' можно ставить, а можно не ставить двоеточие.
* При однострочной форме записи:
* и команды и ключевое слово ''%%ELSE%%'' должны быть записаны в одной строке
* окончанием альтернативного списка команд является конец строки.
* если однострочная форма записи ''%%ELSE%%'' используется в многострочной форме записи ''%%IF%%'', все команды, которые идут в последующих строках после ''%%ELSE%%'' до ''%%END%%'' игнорируются.
* Примеры однострочной записи:
! если сумма a и b равна двум, переменной c присваивается значение 30
! в противном случае (то есть если сумма a и b не равна двум)
! переменной c присваивается значение 10
if a+b=2: c=30 else c=10
! в зависимости от того есть ли в инвентаре апельсин
! выводится соответствующий текст
if obj "Апельсин": pl "У Вас есть апельсин." else pl "У Вас нет апельсина."
! однострочная форма else внутри многострочной if
if $левая_рука = 'Великий меч':
gosub 'atack', 300
gosub 'health.prove'
gosub 'win.prove'
else gosub 'atack', atack_power
end
* При многострочной форме записи:
* все команды должны идти в последующих строках после ''%%ELSE%%'';
* Примеры многострочной записи:
if a+b=2:
c=30
else
c=10
end
if obj "Апельсин":
pl "У Вас есть апельсин."
else
pl "У Вас нет апельсина."
end
if len($curtoken) > 0:
$tokens[curtoken_num] = $curtoken tokens_count = curtoken_num + 1
else
tokens_count = curtoken_num
end
* ''%%ELSEIF%%'' — ключевое слово, которое используется совместно с оператором ''%%IF%%'' и позволяет определять на одном уровне вложенности последовательно-исключающие условия. Ключевое слово ''%%ELSEIF%%'' имеет однострочную и многострочную формы записи. Многострочную форму записи можно использовать только в многострочных конструкциях с оператором ''%%IF%%'', а однострочную — как в многострочных, так и в однострочных конструкциях с оператором ''%%IF%%''. Общие формы записи:
! однострочная в однострочном условии
IF [#выражение 1]: {набор команд 1} ELSEIF [#выражение 2]: {набор команд 2} ELSE {последний набор команд}
! многострочная в многострочном условии
IF [#выражение 1]:
{набор команд 1}
…
ELSEIF [#выражение 2]:
{набор команд 2}
…
ELSEIF … :
…
ELSE
{последний набор команд}
…
END
! однострочная в многострочном условии
IF [#выражение 1]:
{набор команд 1}
…
ELSEIF [#выражение 2]: {набор команд 2} & …
ELSEIF … : …
ELSE {последний набор команд}
END
Работает это следующим образом. Если ''[#выражение 1]'' верно, выполняются команды ''{набор команд 1}''. Если ''[#выражение 1]'' неверно, но верно ''[#выражение 2]'', выполняются команды ''{набор команд 2}'', и т.д. И только если неверны все выражения в текущей конструкции условия, выполнятся команды после ''ELSE''. Верность выражения ''[#выражение 1]'' не исключает верности выражения ''[#выражение 2]'', однако верность выражения ''[#выражение 2]'' исключает верность выражения ''[#выражение 1]''.\\ Особенности записи ''ELSEIF'':
* Может использоваться вариант написания ''%%ELSE IF%%''. Работает точно так же.
* Если в многострочной конструкции ''%%IF%%'' после ''%%ELSEIF%%'' операторы идут в той же самой строке (однострочная форма), то все последующие строки игнорируются до следующего ''%%ELSEIF%%'', либо до ''%%ELSE%%'' или ''%%END%%''.
* В конструкции ''%%IF%%'' c ''%%ELSEIF%%'' может как присутствовать, так и отсутствовать часть с ''%%ELSE%%''.
* Примеры:
IF ОЧКИ>124:
GOTO 'КОН3'
ELSEIF ОЧКИ>99:
GOTO 'КОН4'
ELSE
GOTO 'КОН5'
END
if money mod 10=1 and money mod 100<>11:
*pl "У вас <> монета."
elseif money mod 10>1 and money mod 10<5 and (money mod 100<5 or money mod 100>20):
*pl "У вас <> монеты."
elseif money mod 10=0 or money mod 10>4 or (money mod 100>10 and money mod 100<21):
*pl "У вас <> монет."
end
Пример записи ''ELSEIF'' с операторами в той же строке:
if r = 0:
'Вариант 0'
elseif r = 1: 'Вариант 1'
elseif r = 2: 'Вариант 2'
elseif r = 3: 'Вариант 3'
else: 'Без вариантов'
end
* ''%%END%%'' — ключевое слово, которое указывает на конец многострочной конструкции условия. Допускается запись ''%%END IF%%''. Не используется для однострочных форм записи.
Для многострочных форм записи допускается вложенность неограниченной глубины. Каждый уровень вложения должен заканчиваться своей строкой ''%%END%%''.
Некоторые примеры:
if a+b<3 or y=8:
p 'A+B<3 или Y=8'
nl
if j=88: nl & p 'NEXT'
if $h='ooo':
p 'loo' & jump 'lll'
end
end
if a = 0:
'abc1234'
if b = 0: '0' else '1'
if j = 88: nl & p 'NEXT'
if $h='ooo':
p 'loo' & jump 'lll'
else
p 'sample text'
v = 8
end
1234
else:
'01234'
g = 78
end
if ((a+b)/c)=45+54 or (b<5 or c>45) and no obj 'лопата' and $f=$vvv+'RRRRR': p 'OK' & goto 'Next'
if был_здесь[$curloc]: exit
if a<3: jump 'sss'
if $имя = '': msg 'Введите имя!' & jump 'ввод'
if a+b=2:c=30 & gt 'next' else c=10
Пример реализации однострочного варианта ''%%ELSEIF%%'':
if n=0: *pl "Ноль" elseif n=1: *pl "Один" elseif n=2: *pl "Два"
Несколько примеров неверной записи:
! в этом случае, если условие не будет выполнено,
! плеер проигнорирует только команду k1=34
! поскольку посчитает, что это однострочное условие
if abcd=3: k1=34
k2=35 & ! эта команда будет выполняться всегда
k3=36 & ! эта комнада будет выполняться всегда
end & ! этот end будет проигнорирован
! данная строка выведет ошибку "неизвестное действие"
! так как однострочные формы записи не должны оканчиваться end`ом
if abcd=3: k1=34 else k1=25 end
Пример использования однострочных ''%%ELSEIF%%'' и ''%%ELSE%%'' (аналог ''%%CASE%%'' на **QSP**):
if 0:
elseif z = 0: y = x * 100
elseif z = 1: y = x * 99
elseif z = 2: y = x * 88
elseif z = 3: y = x * 77
else: y = x * 11
end
===== Функции обработки условий =====
* ''%%IIF([#выр],[выр_да],[выр_нет])%%'' - возвращает значение выражения ''%%[выр_да]%%'', если ''%%[#выр]%%'' верно, иначе возвращает значение выражения ''%%[выр_нет]%%''.
* Эта функция в **QSP** является аналогом **тернарного оператора** в других языках программирования.
* Из выражений ''%%[выр_да]%%'' и ''%%[выр_нет]%%'' будет вычислено только одно, в зависимости от того, будет ли выполнено условие.
* Примеры:
!Модуль числа
abs_x=iif(x>0,x,-x)
!А следующая конструкция НЕ вызовет ошибку деления на ноль:
set x=0 y=iif(x=0,0,1/x)
! типичное решение для вывода времени, чтобы не терять ноль на часах:
$iif(hour>9,$str(hour),"0"+$str(hour))+":"+$iif(minute>9,$str(minute),"0"+$str(minute))
* Эквивалентность конструкций условия c оператором ''%%IF%%'' и функции ''%%IIF%%'':
if number mod 2 = 0:
*pl "Число чётное"
else
*pl "Число нечётное"
end
! эквивалентно
*pl $iif(number mod 2 = 0,"Число чётное","Число не чётное")
[[help:organizing|Вперёд: Пользовательские функции и процедуры]]