Условия — это такие особые конструкции в 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 "У вас <<money>> монета." elseif money mod 10>1 and money mod 10<5 and (money mod 100<5 or money mod 100>20): *pl "У вас <<money>> монеты." elseif money mod 10=0 or money mod 10>4 or (money mod 100>10 and money mod 100<21): *pl "У вас <<money>> монет." 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([#выр],[выр_да],[выр_нет])
- возвращает значение выражения [выр_да]
, если [#выр]
верно, иначе возвращает значение выражения [выр_нет]
.[выр_да]
и [выр_нет]
будет вычислено только одно, в зависимости от того, будет ли выполнено условие.!Модуль числа 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))
IF
и функции IIF
: if number mod 2 = 0: *pl "Число чётное" else *pl "Число нечётное" end ! эквивалентно *pl $iif(number mod 2 = 0,"Число чётное","Число не чётное")