Условия
Условия — это такие особые конструкции в QSP, которые позволят сделать вашу игру по настоящему интерактивной. Они позволяют разветвлять события, происходящие в игре в зависимости от уже сложившихся условий, и таким образом вносить разнообразие в игровой процесс. Операторы, которые используются в конструкциях условий, в программировании называются операторами ветвления.
Операторы ветвления часто используют с операциями сравнения и с логическими операциями.
Операторы условий
-
IF— основной оператор для записи конструкций условий. Конструкции, записываемые с помощью этого оператора (назовём их "простыми условиями"), имеют две формы: однострочную и многострочную, — и в общем виде выглядят так:! однострочная форма записиIF [#выражение]: {команда 1} & {команда 2} & …! многострочная форма записиIF [#выражение]:{команда 1}{команда 2}…ENDВ данном случае, если верно условие
[#выражение], выполняются команды{команда 1},{команда 2}и т.д. Для однострочной формы записи это будут только те команды, которые идут в той же строке, что и операторIFдо конца строки; а для многострочной формы записи это будут те команды, которые идут в последующих строках после двоеточия и до специального ключевого словаEND.-
В качестве условия могут выступать операции сравнения, логические операции и иные выражения, возвращающие числовые значения.
-
Ключевое слово
ENDпри многострочной форме записи должно стоять отдельной строкой. -
Если условие
[#выражение]не верно, команды выполнены не будут. -
Примеры однострочной формы записи условий:
! если сумма a и b равна двум,! переменной c присваивается значение 30if 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библиотека_вернулся = 1gt 'библиотека'endif a+b=2:c=30end -
Обратите внимание!!! При многострочной форме записи после двоеточия в той же строке, в какой находится оператор
IF, не должны идти никакие команды, иначе плеер посчитает такой оператор условия однострочным, и команды в последующих строках будут выполняться в любом случае, независимо от того, верным окажется условие или нет. Пример такой ошибочной записи:if библиотека = 0: узнал_о_тусовке = 0библиотека_вернулся = 1 &! эта строчка будет выполняться в независимости от верности условияgt 'библиотека' &! и этаend &! ключевое слово end - просто игнорируется
-
-
ELSE— ключевое слово, использующееся совместно с операторомIF, и которое служит для предоставления альтернативы, если условие не выполнено. Ключевое сло воELSEтак же имеет две формы записи: однострочную и многострочную. Многострочную форму записиELSEможно использовать только в многострочной конструкции оператораIF, тогда как однострочную форму записи можно использовать как в однострочной, так и в многострочной, конструкции оператораIF. Общая форма записи:! однострочная форма записиIF [#выражение]: {команда д1} & {команда д2} & … ELSE {команда н1} & {команда н2} & …! в многострочном IF! многострочная форма ELSEIF [#выражение]:{команда д1}{команда д2}...ELSE{команда н1}{команда н2}...END! однострочная форма ELSEIF [#выражение]:{команда д1}{команда д2}...ELSE {команда н1} & {команда н2} & ...! команды в следующих строках! до END игнорируютсяENDЗдесь, если условие
[#выражение]верно, выполняются команды от двоеточия до ключевого словаELSE, а если условие[#выражение]не верно, выполняются команды от ключевого словаELSEи до конца конст рукции условия.- После
ELSEможно ставить, а можно не ставить двоеточие. - При однострочной форме записи:
-
и команды и ключевое слово
ELSEдолжны быть записаны в одной строке -
окончанием альтернативного списка команд является конец строки.
-
если однострочная форма записи
ELSEиспользуется в многострочной форме записиIF, все команды, которые идут в последующих строках послеELSEдоENDигнорируются. -
Примеры однострочной записи:
! если сумма a и b равна двум, переменной c присваивается значение 30! в противном случае (то есть если сумма a и b не равна двум)! переменной c присваивается значение 10if a+b=2: c=30 else c=10! в зависимости от того есть ли в инвентаре апельсин! выводится соответствующий текстif obj "Апельсин": pl "У Вас есть апельсин." else pl "У Вас нет апельсина."! однострочная форма else внутри многострочной ifif $левая_рука = 'Великий меч':gosub 'atack', 300gosub 'health.prove'gosub 'win.prove'else gosub 'atack', atack_powerend
-
- При многострочной форме записи:
-
все команды должны идти в последующих строках после
ELSE; -
Примеры многострочной записи:
if a+b=2:c=30elsec=10endif obj "Апельсин":pl "У Вас есть апельсин."elsepl "У Вас нет апельсина."endif len($curtoken) > 0:$tokens[curtoken_num] = $curtoken tokens_count = curtoken_num + 1elsetokens_count = curtoken_numend
-
- После
-
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. -
В конструкции
IFcELSEIFможет как присутствовать, так и отсутствовать часть сELSE. -
Примеры:
IF ОЧКИ>124:GOTO 'КОН3'ELSEIF ОЧКИ>99:GOTO 'КОН4'ELSEGOTO 'КОН5'ENDif 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([#выр],[выр_да],[выр_нет])- возвращает значение выражения[выр_да], если[#выр]верно, иначе возвращает значение выражения[выр_нет].-
Эта функция в 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,"Число чётное","Число не чётное")
-