WarCraft 3: Переменные (практика)

Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2014
Сообщения
57
Реакции[?]
6
Поинты[?]
0
[HR][/HR]
[HR][/HR]
Переменные (практика)

[HR][/HR]
Я не буду описывать здесь, какие есть переменные и как их создавать - это уже было описано в первой части. Рассмотрим переменную как объект.

Что есть переменная? Каждая переменная - что-то вроде листика, на который Вы записываете информацию, чтобы не забыть ее. Можно рассматривать переменную как объект, свойства которого - название и тип данных, которые можно в нее записать и значение, записанное в переменную. Действия, которые можно производить с переменными - создать, присвоить новое значение, прочитать значение переменной.
Начнем с переменных числового (и дробного) типа.

Для работы с числами в WE есть два типа переменных: integer и real.
В переменные типа integer можно записать целые числа (для не математиков напоминаю: это числа без дробной части, но не только положительные, но и отрицательные).
Если Вы попытаетесь записать в переменную целого типа число с дробной частью (это вообще говоря некорректная операция) в WE никаких ошибок не будет. Просто в переменную будет записано значение без дробной части.
Например, если в переменную i целого типа Вы попытаетесь записать дробь 1 / 3, то в результате туда будет записан 0 (1 / 3 округляется, получается 0). Если 5 / 4 - то в i будет записана 1.

Другой тип - real - рациональные числа (дроби). В WE такие числа записываются как десятичные дроби. Хотя при желании Вы можете записать в переменную типа real и целое число (без дробной части).

Посмотрим, какие значения можно помещать в числовые переменные.

Войдите в 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% всех мапперов?
Если все было сделано правильно, то действие будет выглядеть так:

PHP:
Set i = (12 - 5)
Вопрос: как нам установить значение переменной i, чтобы она была равна 12 - 5 + 3, т. е. не два, а три слагаемых? Для этого снова пользуемся функцией Arithmetic: в качестве первого параметра выбираете снова функцию Arithmetic, и как её параметры ставим 12 - 5. В качестве второго параметра вводим 3. Не забудьте про знаки, конечно. Если все сделано верно, действие будет выглядеть так:

PHP:
Set i = ((12 - 5) + 3)
Такой способ ввода значений весьма неудобен. Но что поделать, приходится пользоваться тем, что есть.

Достаточно часто используется такой прием:

PHP:
Set i = (i + 1)
Что произойдет после выполнения этого действия? Значение переменной i увеличится на единицу, каким бы оно не было раньше. Это нам говорит о том, что можно использовать значение самой переменной (которой присваивается значение) в выражении.

Когда Вы создадите действие set variable, но в качестве первого параметра выберете переменную r (типа real), Вам будет предоставлен другой набор функций, уже не будет тех, что возвращают integer (хотя я и говорил, что значение автоматически конвертируется - функций в списке нет). Но есть функция конверции из integer'а в real.

Как видите всяких действий с числами в WE можно производить предостаточно. Можно было бы даже использовать его как калькулятор :biggrin:

В обычных сценариях не так уж часто приходится пользоваться всеми этими функциями, но на самом деле они открывают картостроителю многие возможности. Поэтому нужно уметь с ними работать.

Давайте решим такую задачу: поместим в переменную r значение 100 + ((случайное число от 1 до 10) / 5).

PHP:
Set i = (100 + ((Random integer number between 1 and 10) / 5))
Допустим, перед нами стоит задача: задать переменной i значение 1 + 2 + 3 + 4 + 5 + ... + 10, т. е. слагаемых много. Если каждый раз делать арифметическую функцию - потратите много времени и сил, чтобы все сделать правильно и нигде случайно не ошибиться. Можно схитрить: записать действие не в одну, а в несколько строк.

PHP:
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.
  • Вывести значение всех переменных на экран.


Статья скопирована с сайта:
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Сверху Снизу