Изменения

9621 байт добавлено ,  01:11, 13 декабря 2016
м
Откат правок ZLOFENIХ (обсуждение) к версии Epicus
Строка 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 – численное выражение.
 +
|-
 +
|
 +
| Возвращает квадратный корень.
1059

правок