Содержание

Назад: Кортежи

Условия

Условия — это такие особые конструкции в QSP, которые позволят сделать вашу игру по настоящему интерактивной. Они позволяют разветвлять события, происходящие в игре в зависимости от уже сложившихся условий, и таким образом вносить разнообразие в игровой процесс. Операторы, которые используются в конструкциях условий, в программировании называются операторами ветвления.

Операторы ветвления часто используют с операциями сравнения и с логическими операциями.

Операторы условий

Для многострочных форм записи допускается вложенность неограниченной глубины. Каждый уровень вложения должен заканчиваться своей строкой 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

Функции обработки условий

Проблема висячего ELSE

Если вы часто пользуетесь однострочными конструкциями условий, вы неизбежно столкнётесь с "проблемой висячего ELSE". Это ситуация, когда невозможно однозначно трактовать, к какому IF относится ELSE. Вот пример подобной неоднозначности:

if first: if second: 'when true' else: 'when false'

Сложно с ходу понять, к какому из IF — первому или второму — относится ELSE.

К счастью данная неоднозначность в QSP разрешается, как и во многих других языках программирования. ELSE всегда относится к ближайшему IF без ELSE. То есть в данном случае ко второму. Вышеприведённая однострочная конструкция может быть представлена таким многострочным эквивалентом:

if first:
  if second:
    'when true'
  else:
    'when false'
  end
end

Из этого правила вытекает возможность создавать вот такие конструкции, где у каждого IF есть свой ELSE:

if first: if second: 'when true' else: 'when false' else 'first false'

А вот создать эквивалент такой многострочной конструкции в однострочной форме так просто не получится:

if first:
  if second:
    'when true'
  end
else:
  'when false'
end

Хотя, если очень нужно…

if first: dynamic {if second:'when true'} else: 'when false'
if first: if second: 'when true' else: args=args else: 'when false'

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