Строка 1: |
Строка 1: |
− | ''Это 16-я глава перевода оригинального руководства по Dream Maker от разработчиков.''
| |
| | | |
− | [[All_about_the_code|Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.]]
| |
| | | |
− | [http://www.byond.com/docs/guide/chap16.html Оригинальная 16-я глава руководства на английском языке]
| |
| | | |
− | ==Глава 16: Математика==
| + | [[Файл:LtJ6KqW6mKk.jpg|LtJ6KqW6mKk.jpg]] |
− | | + | [https://www.youtube.com/watch?v=wqpseZS3mD0 Конец прекрасной эпохи. Мы еще увидимся, я обещаю!] |
− | Вы когда-нибудь задавались вопросом, почему математики на вас странно смотрят? Где-то в разрядах числа π сокрыт ваш личный дневник в обычном ASCII.
| |
− | | |
− | Базовые математические операторы уже были описаны [[DM_Guide_6#Математические операторы|в 6-ой главе]]. Предусмотрено много дополнительных математических функций для специфических целей. Они описаны в нижеследующих разделах.
| |
− | | |
− | ===Генерация случайных чисел===
| |
− | | |
− | Случай играет большую роль во многих типах игр, так что DM предоставляет несколько способов генерации случайных чисел. На самом деле они все основаны на генераторе псевдослучайных чисел и только кажутся случайными. Однако, на практике, на них можно положиться для получения чисел без заметного закона распределения.
| |
− | | |
− | ====rand====
| |
− | | |
− | ''rand'' позволяет сгенерировать случайное число из заданного диапазона. Возвращаемое число всегда целое, так что если требуется дробное число, нужно задать больший диапазон и затем разделить результат.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | rand
| |
− | | (L=0,U)
| |
− | |-
| |
− | |
| |
− | | L - нижняя граница.
| |
− | |- | |
− | |
| |
− | | U - верхняя граница.
| |
− | |-
| |
− | |
| |
− | | Возвращает число в диапазоне от L до U (включая L и U).
| |
− | |}
| |
− | | |
− | Если задан только один аргумент, то он считается верхней границей, а нижней границей берется нуль.
| |
− | | |
− | Ниже следует пример кода «зелья игрока».
| |
− | | |
− | obj/potion/lucky
| |
− | verb/drink()
| |
− | usr.AddLife(rand(-20,20))
| |
− | | |
− | В зависимости от удачи пользователя, зелье может нанести 20 урона или восстановить 20 здоровья.
| |
− | | |
− | Этот код предполагает, что описана процедура ''AddLife()'', которая лечит или наносит урон мобу. Она аналогична процедуре ''HurtMe()'', описанной [[DM_Guide_6# Создание процедуры|в главе 6]], но с аргументом, взятым с обратным знаком
| |
− | | |
− | ====prob====
| |
− | | |
− | ''prob'' возвращает true или false с вероятностью, задаваемой в процентах.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | prob
| |
− | | (P)
| |
− | |-
| |
− | |
| |
− | | P – процентная вероятность возвратить true.
| |
− | |-
| |
− | |
| |
− | | Возвращает 1 в P процентах случаев, в остальных возвращает 0.
| |
− | |}
| |
− | | |
− | Она может быть использована для выбора одного из двух возможных результатов. В приведенном ниже примере, зелью дан небольшой шанс наложения на игрока отрицательного эффекта.
| |
− | | |
− | obj/potion/health
| |
− | verb/drink()
| |
− | if(prob(20)) //не повезет в 20% случаев
| |
− | usr.AddLife(-10)
| |
− | else
| |
− | usr.AddLife(20)
| |
− | | |
− | ====roll====
| |
− | | |
− | ''roll'' «кидает» несколько костей и возвращает «выпавшую» сумму. Грани костей пронумерованы от единицы и до заданного числа граней, выпадение каждой грани равновероятно.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | roll
| |
− | | (dice=1,sides)
| |
− | |-
| |
− | | roll
| |
− | | ("dicedsides")
| |
− | |-
| |
− | |
| |
− | | dice – количество бросаемых костей.
| |
− | |-
| |
− | |
| |
− | | sides – количество граней бросаемых костей.
| |
− | |-
| |
− | |
| |
− | | Возвращает сумму выпавших на всех костях граней.
| |
− | |}
| |
− | | |
− | Параметры костей могут быть заданы как два отдельных числовых аргумента или как одна текстовая переменная. Текстовое представление может быть полезно, если вы хотите сохранить параметры костей как одну переменную.
| |
− | | |
− | В следующем примере ''roll'' использована для подсчета урона оружия.
| |
− | | |
− | obj/weapon
| |
− | var/power
| |
− | clipboard
| |
− | power = "1d4"
| |
− | calculator
| |
− | power = "2d6"
| |
− | verb/swing(mob/trg in view(1))
| |
− | var/damage = roll(power)
| |
− | view() << "[usr] hits [trg] with \a [src] for [damage] point\s!"
| |
− | | |
− | И в программировании, и в бою вам приходится довольствоваться тем, что есть.
| |
− | | |
− | ====pick====
| |
− | | |
− | ''pick'' случайным образом выбирает один из её аргументов и возвращает его значение.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | pick
| |
− | | (Val1,Val2,...)
| |
− | |-
| |
− | |
| |
− | | Возвращает одно из заданных значений.
| |
− | |}
| |
− | | |
− | Если вы хотите, что бы у определенного аргумента была большая или меньшая вероятность быть выбранным, задайте т.н. относительную вероятность. Относительная вероятность равная 200 означает, что аргумент будет выбираться в два раза чаще, при 50 – в два раза реже и т.д.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | prob (
| |
− | | P); Val
| |
− | |-
| |
− | | или
| |
− | | P; Val)
| |
− | |-
| |
− | |
| |
− | | P – относительная вероятность (по умолчанию равна 100).
| |
− | |-
| |
− | |
| |
− | | Val – значение с измененной вероятностью выбора.
| |
− | |}
| |
− | | |
− | В нижеследующем примере ''pick()'' использована в коде печенья с предсказанием.
| |
− | | |
− | obj/fortune_cookie
| |
− | verb/eat()
| |
− | usr << "The message inside says:"
| |
− | usr << pick (
| |
− | "Never trust an undead doctor.",
| |
− | "Only trust undead lawyers.",
| |
− | prob(25)
| |
− | "The throne marks the way.",
| |
− | prob(10)
| |
− | "The wall behind the throne is an illusion!"
| |
− | )
| |
− | del(src)
| |
− | | |
− | В этом примере два сообщения имеют нормальную вероятность появления, одно четверть от нормальной вероятности и одно десятую часть. Заметьте, с ''prob()'' вместо точки с запятой может использоваться новая строка. Это позволяет выстраивать элементы по линии, если вы любитель этого дела.
| |
− | | |
− | ===abs===
| |
− | | |
− | ''abs'' вычисляет модуль числа.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | abs
| |
− | | (N)
| |
− | |-
| |
− | |
| |
− | | N – численное выражение.
| |
− | |-
| |
− | |
| |
− | | В
| |
− | |}
| |
− | | |
− | ===min===
| |
− | | |
− | ''min'' возвращает значение минимального из его аргументов.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | min
| |
− | | (N1,N2,...)
| |
− | |-
| |
− | |
| |
− | | N1 – первое численное выражение.
| |
− | |-
| |
− | |
| |
− | | N2 – второе и последующие численные выражения.
| |
− | |-
| |
− | |
| |
− | | Возвращает минимальное значение.
| |
− | |}
| |
− | | |
− | ===max===
| |
− | | |
− | ''max'' возвращает значение максимального из его аргументов.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | max
| |
− | | (N1,N2,...)
| |
− | |-
| |
− | |
| |
− | | N1 – первое численное выражение.
| |
− | |-
| |
− | |
| |
− | | N2 – второе и последующие численные выражения.
| |
− | |-
| |
− | |
| |
− | | Возвращает максимальное значение.
| |
− | |}
| |
− | | |
− | ===round===
| |
− | | |
− | ''round'' округляет число до ближайшего кратного заданному множителю. Если множитель не задан (или он равен нулю), возвращает целую часть. Обратите внимание, что при множителе равном 1, число ''округляется'' до ближайшего целого.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | round
| |
− | | (N,M)
| |
− | |-
| |
− | |
| |
− | | N – численное выражение, требующее округления.
| |
− | |-
| |
− | |
| |
− | | M – множитель.
| |
− | |-
| |
− | |
| |
− | | Возвращает ближайшее к N число кратное M.
| |
− | |}
| |
− | | |
− | ===sqrt===
| |
− | | |
− | ''sqrt'' вычисляет квадратный корень числа. Эта операция эквивалентна возведению числа в степень ½ при помощи оператора **, представлена в таком виде для удобства.
| |
− | | |
− | {| border="0"
| |
− | |-
| |
− | | sqrt
| |
− | | (N)
| |
− | |-
| |
− | |
| |
− | | N – численное выражение.
| |
− | |-
| |
− | |
| |
− | | Возвращает квадратный корень.
| |