Изменения

м
clean up
Строка 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 – численное выражение.
  −
|-
  −
|
  −
| Возвращает квадратный корень.
 
501

правка