Попробуем покодить? Урок первый
#1
Отправлено 09 January 2014 - 06:30
Популярное сообщение!
Так как форум не предоставляет адекватных средств форматирования кода(чёрные буквы на тёмно-синем фоне(и не надо говорить про индивидов, которые меняют тему)), я буду использовать картинки.
Также прошу не засорять тему и все пожелания, исправления и прочее посылать в ЛС, а в саму тему писать только вопросы.
Начнём-с.
ООП(Объектно-Ориентированное Программирование) - основа бьёнда. Это не процедурный и далеко не императивный язык, здесь всё по большей части закручено именно на объектах, так что примем объект за низшую единицу счисления. Что же такое объект? Аирлок, плата в компьютере, "око" ИИ и т.д. Объект обладает чётко выраженными свойствами(переменные) и возможностями(методы). Но что я говорю, давайте же попробуем создать объект!
Зачем же здесь obj, спросите вы? Позвольте пояснить: бьёнд обладает своей базой, базовыми объектами, которая позволяет легко и просто создавать новые объекты, производные от оных(наследование). Она называется atom(Area. Turf. Obj. Mob.) и позволяет нам воспользоваться одним из четырёх готовых объектов.
Но чем же они отличаются? Зона абсолютно уникальна для определённой точки, то есть в один тайл, мельчайшая единица измерения пространства в бьёнде, не поставить две зоны. Турф относительно уникален - если потанцевать с бубном, можно поставить несколько в один тайл. Объект может спокойно двигаться, а моб может контролироваться игроком(хоть объекты тоже можно контролировать, но моб даёт более обширные возможности).
Я надеюсь, здесь ещё всё понятно и продолжу. Создадим что нибудь относительно простое. Пускай это будет фонарик. Какие свойства должны быть у фонарика? Мы должны знать, включён ли он. Попробуем объявить переменную.
Ах, да, табуляция - определённый промежуток от начала строки, очень важна в бьёнде. Здесь строки заканчиваются не по закрывающему символу ";" или "}", но по "\n" - то есть при переходе каретки на другую строку. В коде выше мы поставили одинарную табуляцию перед "var/on", этим мы обозначили то, что этот код принадлежит к "obj/flashlight". Можете попробывать представить код в виде иерархии - более высшему(меньше табуляции) принадлежит всё более низшее(участки кода под ним, в котором больше табуляции). Однако не переборщите с ней - если вы поставите две табуляции в коде выше, он не будет работать, поскольку структура кода будет нарушена.
К примеру мы можем объявить объект по-другому:
Всё, что по табуляции ниже /obj - принадлежит ему, но наше объявление переменной можно заменить на:
однако здесь и далее объявление объектов будет в строку, объявление переменных в строку, а всё остальное иерархически, это выглядит гораздо нагляднее.
Но чему равна наша переменная? Пока - ничему. Абсолютно ничему. "Абсолютное ничто" в бьёнде равно значению "null". Сделаем так, чтобы фонарик был изначально выключен.
Как можно увидеть, мы делаем переменную равной нулю. Это значение по умолчанию, оно устанавливается при создании объекта, но может быть спокойно изменено. К тому же мы присваиваем нуль не только по велению левой пятки, но и потому что в бьёнде false, ложь, может быть выражена нулём или null'ом., а всё, что не равно этому - true, истина. Надеюсь, вы знаете логику.
Но как изменить значение? Здесь нам и понадобятся методы. Методы исполняют свой код во время вызова. В бьёнде методы делятся на "verb" - действие и "proc" - процедура, которая является функцией(функция возвращает значение, процедура - нет). Объявим небольшой метод, который будет менять значение переменной:
Рассмотрим объявление метода. Оно начинается с "proc", которое говорит бьёнду о том, что мы создаём новый метод, а не переопределяем старый(далее). Дальше после слеша мы видим название метода, а после пустые скобки. Зачем они? В них можно объявить переменные - входные данные, которые могут использоваться в самом методе, в нашем же случае переменных нет, но скобки всё равно требуются, иначе бы метод был бы слишком похож на переменную. Далее мы можем увидеть табуляцию, которая показывает, что строка принадлежит к данному методу и будет исполняться при вызове метода.
Что ещё нужно для счастья? Допустим, добавим фонарю заряд. Как и ранее, создаём переменную под заряд, всё прекрасно, но заряд должен тратиться. Добавим небольшой метод, который будет тратить заряд, а чтобы добавить коду гибкость, пускай на входе будет указано, сколько заряда должно потратиться:
Здесь в скобках указана переменная "t". То есть при вызове функции мы должны будем обязательно указать этот параметр, а во время исполнения метода мы можем им пользоваться, что мы и делаем. А что за "-="? В школе вроде бы такого не проходили. "charge -= t" это сокращённая форма вычитания, которая равна "charge = charge - t", то есть мы просто вычитаем левый аргумент(переменную) из правого. Но каждый раз запоминать и указывать это число - неблагодарное дело. Почему бы не сделать значение по умолчанию, как с переменной в объекте? Действительно. Немного редактируем и вуаля:
Теперь не обязательно указывать это значение, если оно не будет указано, то автоматически заменится на это, НО такие переменные должны быть указаны только после переменных без стандартного значения, то есть можно сделать "(var/t, var/k = 1)", но нельзя "(var/k = 1, var/t)". Будьте осторожны.
Кстати, если вы внимательны, вы могли заметить, что я изменил первый метод на "Switch()". Внутри нашей переменной, отвечающей за состояние фонаря присваивается та же переменная, но отрицательная, НЕ-переменная. Как бы это не звучало, но работает это так - если в переменной стоит, допустим, 143, то мы получим 0, если стоит 0, то получим 1. Это очень удобно для проверок. Получается, что мы присваиваем переменной "on", которая равна 0, "!on", которая становится единицей. А если вызовем повторно, то уже "on", которая равна 1 "!on", которая равна нулю. Такие дела.
В одном сообщении лимит на 10 изображений, сообщения сливаются. Продолжение через ~20 минут.
#2
Отправлено 09 January 2014 - 06:38
Популярное сообщение!
Я воспользовался системным методом, который определяет максимальное значение среди всех введённых и возвращает его. Таким образом мы проверяем, меньше ли "charge - t" нуля или нет. Если меньше - вернётся 0, иначе "charge - t".Таким образом заряд никогда не упадёт меньше нуля. Но если заряд равен нулю, то нам нужно выключить фонарь! Но даже это мы можем сделать, мы же кодеры! Добавим проверку:
Что-то новое! "if" это проверка, если в скобках будет истина - код под ней исполнится, обратите внимание на табуляцию. В данном случае мы можем увидеть в скобках "charge". Как я уже говорил - 0 это ложь, не 0 это истина, то есть если в коде выше заряду присвоится значение 0, то исполнится код. Отлично! Мы уже близки к тому, чтобы сделать фонарь идеальным. Стоп! А если сработает какое нибудь ЕМП и заряд потратится, пока фонарь выключен? Тогда он при заряде в нуль возьмёт и включится, а это не очень хорошо. Добавим ещё одну проверку и получим:
"on" это понятно, но что значит "&&" ? Это логический оператор И. Можно его представить как булевский(булевские значения это истина или ложь - основа компьютерной логики) знак умножения. Если мы умножим 0 на 1, получим 0, если 1 на 0, тоже 0, а если 1 на 1, то 1. То есть "Switch()" сработает только если заряд будет равен нулю И фонарь будет включён. Также есть "||" - оператор сложения. 1 и 1 будет 1, 1 и 0 будет 1 и лишь 0 и 0 вернут 0. Осталось закрыть последнюю дыру - фонарь можно включить, когда заряда нет. Но с вашими новыми знаниями это очень легко:
Что за return? Это оператор возврата значения. Если его прописать без значения - как в нашем случае, он возвращает null, хотя это мы обсудим в другом уроке. В данном случае return работает как прерыватель исполнения кода. То есть после выполнения return'а, исполнение данного метода дальше не идёт.
Я устал, хочу есть и вообще шея затекла, поэтому на сегодня мы закончим. Ещё картинки загружать все и подставлять -___-
Удачи вам, спасибо, что прочитали, надеюсь, это вам поможет. Продолжение будет, когда - не знаю.
З.Ы. Гайды перманентно редактируются. Если вы считаете, что нужно что-то добавить по теме, описанной в начале - пишите в ЛС.
#3
Отправлено 09 January 2014 - 06:49
#4
Отправлено 09 January 2014 - 06:49
#5
Отправлено 09 January 2014 - 07:12
ACCount (09 January 2014 - 06:49) писал:
Хм... Да, понял, действительно глупая ошибка, проглядел, исправил
#7
Отправлено 09 January 2014 - 09:23
#8
Отправлено 09 January 2014 - 10:36
Комбат аутист ис аривед.
#10
Отправлено 09 January 2014 - 11:07
Нет правда. Держи в том же духе. Охрененный гайд.
▲
▲ ▲
#11
Отправлено 09 January 2014 - 13:32
Цитата
Я правильно понял, что object - производный класс?
Цитата
Цитата
#14
Отправлено 09 January 2014 - 13:48
#15
Отправлено 09 January 2014 - 13:48
Kinrany (09 January 2014 - 13:32) писал:
foo(1,2,3)Но иногда надо много раз вызывать процедуру с некоторыми одинаковыми параметрами:
foo(2,3,3); foo(3,4,3); foo(4,5,3);В этом случае при описании процедуры в заголовке указывается, какое значение параметра должно использоваться, если при вызове это не указано явно:
foo(2,3); foo(3,4); foo(4,5);И заголовок выглядит следующим образом:
foo(var/k,var/l,var/n=3);Почему параметры по-умолчанию должны быть в конце? Чтобы не возникло путаницы с тем, на место какого параметра подставлять переданные значения.
#16
Отправлено 09 January 2014 - 14:01
fey (09 January 2014 - 10:44) писал:
ебал мамку опа
Kawaiidesu~~~ (09 January 2014 - 06:30) писал:
#17
Отправлено 09 January 2014 - 14:01
#18
Отправлено 09 January 2014 - 14:04
Loly (09 January 2014 - 13:46) писал:
Единственное, что мне осталось не понятным - откуда вылезло последнее, если на предпроследнем, на 10 строке было if, а стало proc.
Kinrany (09 January 2014 - 14:01) писал:
#20
Отправлено 09 January 2014 - 14:09
Kinrany (09 January 2014 - 13:32) писал:
Сначала надо нормальный язык учить
И снова да, я не собираюсь разводить маразм на 20 экранов, объясняя основы основ, а что такое переменная и метод можно понять и из контекста, и из описания. А если не вышло, увы, не тот склад ума, иди беки писать/спрайты рисовать. В любом случае учить бьёнд первым языком - хоронить своё будущее.
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных