Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

13.10. Не работает многострочный код. Как исправить?

В: Не работает многострочный код. Как исправить?

Пишу такой код:

if яблоки_созрели=1:
    "На берёзе созрело несколько яблок."
    act "Сорвать яблоко":
        яблоко=яблоко+1
        "Я сорвал яблоко и положил в консервную банку."
    else яблоко>3:
        "Мне больше не нужны яблоки"
    end
end

Плеер выдаёт ошибку.

О:

Перепутаны назначения ключевых слов, очевидно от того, что вы не понимаете порядка работы оператора условия и оператора, создающего действие.

Многострочная форма записи конструкции условия имеет три вида.

Первый вид, это "простое" условие:

IF [#выражение]:
    [команда 1]
    [команда 2]
    [команда 3]
END

За ключевым словом `IF` следует выражение `[#выражение]`, и если это выражение верно, плеер выполняет команды в последующих строках после двоеточия до ключевого слова `END`. Если выражение не верно, эти команды просто игнорируются плеером.

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

IF [#выражение]:
    [команда 1]
    [команда 2]
    [команда 3]
ELSE
    [команда 4]
    [команда 5]
    [команда 6]
END

В этом случае, если выражение `[#выражение]` верно, выполняются команды, записанные в последующих строках после двоеточия и до ключевого слова `ELSE`. Т.е. команды `[команда 1]`, `[команда 2]` и `[команда 3]`. А если выражение `[#выражение]` не верно, выполняются команды, записанные в последующих строках после ключевого слова `ELSE` и до ключевого слова `END`. Т.е. команды `[команда 4]`, `[команда 5]` и `[команда 6]`. При этом после `ELSE` не ставится двоеточие, и указать дополнительное условие проверки нельзя.

Чтобы указать дополнительное условие, предусмотрен третий вид, это "расширенное" условие, и выглядит он так:

IF [#выражение 1]:
    [команда 1]
    [команда 2]
    [команда 3]
ELSEIF [#выражение 2]:
    [команда 4]
    [команда 5]
    [команда 6]
ELSE
    [команда 7]
    [команда 8]
    [команда 9]
END

Теперь мы можем в одну конструкцию уместить несколько условий и для каждого написать свой набор команд. Если верно выражение `[#выражение 1]`, плеер выполнит команды в последующих строках после двоеточия и до первого `ELSEIF`, т.е. команды `[команда 1]`, `[команда 2]` и `[команда 3]`. Все остальные команды в конструкции условия будет проигнорированы.

Однако, если выражение `[#выражение 1]` неверно, тогда проверяется выражение `[#выражение 2]`, и если оно верно, то выполняются команды в последующих строках до `ELSE`, т.е. комнады `[команда 4]`, `[команда 5]` и `[команда 6]`. И так далее.

Как видно, когда мы пишем ключевое слово `ELSEIF`, к нему нужно указать и выражение, истинность которого следует проверить, и после выражения поставить двоеточие.

Так выглядят три вида многострочной формы записи конструкции условий, но для многострочной записи действия предусмотрен только один вид.

ACT "Название действия":
    [команда 1]
    [команда 2]
END

В многострочной форме записи действия нельзя использовать ключевое слово `ELSE`, или `ELSEIF`. Они относятся только к конструкциям условий.

Тем не менее можно комбинировать различные конструкции, чтобы добиться правильной работы данного кода:

! открываем общее условие
if яблоки_созрели=1:
! если значение переменной яблоки_созрели равно 1
    
! выводим на экран текст
    "На берёзе созрело несколько яблок."
    
! выводим на экран соответствующее действие
    act "Сорвать яблоко":
    
! далее следует код действия
        
! открываем внутри действия условие,
        
! проверяющее, сколько мы сорвали яблок
        if яблоко>3:
        
! если мы сорвали больше трёх яблок
            
! выводим текст, что нам больше не нужны яблоки
            "Мне больше не нужны яблоки"
        else
        
! иначе, если мы сорвали три или меньше яблок
            
! увеличиваем число сорванных яблок
            яблоко=яблоко+1
            
! выводим текст, что сорвали ещё яблоко
            "Я сорвал яблоко и положил в консервную банку."
        
! закрываем условие внутри действия
        end
    
! закрываем действие
    end
! закрываем общее условие
end

От себя могу порекомендовать комментировать каждую строчку кода, если вы только начали изучать язык QSP. Это поможет более чётко и ясно понимать, как и что работает. Если вы не можете объяснить назначение той или иной строчки кода, то с ней следует разобраться. Она может быть банально лишней, а может вам ещё недостаёт знаний, чтобы правильно её применить.