- Вывод текста
- Программирование
- Оформление
- Расширенные возможности
- Нюансы написания игр под разные плееры
-
- x AeroQSP
- Утилиты и средства разработки
Это старая версия документа.
Условия — это такие особые конструкции в 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,"Число чётное","Число не чётное")