Переменные (практика)
Я не буду описывать здесь, какие есть переменные и как их создавать - это
уже было описано в первой части. Рассмотрим переменную как объект.
Что есть переменная? Каждая переменная - что-то вроде листика, на который
Вы записываете информацию, чтобы не забыть ее. Можно рассматривать переменную
как объект, свойства которого - название и тип данных, которые можно в нее
записать и значение, записанное в переменную. Действия, которые можно
производить с переменными - создать, присвоить новое значение, прочитать
значение переменной.
Начнем с переменных числового (и дробного) типа.
Для работы с числами в WE есть два типа переменных: integer и
real.
В переменные типа integer можно записать целые числа (для не
математиков напоминаю: это числа без дробной части, но не только положительные,
но и отрицательные).
Если Вы попытаетесь записать в переменную целого типа
число с дробной частью (это вообще говоря некорректная операция) в WE никаких
ошибок не будет. Просто в переменную будет записано значение без дробной
части.
Например, если в переменную i целого типа Вы попытаетесь
записать дробь 1 / 3, то в результате туда будет записан 0 (1 /
3 округляется, получается 0). Если 5 / 4 - то в i будет
записана 1.
Другой тип - real - рациональные числа (дроби). В WE такие числа
записываются как десятичные дроби. Хотя при желании Вы можете записать в
переменную типа real и целое число (без дробной части). Рациональные
числа в WE ущербны, поскольку можно записать лишь два знака после запятой.
Остальные знаки будут просто отброшены (никакого округления! они просто
игнорируются). С другой стороны, для сценариев не требуется большая точность
вычислений.
Посмотрим, какие значения можно помещать в числовые переменные.
Войдите в WE, начните новый сценарий, сотрите все триггеры. Создайте
переменную i типа integer и переменную r типа
real.
Далее создайте триггер с событием Map Initialization.
Создайте действие set variable. В качестве первого параметра нужно
указать переменную, значение которой мы изменяем. Укажите переменную i.
Второй параметр - какое значение мы хотим установить переменной. Когда Вы
нажмете на него, Вам будет выдано окно, где будет предложено выбрать один из
трех вариантов:
- Variable (переменная)
- Function (функция)
- Value (значение)
Итак, Вы можете присвоить одной переменной значение другой переменной (ну
скажем set a = b - в переменной a будет записано такое же
значение, как в b).
Другой вариант - написать конкретное значение, которое Вы хотели бы
присвоить переменной - введите его в пункте Value.
И, наконец, третий
пункт - функции. В списке функций будут все функции Варкрафта, которые
возвращают integer. Как работают функции и выражение уже было описано в
это статье.
Однако один момент надо все-таки рассказать... Поясню на примере.
Например, мы решили переменной i присвоить значение равное 12 - 5.
Для этого надо воспользоваться функцией (а не написать в поле Value!)
Arithmetic!
Примечание: хотя Arithmetic по синтаксису триггеров -
функция, на самом деле это не так. В JASS скрипте будет написано по-нормальному,
т. е. само выражение. Поэтому "функция" Arithmetic "нормальна" с точки
зрения оптимизации.
Реально у Blizzard не было другого выхода - не заставлять
же писать выражения на JASS'е, учитывая что знать его будет не больше 2% всех
мапперов?
Если все было сделано правильно, то действие будет выглядеть так:
Set i = (12 - 5)
Вопрос: как нам установить значение переменной i, чтобы она была
равна 12 - 5 + 3, т. е. не два, а три слагаемых? Для этого снова
пользуемся функцией Arithmetic: в качестве первого параметра выбираете
снова функцию Arithmetic, и как её параметры ставим 12 - 5. В
качестве второго параметра вводим 3. Не забудьте про знаки, конечно. Если все
сделано верно, действие будет выглядеть так:
Set i = ((12 - 5) + 3)
Такой способ ввода значений весьма неудобен. Но что поделать, приходится
пользоваться тем, что есть.
Достаточно часто используется такой прием:
Set i = (i + 1)
Что произойдет после выполнения этого действия? Значение переменной
i увеличится на единицу, каким бы оно не было раньше. Это нам говорит о
том, что можно использовать значение самой переменной (которой присваивается
значение) в выражении.
Когда Вы создадите действие set variable, но в качестве первого
параметра выберете переменную r (типа real), Вам будет
предоставлен другой набор функций, уже не будет тех, что возвращают
integer (хотя я и говорил, что значение автоматически конвертируется -
функций в списке нет). Но есть функция конверции из integer'а в
real.
Как видите всяких действий с числами в WE можно производить предостаточно.
Можно было бы даже использовать его как калькулятор :)
В обычных сценариях не так уж часто приходится пользоваться всеми этими
функциями, но на самом деле они открывают картостроителю многие возможности.
Поэтому нужно уметь с ними работать.
Давайте решим такую задачу: поместим в переменную r значение 100
+ ((случайное число от 1 до 10) / 5).
Set i = (100 + ((Random integer number between 1 and 10) / 5))
Допустим, перед нами стоит задача: задать переменной i значение 1
+ 2 + 3 + 4 + 5 + ... + 10, т. е. слагаемых много. Если каждый раз делать
арифметическую функцию - потратите много времени и сил, чтобы все сделать
правильно и нигде случайно не ошибиться. Можно схитрить: записать действие не в
одну, а в несколько строк.
Set i = (i + 1)
Set i = (i + 2)
Set i = (i + 3)
Set i = (i + 4)
Set i = (i + 5)
Set i = (i + 6)
Set i = (i + 7)
Set i = (i + 8)
Set i = (i + 9)
Set i = (i + 10)
В итоге в переменной i будет записано нужное нам значение, но каждую
строку не обязательно переписывать - можно просто скопировать и немного изменить
ее (или воспользоваться циклом, о чем чуть позже).
А можем ли мы просмотреть, какое значение у какой-нибудь числовой
переменной? Можем. Вы уже знакомы (я надеюсь) с действием game - text
message. Она позволяет выводить текстовые строки. Но мы не можем просто
взять и вывести число, потому что у него нету такого действия (как у
объекта, помните), такое действие есть только у строк. Есть функции
перевода числа в строку, которая берет как аргумент число, а возвращает строку с
этим числом.
Примечание: важно понимать, что вроде бы очевидные вещи иногда
нельзя сделать. Пример с числом идеально это показывает. С точки зрения
компьютера строка - набор символов. Но мы обозначаем числа
символами (поэтому иногда не сразу ясно - компьютер, в своем внутреннем
представлении ничего ничем не обозначает - там другая логика), и называем это
цифрами. Для строки не имеет никакого значения, есть ли в ней цифры или
нет - для неё это такие же символы, как и остальные. Поэтому и надо сначала
сконвертировать число в цифры - набор символов.
Выберите фукнцию convertion - convert real to string (перевести
рациональное число в строку) - и в качестве числа укажите переменную r.
Если же хотите посмотреть переменную i, выберете функцию convertion -
convert integer to string и в качестве числа аргумента укажите переменную
i.
Объяснять все эти вещи непросто, хоть они и являются достаточно простыми.
Нужно просто понять, самому поработать с переменными. Поэтому даю задание
(делать только тем, кто не умеет работать с переменными):
- Создать минисценарий с переменными a, b, d типа
real, c типа integer
- В переменную a поместить ((случайное число от 1 до 10) + 5 /
2).
- В переменную b поместить 2^4 (два в четвертой степени).
- В переменную c поместить 1 - 2 - 3.
- В переменную d поместить наибольшее из чисел a и b.
- Вывести значение всех переменных на экран.