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

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


Боковая панель

help:conditional

Это старая версия документа.


Назад: Регулярные выражения

Условия

Условия — это такие особые конструкции в 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 (назовём это "сложным условием") так же имеют две формы записи: однострочную и многострочную, — и в общем виде выглядят так:
            ! однострочная форма записи
            IF [#выражение]: {команда д1} & {команда д2} & ... ELSE {команда н1} & {команда н2} & ...
            !многострочная форма записи
            IF [#выражение]:
                {команда д1}
                {команда д2}
                ...
            ELSE
                {команда н1}
                {команда н2}
                ...
            END
    
    Здесь, если условие [#выражение] верно, выполняются команды от двоеточия до ключевого слова ELSE, а если условие [#выражение] не верно, выполняются команды от ключевого слова ELSE и до конца конструкции условия.
    • При однострочной форме записи:
      • и команды и ключевое слово 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 должно быть записано отдельной строкой,
      • конструкция условия должна оканчиваться ключевым словом END, записанным отдельной строкой
      • Примеры многострочной записи:
                    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 [#выражение 1]:
                {набор команд 1}
                ...
            ELSEIF [#выражение 2]:
                {набор команд 2}
                ...
            ELSEIF ... :
                ...
            ELSE
                {последний набор команд}
                ...
            END
    
    Работает это следующим образом. Если [#выражение 1] верно, выполняются команды {набор команд 1}. Если [#выражение 1] неверно, но верно [#выражение 2], выполняются команды {набор команд 2}, и т.д. И только если неверны все выражения в текущей конструкции условия, выполнятся команды после ELSE. Верность выражения [#выражение 1] не исключает верности выражения [#выражение 2], однако верность выражения [#выражение 2] исключает верность выражения [#выражение 1].
    Правила записи такие же, как и для других видов многострочных условий:
    • После двоеточия в той же строке, где находится оператор IF или ELSEIF не должно идти никаких команд, только со следующей строки.
    • Вся конструкция должна заканчиваться оператором END, стоящим в отдельной строке.
    • В конструкции может как присутствовать, так и отсуствовать часть с 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
      
  • 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 с последовательным перечислением вложенных условий через ELSE IF:

if n=0: *pl "Ноль" else if n=1: *pl "Один" else if 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

    ! данная запись приведёт к ошибке:
    ! "Неверная запись однострочного оператора"
    if absd=3:
        k=34
    else if absd=6:
        k1=25
    end

Особая форма записи конструкции условия с ELSEIF

Оператор ветвления ELSEIF всегда используется только в многострочных конструкциях. Однако есть сокращённый вариант записи такой многострочной конструкции, который позволяет размещать команды в той же строке, что и ELSEIF.

Обратите внимание!!! Это не однострочная форма записи, это особая форма многострочной записи. Вот общий вид такой формы:

IF [#условие 1]:
    {команды 1}
ELSEIF [#условие 2]: {команды 2}
ELSEIF [#условие 3]: {команды 3}
...
ELSEIF [#условие N]: {команды N}
ELSE: {команды}
END

Здесь обязательно команды {команды 1} после оператора IF должны идти в следующей строке после двоеточия, иначе плеер будет воспринимать строку с оператором IF, как простую однострочную форму. А вот команды для ELSEIF и ELSE можно писать сразу в той же строке. Это очень удобно, когда надо организовать аналог CASE на QSP.

Пример:

if x = 0:
    y = x * 100
elseif x = 1: y = x * 99
elseif x = 2: y = x * 88
elseif x = 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))
      
    • Эквивалентность конструкций условия с оператором IF и функции IIF:
              if number mod 2 = 0:
                  *pl "Число чётное"
              else
                  *pl "Число нечётное"
              end
              ! эквивалентно
              *pl $iif(number mod 2 = 0,"Число чётное","Число не чётное")
      

Вперёд: Пользовательские функции и процедуры

help/conditional.1672669653.txt.gz · Последние изменения: 2023/01/02 14:27 — aleks_versus