Строка 1: |
Строка 1: |
| + | ''Это 16-я глава перевода оригинального руководства по Dream Maker от разработчиков.'' |
| | | |
| + | [[All_about_the_code|Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.]] |
| | | |
| + | [http://www.byond.com/docs/guide/chap16.html Оригинальная 16-я глава руководства на английском языке] |
| | | |
− | [[Файл:LtJ6KqW6mKk.jpg|LtJ6KqW6mKk.jpg]] | + | ==Глава 16: Математика== |
− | [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 – численное выражение. |
| + | |- |
| + | | |
| + | | Возвращает квадратный корень. |