Перейти к содержимому


Попробуем покодить? Урок первый


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 32

#1 Kawaiidesu~~~

Kawaiidesu~~~

    2D-космонавтик

  • Employee
  • 137 сообщений

Отправлено 09 January 2014 - 06:30

*
Популярное сообщение!

Здравствуйте, я Kawaiidesu~~~, левый мультиакк, и сегодня мы будем создавать объекты, переменные, методы, изучать основы логики.

Так как форум не предоставляет адекватных средств форматирования кода(чёрные буквы на тёмно-синем фоне(и не надо говорить про индивидов, которые меняют тему)), я буду использовать картинки.
Также прошу не засорять тему и все пожелания, исправления и прочее посылать в ЛС, а в саму тему писать только вопросы.

Начнём-с.

ООП(Объектно-Ориентированное Программирование) - основа бьёнда. Это не процедурный и далеко не императивный язык, здесь всё по большей части закручено именно на объектах, так что примем объект за низшую единицу счисления. Что же такое объект? Аирлок, плата в компьютере, "око" ИИ и т.д. Объект обладает чётко выраженными свойствами(переменные) и возможностями(методы). Но что я говорю, давайте же попробуем создать объект!

Изображение

Зачем же здесь 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 Kawaiidesu~~~

Kawaiidesu~~~

    2D-космонавтик

  • Employee
  • 137 сообщений

Отправлено 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 ACCount

ACCount

    Ветеран космонавтики

  • Employee
  • 2684 сообщений
  

Отправлено 09 January 2014 - 06:49

У тебя свитч при разрядке сломался. Плохо сделал, негодно.

#4 Gwini

Gwini

    Работает над единой теорией ролеплея.

  • Employee
  • 2541 сообщений
  

Отправлено 09 January 2014 - 06:49

Великолепно! Продолжай

#5 Kawaiidesu~~~

Kawaiidesu~~~

    2D-космонавтик

  • Employee
  • 137 сообщений

Отправлено 09 January 2014 - 07:12

Просмотр сообщенияACCount (09 January 2014 - 06:49) писал:

У тебя свитч при разрядке сломался. Плохо сделал, негодно.
Будто бы он должен включаться, если разряжен. Который раз ты показываешь свою некомпетентность и всё равно суёшь везде нос. Ну ничего, я буду каждый раз объяснять тебе то или иное действие.
Хм... Да, понял, действительно глупая ошибка, проглядел, исправил
Хорошая сторона Интера
Изображение

#6 Jarl

Jarl

    Лазанья с Шепардом

  • Employee
  • 7514 сообщений
  • ГородЕкатеринбург

Отправлено 09 January 2014 - 07:31

Плохо, негодно. Стоило объяснить азы прежде чем писать код. Так ты учишь обезьян копипастить, а не понимать.
ИзображениеИзображение

#7 StepFan

StepFan

    ultranumb

  • Employee
  • 1588 сообщений
  • ГородТрансметрополитен

Отправлено 09 January 2014 - 09:23

Поставил плюсик за аватарку.

#8 Hypela

Hypela

    Заслуженный космонавт

  • Employee
  • 950 сообщений

Отправлено 09 January 2014 - 10:36

Хорошо-годно. Но нужны азы, основы. И у тебя картинка отвалилась.
River Springs смотрит в стену с ненавистью
Комбат аутист ис аривед.

#9 fey

fey

    Командир отделения

  • Employee
  • 3856 сообщений

Отправлено 09 January 2014 - 10:44

Блять, для кого теги кода придумали?
ебал мамку опа

Если вам понравилась моя публикация, комменатрий, хоитет сказать спасибо, можете сделать это здесь, поставив плюсик или оставить свой отзыв.

#10 Poldan

Poldan

    Второй Б̴͡ар͢ха͘н҉̵̢д̡̢͝а̴̴͞р͢͝

  • Employee
  • 947 сообщений

Отправлено 09 January 2014 - 11:07

ЭТО ШЕДЕЕЕВР!
Изображение
Нет правда. Держи в том же духе. Охрененный гайд.
АЧИВМЕНТ ГЕТ! Убить пришельца, будучи проглоченным им. [Телескопическая дубинка]

▲  ▲


#11 Kinrany

Kinrany

    Ветеран космонавтики

  • Employee
  • 1364 сообщений

Отправлено 09 January 2014 - 13:32

Цитата

Изображение

Я правильно понял, что object - производный класс?

Цитата

Теперь не обязательно указывать это значение, если оно не будет указано, то автоматически заменится на это, НО такие переменные должны быть указаны только после переменных без стандартного значения, то есть можно сделать "(var/t, var/k = 1)", но нельзя "(var/k = 1, var/t)". Будьте осторожны.
яннп

Цитата

Плохо, негодно. Стоило объяснить азы прежде чем писать код. Так ты учишь обезьян копипастить, а не понимать.
Сначала надо нормальный язык учить

#12 Kinrany

Kinrany

    Ветеран космонавтики

  • Employee
  • 1364 сообщений

Отправлено 09 January 2014 - 13:39

Просмотр сообщенияfey (09 January 2014 - 10:44) писал:

Блять, для кого теги кода придумали?
ебал мамку опа
У колдспейсорабов оно выглядит как говно.
/obj/object


#13 Loly

Loly

    「ALL STAR」

  • Employee
  • 9275 сообщений
  • Byond:MyLittleLoly
  • Discord:Loly#6528
  • ГородКиев
        

Отправлено 09 January 2014 - 13:46

Человек выше дело говорит, ибо нужно знать хотя бы один язык, что бы понять другой.
Единственное, что мне осталось не понятным - откуда вылезло последнее, если на предпроследнем, на 10 строке было if, а стало proc.

Изображение
Изображение

Скрытый текст


#14 Kinrany

Kinrany

    Ветеран космонавтики

  • Employee
  • 1364 сообщений

Отправлено 09 January 2014 - 13:48

И хотя бы два разных, чтобы понять бьондокод, имхо

#15 StepFan

StepFan

    ultranumb

  • Employee
  • 1588 сообщений
  • ГородТрансметрополитен

Отправлено 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 Kawaiidesu~~~

Kawaiidesu~~~

    2D-космонавтик

  • Employee
  • 137 сообщений

Отправлено 09 January 2014 - 14:01

Просмотр сообщенияfey (09 January 2014 - 10:44) писал:

Блять, для кого теги кода придумали?
ебал мамку опа

Просмотр сообщенияKawaiidesu~~~ (09 January 2014 - 06:30) писал:

Так как форум не предоставляет адекватных средств форматирования кода(чёрные буквы на тёмно-синем фоне(и не надо говорить про индивидов, которые меняют тему)), я буду использовать картинки.
К тому же у меня это выглядит как дерьмо:
Изображение
Хорошая сторона Интера
Изображение

#17 Kinrany

Kinrany

    Ветеран космонавтики

  • Employee
  • 1364 сообщений

Отправлено 09 January 2014 - 14:01

Окей, а перегрузка-то есть?

#18 Kawaiidesu~~~

Kawaiidesu~~~

    2D-космонавтик

  • Employee
  • 137 сообщений

Отправлено 09 January 2014 - 14:04

Просмотр сообщенияLoly (09 January 2014 - 13:46) писал:

Человек выше дело говорит, ибо нужно знать хотя бы один язык, что бы понять другой.
Единственное, что мне осталось не понятным - откуда вылезло последнее, если на предпроследнем, на 10 строке было if, а стало proc.
Извиняюсь, добавил просто сверху строк. Или убрал. Я вообще подобного рода гайд первый раз пишу, ничего не продумал.

Просмотр сообщенияKinrany (09 January 2014 - 14:01) писал:

Окей, а перегрузка-то есть?
Я затрагивал только темы, описанные в начале, слишком уж это много времени тратит, убил полтора часа, но я собираюсь раскрыть тему наследования, а насчёт перегрузок сомневаюсь, но проверю. В бьёнде всё довольно гибкое, так что они практически и не требуются.
Хорошая сторона Интера
Изображение

#19 TestUnit

TestUnit

    Вскрываю Искхи как шампанское

  • Employee
  • 3017 сообщений
  • Discord:TestUnit#1075
  • ГородАзжол-Неруб
     

Отправлено 09 January 2014 - 14:04

ОП заставил меня скачать третьих героев. (Спасибо кстати)
Image
Скрытый текст


#20 Kawaiidesu~~~

Kawaiidesu~~~

    2D-космонавтик

  • Employee
  • 137 сообщений

Отправлено 09 January 2014 - 14:09

Просмотр сообщенияKinrany (09 January 2014 - 13:32) писал:

Я правильно понял, что object - производный класс?
Сначала надо нормальный язык учить
Да, object - производный класс, наследованный от obj - стандартного бьёндокласса.
И снова да, я не собираюсь разводить маразм на 20 экранов, объясняя основы основ, а что такое переменная и метод можно понять и из контекста, и из описания. А если не вышло, увы, не тот склад ума, иди беки писать/спрайты рисовать. В любом случае учить бьёнд первым языком - хоронить своё будущее.
Хорошая сторона Интера
Изображение


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных