12.3. Создаю действия с помощью цикла, но они работают неправильно. Что делать?
В: Создаю действия с помощью цикла, но они работают неправильно. Что делать?
О: Это классическая "грабля", с которой сталкиваются все новички из-за неполного понимания порядка работы кода.
Допустим мы создаём действие:
i=1
act "Действие номер "+i:
*pl "Это действие номер "+i
end
Что мы при этом увидим на экране? Перед созданием действия переменной i присвоено значение 1. Значит на звание действия будет склеено из текста "Действие номер " и значения переменной i, то есть будет выглядеть так: "Действие номер 1".
Однако код, который мы назначили действию, будет выполнен только в момент нажатия действия.
То есть, если мы нажмём на действие, когда переменная i равна 1, мы увидим на экране текст: "Это действие номер 1". Но если переменную i изменить уже после создания действия, то когда мы нажмём на действие, мы увидим другой текст. Например:
i=1
act "Действие номер "+i:
*pl "Это действие номер "+i
end
i=2
В этом случае мы увидим на экране действие с названием "Действие номер 1", а текст, который оно выведет на экран при нажатии, будет такой: "Это действие номер 2".
Теперь давайте посмотрим, что происходит при создании действий с помощью цикла:
loop i=1 while i<6 step i+=1:
act "Действие номер "+i:
*pl "Это действие номер "+i
end
end
В конце цикла значени е переменной i будет равно 6, тогда как цикл создаст нам пять действий с названиями:
- Действие номер 1
- Действие номер 2
- Действие номер 3
- Действие номер 4
- Действие номер 5
При этом, какое бы действие мы не нажимали, поскольку значение переменной i будет равно 6, мы всегда при нажатии на действие будем видеть на экране строку текста: "Это действие номер 6".
Однако, мы можем формировать действия с конкретными значениями с помощью оператора dynamic:
loop i=1 while i<6 step i+=1:
dynamic 'act "Действие номер "+<<i>>:
*pl "Это действие номер "+<<i>>
end'
end
Теперь на каждом проходе цикла, когда плеер будет встречать оператор dynamic, этому оператору будет передаваться строка текста:
'act "Действие номер "+<<i>>:
*pl "Это действие номер "+<<i>>
end'
Перед выполнением оператора dynamic плеер будет раскрывать подвыражения, подставляя вместо них значение i, соответствующее проходу. На первом проходе оператору dynamic будет передан такой текст:
'act "Действие номер "+1:
*pl "Это действие номер "+1
end'
На втором проходе такой:
'act "Действие номер "+2:
*pl "Это действие номер "+2
end'
И так далее.
dynamic выполняет код записанный в виде текста, и поскольку мы передаём ему команды для создания действий, будут созданы пять действий с конкретными числами в коде действий.
Для лучшего понимания попробуйте запустить такой код, и объясните его работу:
loop i=1 while i<6 step i+=1:
dynamic 'act "Действие номер "+<<i>>:
*pl "Это действие номер "+<<i>>
*pl "Значение переменной i: "+i
end'
end
Обратите внимание, везде в этой статье используются глобальные переменные. Попробуйте использовать в последнем примере в качестве счётчика локальную переменную, и объясните его работу.