Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:variables [2015/04/11 20:24] 200.84.138.87 старая ревизия восстановлена (2013/11/10 22:19) |
help:variables [2024/10/14 10:12] (текущий) aleks_versus значение по умолчанию |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | discounts <a href="http://cheapautoinsurancebyzip.info/cheap-auto-insurance-oregon.html">auto insurance qoute Portland</a> liable modifications <a href="http://viagraonlinegs.com">erections</a> stimulates dopamine standards <a href="http://lifeinsurancequotesusa.info">life insurance quote</a> different insurers fantasies related <a href="http://viagraetc.net">viagra sales</a> roses just illegal <a href="http://automobileinsurancequotesin.us/automobile-insurance-quotes-texas.html">Houston auto insurance</a> vehicles people help <a href="http://levitraos.com">levitra</a> system libido | + | [[help:principle|Назад: Порядок работы интерпретатора]] |
+ | |||
+ | ====== Переменные ====== | ||
+ | |||
+ | Иногда в процессе игры нам требуется на время сохранить какую-либо информацию. Например, герой срывает с дерева яблоки, и нам нужно куда-то "записать", сколько яблок он сорвал. Или же в результате битвы погибает злодей, и нам нужно, чтобы плеер "запомнил", что злодей погиб. Для таких вот "записей", "запоминаний", и существуют переменные. | ||
+ | |||
+ | **Переменная** - это именованная "ячейка памяти". То есть это некий кусочек памяти в программе, которому мы назначаем имя. | ||
+ | |||
+ | Для удобства можно представлять переменную, как коробку, в которую мы что-нибудь "складываем", например число, или фрагмент текста (или даже несколько значений одновременно - кортеж). | ||
+ | |||
+ | ===== Типы переменных ===== | ||
+ | |||
+ | Память программ работает совсем не так, как наша, и "запоминать" они могут только определённого типа значения. **QSP** умеет "запоминать" только **целочисленные** (числовые) и **строковые** значения. Особняком можно отметить **кортежи**, которые позволяют упаковать в одну переменную сразу группу значений. | ||
+ | |||
+ | Поэтому и переменные в **QSP** делятся на три типа: | ||
+ | |||
+ | * Целочисленные | ||
+ | * Строковые | ||
+ | * Кортежи | ||
+ | |||
+ | **В целочисленных переменных** (иногда для краткости их называют просто числовыми) мы можем хранить только **целые** числа в пределах от -2147483648 до 2147483647. | ||
+ | |||
+ | Если мы не поместили никакого значения в целочисленную переменную, то считается, что она хранит значение **''0''**. Это **значение по умолчанию** для числовых переменных. | ||
+ | |||
+ | **В строковых переменных** (иногда их называют текстовыми переменными) мы можем хранить целые строки текста, и длина таких строк может доходить до двух Гигабайт. Строка не может превысить объём оперативной памяти. | ||
+ | |||
+ | Если мы не поместили никакого значения в строковую переменную, то считается, что она хранит пустую строку, т.е. строку совсем без символов. Это **значение по умолчанию** для строковых переменных. | ||
+ | |||
+ | **В кортежах** мы можем хранить сразу группу значений, причём это могут быть значения любого из трёх типов: числовые, строковые и другие кортежи. **Не рекомендуется** создавать очень большие кортежи, хотя теоретически кортежи могут быть //очень// большими. Если вам и правда понадобится //настолько// большой кортеж, примите во внимание, что как и со строкой, объём занимаемых кортежем данных не может превысить двух Гигабайт, или объёма оперативной памяти. | ||
+ | |||
+ | **В переменной можно хранить значение только одного типа!** Переменные **''%яблоко''**, **''$яблоко''** и **''яблоко''** — это одна и та же переменная, но с разным типом значения, которое в ней хранится. | ||
+ | |||
+ | ===== Создание переменных и изменение их значений ===== | ||
+ | |||
+ | Чтобы создать переменную, мы должны задать ей значение. Это называется операцией **присваивания**. | ||
+ | |||
+ | Операция присваивания в **QSP** записывается так: | ||
+ | |||
+ | * сначала пишется имя переменной | ||
+ | * затем ставится знак **равно** (**=**) | ||
+ | * после знака **равно** пишется значение, которое мы хотим "записать" в переменную. | ||
+ | |||
+ | Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! переменной яблоко присваивается число 23 | ||
+ | яблоко=23 | ||
+ | |||
+ | ! переменной $скороговорка присваивается строка Ехал Грека Через Реку | ||
+ | $скороговорка = 'Ехал Грека Через Реку' | ||
+ | |||
+ | ! переменной %unit присваивается кортеж значений | ||
+ | %unit = [187, 94, 'steel', [0, 2]] | ||
+ | </sxh> | ||
+ | |||
+ | Как видите, во всех трёх случаях сначала ставится имя переменной, потом знак равенства, а потом значение. Вместо значения можно написать название другой переменной, название функции, или даже целое выражение. Плеер автоматически вычислит **значение** из выражения, функции или переменной, и присвоит это **значение** переменной, стоящей слева от знака **равно**. Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! присваиваем переменной значение другой переменной | ||
+ | $скороговорка_про_Греку = $скороговорка | ||
+ | |||
+ | ! присваиваем переменной значение выражения | ||
+ | яблоко = яблоки_в_кармане + яблоки_в_лукошке + яблоки_у_Лёшки | ||
+ | |||
+ | ! присваиваем переменной значение функции | ||
+ | случайное_число = rnd | ||
+ | $текущая_локация = $curloc | ||
+ | </sxh> | ||
+ | |||
+ | Не путайте операцию присваивания, и операцию сравнения. Их запись похожа, но операция сравнения обычно следует за ключевыми словами **''IF''**, **''ELSEIF''** или **''WHILE''** и позволяет сравнивать одно значение с другим. | ||
+ | |||
+ | ==== Множественное присваивание ==== | ||
+ | |||
+ | Вы можете одной командой присвоить значения сразу нескольким переменным (множественное присваивание). Для этого: | ||
+ | |||
+ | * сначала перечисляете через запятую несколько имён переменных | ||
+ | * затем ставите знак **равно** (**=**) | ||
+ | * после знака **равно** так же через запятую перечисляете значения, которые хотите назначить переменным. | ||
+ | |||
+ | Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | яблоки_в_кармане, яблоки_в_лукошке, яблоки_у_Лёшки = 58, 11, 19 | ||
+ | $строка_1, $строка_2 = 'Ехал Грека Через Реку', 'Видит Грека В Реке Рак' | ||
+ | $name, count = 'Старый меч', 2 | ||
+ | </sxh> | ||
+ | |||
+ | Во всех трёх командах слева от знака **равно** через запятую перечисляются переменные, которым мы присваиваем значения, а справа через запятую перечисляются значения, которые мы присваиваем переменным. | ||
+ | |||
+ | Вместо прямого указания значений можно присваивать значения других переменных, выражений, функций: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! три переменные = три значения | ||
+ | red, green, blue = rand(0,255), rand(0,255), rand(0,255) | ||
+ | ! две переменные = два значения | ||
+ | яблоки_в_кармане, яблоки_в_лукошке = яблоки_у_Лёшки, яблоки_на_дереве+15 | ||
+ | </sxh> | ||
+ | |||
+ | Присваивать значения одной командой очень удобно, если переменные близки по своему смыслу или назначению. Например, одной строкой можно задавать значения сразу нескольким системным переменным в начале игры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | usehtml, debug, nosave = 1, 1, 1 | ||
+ | bcolor, lcolor, fcolor = rgb(255,255,255), rgb(0,90,90), rgb(0,0,0) | ||
+ | </sxh> | ||
+ | |||
+ | Благодаря возможности одновременно присваивать значения сразу нескольким переменным, можно менять местами данные в двух переменных, не прибегая к помощи третьей: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! присваиваем пременным x и y значения 12 и 99 | ||
+ | x, y = 12, 99 | ||
+ | ! меняем местами значения. Теперь в x находится число 99, а в y — 12 | ||
+ | x, y = y, x | ||
+ | </sxh> | ||
+ | |||
+ | **Важно помнить!** Слева от знака равенства должно быть столько же переменных, сколько справа значений. Число переменных, и число присваиваемых значений — должны совпадать. Такие записи неверны: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! три переменные, а значения только два | ||
+ | raz, dva, tri = 24, 67 | ||
+ | ! одна переменная, и два значения | ||
+ | chetyre = 89, 21 | ||
+ | </sxh> | ||
+ | |||
+ | Так же в одной команде можно использовать лишь один оператор присваивания: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! так неправильно: | ||
+ | raz = 24, dva = 67, tri = 89 | ||
+ | ! а вот так правильно | ||
+ | raz, dva, tri = 24, 67, 89 | ||
+ | ! и вот так правильно, потому что здесь три команды записаны в одну строку | ||
+ | raz = 24 & dva = 67 & tri = 89 | ||
+ | </sxh> | ||
+ | |||
+ | ==== Присваивание из кортежа (распаковка) ==== | ||
+ | |||
+ | Поскольку кортежи содержат в себе сразу несколько значений, запись присваивания значений переменным из кортежа может показаться необычной: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! %unit = [187, 94, 'steel', [0, 2]] | ||
+ | рост, вес, $материал, %координаты = %unit | ||
+ | </sxh> | ||
+ | |||
+ | Как видите, здесь у нас слева четыре имени переменной, а справа только одно имя переменной-кортежа. Такое присваивание называется **распаковкой** — значения извлекаются из кортежа и помещаются в указанные переменные. | ||
+ | |||
+ | Точно так же распаковывается кортеж, даже не помещённый в переменную: | ||
+ | |||
+ | <sxh qsp> | ||
+ | рост, вес, $материал, %координаты = [187, 94, 'steel', [0, 2]] | ||
+ | </sxh> | ||
+ | |||
+ | Такая запись мало чем отличается от множественного присваивания, поэтому внешние квадратные скобки не обязательны: | ||
+ | |||
+ | <sxh qsp> | ||
+ | рост, вес, $материал, %координаты = 187, 94, 'steel', [0, 2] | ||
+ | </sxh> | ||
+ | |||
+ | Подробнее о работе с кортежами, читайте в [[help:tuples|соответствующем разделе]]. | ||
+ | |||
+ | ==== Операторы SET и LET ==== | ||
+ | |||
+ | Из старых версий плеера перекочевали операторы **''SET''** и **''LET''**. Эти операторы явно указывают, что данная команда производит присваивание. Любой из этих операторов может быть поставлен перед операцией присваивания, это никак не влияет на работу переменных. В примере ниже все три варианта присваивания значения переменным равнозначны: | ||
+ | |||
+ | <sxh qsp> | ||
+ | SET golden_axe_damage = 120 | ||
+ | LET golden_axe_damage = 120 | ||
+ | golden_axe_damage = 120 | ||
+ | </sxh> | ||
+ | |||
+ | Точно так же, как и в операции присваивания без операторов **''SET''** и **''LET''**, можно присваивать значения сразу нескольким переменным одной командой и с использованием операторов: | ||
+ | |||
+ | <sxh qsp> | ||
+ | set яблоки_в_кармане, яблоки_в_лукошке, яблоки_у_Лёшки = 58, 11, 19 | ||
+ | set $строка_1, $строка_2 = 'Ехал Грека Через Реку', 'Видит Грека В Реке Рак' | ||
+ | let $name, count = 'Старый меч', 2 | ||
+ | </sxh> | ||
+ | |||
+ | Для улучшения читаемости кода можно использовать оператор **''SET''** только для команд с множественным присваиванием. | ||
+ | |||
+ | Оператор **''LET''** использовать не рекомендуется. | ||
+ | |||
+ | ==== Изменение типа переменной ==== | ||
+ | |||
+ | Изменить тип переменной в **QSP** можно, просто присвоив ей значение другого типа. Например: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! присваиваем переменной строковое значение | ||
+ | $яблоко = 'Антоновка' | ||
+ | ! если мы попытаемся вывести на экран числовое значение этой переменной, | ||
+ | ! то увидим значение по умолчанию, то есть ноль: | ||
+ | *pl яблоко & ! выведет 0 на экран | ||
+ | ! но мы можем изменить тип переменной, записав в неё число | ||
+ | яблоко = 19 | ||
+ | ! теперь, если мы попытаемся вывести на экран то же числовое значение | ||
+ | ! мы увидим число 19 | ||
+ | *pl яблоко & ! выведет 19 на экран | ||
+ | ! а если мы попытаемся вывести на экран текстовое значение, | ||
+ | ! то ничего не увидим, потому что числовое значение затёрло текстовое | ||
+ | *pl $яблоко | ||
+ | </sxh> | ||
+ | |||
+ | ===== Наименование переменных ===== | ||
+ | |||
+ | Чтобы не сбивать плеер с толку, названия переменных должны соответствовать следующим условиям: | ||
+ | |||
+ | * Название переменной **не** должно **начинаться с цифры**. | ||
+ | * Оно не должно совпадать с ключевыми словами (cм. [[help:keywords|список ключевых слов]]). | ||
+ | * В названии не должны использоваться пробелы, символы табуляции и следующие символы: <sxh> | ||
+ | ! : & = < > + - * / , ' " ( ) [ ] { } @ ? ; | ||
+ | </sxh> | ||
+ | * Названия строковых переменных должны начинаться с символа **''$''**. | ||
+ | * Названия кортежей должны начинаться с символа **''%''**. | ||
+ | * Регистр в названии переменной не важен: **''деньги''** и **''ДеНьГи''** - одна и та же переменная. | ||
+ | |||
+ | А вот несколько рекомендаций по тому, как правильно подбирать названия переменных | ||
+ | |||
+ | * Вместо пробела в названиях можно использовать символ подчеркивания - "**''_''**". | ||
+ | * Не рекомендуется делать названия длиннее 10-15 символов, это усложняет читаемость кода. | ||
+ | * Не стоит использовать в названии переменной **одновременно** символы разных алфавитов, это может запутать вас, и вы допустите ошибку. | ||
+ | |||
+ | Используйте краткие и ёмкие названия, указывающие на назначение переменной. При этом **QSP** разрешает пользоваться символами любого алфавита: | ||
+ | |||
+ | <sxh qsp> | ||
+ | яблоки_в_кармане = 3 | ||
+ | $АмулетНаШее = "Ожерелье Гроз" | ||
+ | |||
+ | money_count = 1037 | ||
+ | $money_name = "RUB" | ||
+ | |||
+ | 我_拿_钥匙 = 1 | ||
+ | %饭碗 = ["Rice Bowl", 'Cat-wife '] | ||
+ | </sxh> | ||
+ | |||
+ | ===== Удаление переменных ===== | ||
+ | |||
+ | Удалить переменную можно с помощью оператора **''KILLVAR''**. | ||
+ | |||
+ | <sxh qsp> | ||
+ | KILLVAR 'имя_переменной' | ||
+ | </sxh> | ||
+ | |||
+ | Имя переменной при этом должно помещаться в кавычки: | ||
+ | |||
+ | <sxh qsp> | ||
+ | killvar 'яблоки_в_кармане' | ||
+ | killvar "$АмулетНаШее" | ||
+ | </sxh> | ||
+ | |||
+ | Более подробное описание оператора **''KILLVAR''** находится в статье про [[help:arrays|массивы]]. | ||
+ | |||
+ | ===== Проверка существования переменной ===== | ||
+ | |||
+ | В **QSP** нет специальной команды для проверки существования переменных, однако в силу особенностей движка можно использовать функцию получения размера [[help:arrays|массива]] **''ARRSIZE''**. Если функция вернёт единицу **1**, значит переменная существует; если вернёт **0**, значит переменная не существует. | ||
+ | |||
+ | <sxh qsp> | ||
+ | яблоко = 19 & ! создана переменная яблоко | ||
+ | ! увидим на экране Переменная "яблоко" существует | ||
+ | if arrsize('яблоко') = 1: | ||
+ | *pl 'Переменная "яблоко" существует' | ||
+ | else | ||
+ | *pl 'Переменная "яблоко" не существует' | ||
+ | end | ||
+ | |||
+ | ! переменную груша мы не создавали | ||
+ | ! увидим на экране Переменная "груша" не существует | ||
+ | if arrsize('груша')=1: | ||
+ | *pl 'Переменная "груша" существует' | ||
+ | else | ||
+ | *pl 'Переменная "груша" не существует' | ||
+ | end | ||
+ | </sxh> | ||
+ | |||
+ | Название переменной для функции **''ARRSIZE''** указывается внутри кавычек и помещается в круглые скобки. Указывать символ ''$'' или ''%'' перед названием переменной не обязательно. Вне зависимости от типа значения, которое в этой переменной хранится, **''ARRSIZE''** вернёт единицу, если переменная существует: | ||
+ | |||
+ | <sxh qsp> | ||
+ | яблоко = 19 & ! в переменную записано число | ||
+ | ! обе команды ниже вернут единицу, потому что | ||
+ | ! яблоко, $яблоко и %яблоко - это одна и та же переменная | ||
+ | *pl arrsize('яблоко') | ||
+ | *pl arrsize('$яблоко') | ||
+ | *pl arrsize('%яблоко') | ||
+ | </sxh> | ||
+ | |||
+ | О функции **''ARRSIZE''** так же можно подробнее почитать в разделе [[help:arrays|"Массивы"]]. | ||
+ | |||
+ | ===== Получение значений из переменных ===== | ||
+ | |||
+ | Чтобы получить значение переменной, достаточно написать её имя в выражении. | ||
+ | |||
+ | При этом, чтобы получить кортеж, нужно поставить перед именем переменной ''%'', а чтобы получить строковое значение, нужно поставить перед именем переменной ''$''. | ||
+ | |||
+ | Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! присваиваем значение одной переменной - другой | ||
+ | num = int & ! выражение здесь состоит из одной переменной | ||
+ | ! выводим значение переменной на экран | ||
+ | *pl $text &! выражение состоит из одной переменной | ||
+ | ! вычисляем куб числа, записанного в переменную и выводим на экран | ||
+ | d * d * d &! выражение состоит из двух операций умножения | ||
+ | </sxh> | ||
+ | |||
+ | **Важно!** Если мы пытаемся получить значение переменной, которая не была создана, то такая переменная вернёт значение по умолчанию: | ||
+ | * для числовых переменных значение по умолчанию ''0'' (ноль); | ||
+ | * для текстовых переменных значение по умолчанию ''""'' (пустая строка); | ||
+ | * для кортежей значение по умолчанию ''%%[]%%'' (пустой кортеж). | ||
+ | |||
+ | ===== Локальные переменные ===== | ||
+ | |||
+ | В **QSP** есть возможность сделать переменные локальными, то есть их значения будут сохраняться в пределах определённого //блока кода//, например, только на определённой локации или в отдельном действии. | ||
+ | |||
+ | Чтобы объявить переменную локальной, нужно использовать ключевое слово **''LOCAL''**. В общем виде объявление локальной переменной выглядит так: | ||
+ | |||
+ | <sxh qsp> | ||
+ | LOCAL имя_переменной = [значение] | ||
+ | </sxh> | ||
+ | |||
+ | Здесь **''имя_переменной''** — это имя переменной, которую мы объявляем, а **''[значение]''** — это любое значение, которое мы этой переменной присваиваем. Пример: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! объявляем локальную переменную **tempora** со значением **12** | ||
+ | local tempora = 12 | ||
+ | </sxh> | ||
+ | |||
+ | Эта запись очень похожа на объявление переменной через оператор **''SET''**, и точно так же, как для оператора **''SET''**, для оператора **''LOCAL''** существует возможность объявить сразу несколько локальных переменных: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! множественное объявление локальных переменных | ||
+ | local x, y, $item = 11, 19, "Старый меч" | ||
+ | </sxh> | ||
+ | |||
+ | Как видите, сразу после оператора **''LOCAL''** через запятую перечислены имена объявляемых переменных, затем стоит знак равенства и после него перчислены значения, которые мы присваиваем этим переменным. Число переменных слева от знака **''=''** и число значений справа должны совпадать. | ||
+ | |||
+ | Однако, в отличие от оператора **''SET''** оператор **''LOCAL''** позволяет нам назначить локальные переменные без присвоения им значений. Для этого достаточно просто перечислить после оператора **''LOCAL''** через запятую названия переменных: | ||
+ | |||
+ | <sxh qsp> | ||
+ | local $название_предмета, количество, цена | ||
+ | </sxh> | ||
+ | |||
+ | Здесь оператор **''LOCAL''** работает без операции присваивания. Локальные переменные создаются, но **''arrsize''** для них покажет **''0''**. | ||
+ | |||
+ | Собственные локальные переменные можно создавать для таких блоков кода как: | ||
+ | |||
+ | * Локации сами со себе. | ||
+ | * Код, передаваемый оператору **''DYNAMIC''** или функции **''DYNEVAL''** в виде текста. | ||
+ | * Код, выполняемый при нажатии на гиперссылку. | ||
+ | * Код каждого отдельного Действия (**[[help:acts|ACT]]**). | ||
+ | * Код каждого отдельного Цикла (**[[help:cycle|LOOP]]**) | ||
+ | |||
+ | **Внимание!** У локальных переменных есть одна особенность, которую нужно очень чётко понимать. Значение объявленной в данном блоке кода локальной переменной транслируется и во все вложенные, или вызванные из данного, блоки кода. Например, если на локации объявлена локальная переменная, то её значение транслируется во все вызываемые с помощью **''GOSUB''** или **''FUNC''** локации, в блоки кода для **''DYNAMIC''**/**''DYNEVAL''**, в блоки циклов и так далее. Пример: | ||
+ | |||
+ | <sxh qsp> | ||
+ | # start | ||
+ | ! из этой локации мы будем вызывать локацию foo | ||
+ | i=99 & ! объявляем глобальную переменную | ||
+ | gosub 'foo' | ||
+ | *nl i & ! на экране увидим число 99 | ||
+ | - start - | ||
+ | |||
+ | # foo | ||
+ | ! на этой локации объявляем локальную переменную | ||
+ | local i=0 | ||
+ | ! локальная переменная транслируется в цикл | ||
+ | loop while i<10 step i+=1: | ||
+ | ! в цикле мы вызываем локацию undo | ||
+ | gosub 'undo' | ||
+ | ! и так же в цикле мы работаем с переменной, | ||
+ | ! объявленной на локации foo | ||
+ | end | ||
+ | *nl i & ! на экране увидим число 10 | ||
+ | - foo - | ||
+ | |||
+ | # undo | ||
+ | ! в эту локацию из цикла с локации foo | ||
+ | ! транслируется всё та же локальная переменная | ||
+ | ! объявленная на локации foo | ||
+ | i+=1 & ! увеличиваем значение переменной, влияя на значение в foo | ||
+ | *p 'undo:<<i>>, ' & ! на экране появятся числа 1,3,5,7,9 с припиской undo: | ||
+ | - undo - | ||
+ | </sxh> | ||
+ | |||
+ | **Однако!** Значения локальных переменных не транслируются в действия (в отличие от значений массива **''ARGS''** на текущей локации): | ||
+ | |||
+ | <sxh qsp> | ||
+ | $args[0] = 'текущая локация' | ||
+ | local $var = 'локальная переменная' | ||
+ | *pl $args[0] | ||
+ | *pl $var | ||
+ | act "Вывести значения": | ||
+ | *pl $args[0] | ||
+ | *pl $var | ||
+ | end | ||
+ | </sxh> | ||
+ | |||
+ | **Важно.** Значения локальных переменных не передаются в локации-обработчики событий, однако передаются на локации-обработчики пунктов меню. Будьте внимательны. | ||
+ | |||
+ | ==== Примеры назначения локальных переменных ==== | ||
+ | |||
+ | Две локации, на каждой из которых собственная переменная **''i''**: | ||
+ | |||
+ | <sxh qsp> | ||
+ | # локация 1 | ||
+ | if i=0: i=99 & ! значение переменной i задаётся лишь раз | ||
+ | *pl "Глобальное i = <<i>>" | ||
+ | act "На локацию 2": goto 'локация 2' | ||
+ | - локация 1 - | ||
+ | |||
+ | # локация 2 | ||
+ | *pl "Глобальное i = <<i>>" | ||
+ | local i=137 & ! значение переменной i задаётся лишь раз | ||
+ | *pl "Локальное i = <<i>>" | ||
+ | act "На локацию 1": goto 'локация 1' | ||
+ | - локация 2 - | ||
+ | </sxh> | ||
+ | |||
+ | Ещё пример с двумя локациями: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! этот код последовательно выведет на экран числа 12, 549 и 99, 549 | ||
+ | # start | ||
+ | x=99 | ||
+ | z=4608 | ||
+ | gosub 'foo' | ||
+ | *pl x & *pl z & ! на экран выведутся числа 99 и 549 | ||
+ | - start - | ||
+ | |||
+ | # foo | ||
+ | local x & ! объявляем переменную x локальной для данной локации | ||
+ | x=12 & ! изменяем значение переменной x | ||
+ | z=549 | ||
+ | *pl x & *pl z & ! на экран выведутся числа 12 и 549 | ||
+ | - foo - | ||
+ | </sxh> | ||
+ | |||
+ | Пример объявления локальных переменных в коде для **''DYNEVAL''** и в цикле: | ||
+ | |||
+ | <sxh qsp> | ||
+ | $chkObjWord = { | ||
+ | ! это код, записанный в виде текста в переменную $chkObjWord | ||
+ | ! в локальную переменную $word записываем слово, | ||
+ | ! по которому производим поиск | ||
+ | local $word = $args[0] | ||
+ | loop local i = 1 while no i > countobj step i += 1: | ||
+ | ! используем локальную переменную i внутри цикла | ||
+ | ! цикл выполняется пока счётчик не превысит число предметов | ||
+ | if instr($getobj(i), $word) <> 0: | ||
+ | ! как только в названии очередного предмета | ||
+ | ! встречается рассматриваемое слово | ||
+ | result = i & ! возвращаем позицию | ||
+ | exit & ! закрываем функцию | ||
+ | end | ||
+ | end | ||
+ | } | ||
+ | object_position = dyneval($chkObjWord, 'граната') | ||
+ | </sxh> | ||
+ | |||
+ | Локальные переменные можно объявлять и внутри действий: | ||
+ | |||
+ | <sxh qsp> | ||
+ | i=99 | ||
+ | act "Действие с локальной i": | ||
+ | local i = 449933 | ||
+ | *pl i | ||
+ | end | ||
+ | act "Действие с глобальной i": | ||
+ | *pl i | ||
+ | end | ||
+ | </sxh> | ||
+ | |||
+ | [[help:expressions|Вперёд: Выражения]] |