adic3x
offline
Опыт:
108,439Активность: |
Ищем баги сами
DeBug для чайниковСтатья посвящена вопросу поиска ошибок в алгоритме и ориентирована на тригерщиков среднего уровня, хотя и новичкам будет полезна к ознакомлению. Думаю не для кого не секрет, что отладка алгоритма как правило занимает времени не меньше, чем само его написание. Тем более многие тригерщики, с которыми я сталкивался вообще не знают как самостоятельно найти ошибку. Ситуацию отягощает также отсутствие программы-отладчика для языка jass (напомню что тригеры - это всего лишь визуальная оболочка jass кода). В данной статье я намерен ознакомить читателя с методом отладочной печати, или попросту вывода DeBug сообщений. Вопрос ошибок, возникающих при написании jass кода я рассматривать не буду (а в GUI они кажется вообще отсутствуют). Итак, ниже я приведу достаточно примитивный тригер: DEAD URL Он срабатывает при смерти юнита, и если юнит принадлежит Игроку 12 (в jass) или 13 (Нейтрально враждебный в GUI) то прибавляет к целочисленной переменной i_CreepsCounter (дословно счетчик крипов) уровень убитого монстра. Далее идет проверка, не достигла ли данная переменная значения 30, и если да, то данный тригер выключается, выводиться сообщение игроку, и через некоторое время объявляется победа. Смысл его в том, что когда игрок убьет достаточно монстров (а то, насколько ценный монстр определяется по его уровню) объявить игроку победу. Вроде все правильно. Однако сыграв несколько раз в карту и убивая нейтралов мы обнаружим, что победа не объявляется. И тут пришло время искать ошибку... С чего начать? Для начала стоит посмотреть на наш тригер, возможно вы сможете определить ошибку просто внимательно просмотрев его. Однако такое возможно далеко не всегда т.к. в некоторых случаях приходится работать с куда более сложными алгоритмами, да и человек - не машина, он может просто проглядеть какую либо ошибку. Итак, мы точно знаем, что ошибка происходит именно в этом тригере. Мы можем сделать массу предположений, но как их проверить? Очень просто, мы будем выводить всего навсего DeBug сообщения через действие Игра - Text Message. Начнем с того, запускается ли тригер вообще, несмотря на условие. Для этого я просто создам тригер, скопирую событие, а в действиях поставлю вывод сообщения: DEAD URL Сразу скажу, что я пишу длинные сообщения только для того, что бы было яснее человеку, читающему статью, на практике же проще ввести несколько символов, главное что бы вам было понятно, из какого именно куска тригера вызвано сообщение. * hint если бы у меня в тригере было несколько событий, я бы тестировал каждое из них отдельно Запускаем игру, и видим, что при каждом убийстве нейтрального крипа на экране появляется наше сообщение, а это значит, что событие работает нормально, и ошибка находится в остальной части тригера. * hint если бы ошибка находилась именно в событие то мне пришлось бы просто найти другое Дальше, стоит проверить выполняется ли условие, для этого я добавляю действие вывода сообщения уже в свой тригер: DEAD URL * hint очень важно как либо выделять то, что данная операция предназначена для поиска ошибок, т.к. их потом придется удалять, и если они никак не выделены, то придется снова вникать в алгоритм, что бы понять, что нужно, а что нет * hint если бы у меня было несколько условий - я бы тестировал каждое из них отдельно в том стороннем тригере (это позволит узнать, какое из них когда возвращает правду, а когда ложь), вот так: DEAD URL Вернемся к нашему примеру (мы уже узнали что условие также работает успешно) - очевидно ошибка где то в действии тригера. Тут у нас имеется условный оператор, действия, находящиеся в котором сработают когда переменная будет равна 30. Ее мы сейчас и проверим. Теперь мы будем выводить на экран не логические значения (либо алгоритм выполняется и сообщение выводится, либо он невыполняется и соответственно сообщение не выводиться) а значения нашей переменной: DEAD URL * hint также мы можем выводить значения кроме переменных целочисленных (integer) также реальных (real), строчных (string - их даже не надо преобразовывать), логических (boolean - для их вывода стоит использовать условный оператор if, написав в условии <переменная> равно Да, а в действие вывод сообщения) Запустив карту и убив в ней крипа, мы заметим и наши сообщения, к примеру ... 21, 23, 24, 27, 29, 32, 36 ... Смотри на наше условие, и видим, что он будет выполнено в случае, только если игрок "выполнит план по убийствам крипов", в случае же если он его "перевыполнит", то победы ему невидать. Это несправедливо, исправляем тригер: DEAD URL * hint если вы одновременно выводите сообщения о значений нескольких переменных - желательно использовать функцию сложения строк, в первой части которой указать намек на то, значение какой именно переменной вы выводите * hint не забывайте по окончанию проверок удалять все debug элементы Ну вот, теперь победа объявляется всегда, когда игрок наберет достаточно очков. Еще раз повторю что пример достаточно примитивный (придумать не примитивный, но применимый к тригерам я не смог) но вполне четко описывает данный метод. По сути мы можем только догадываться о чем думает компьютер (какие значения в данный момент имеют переменные и какие инструкции он в данный момент исполняет), но мы можем попросить его рассказать нам об этом с помощь DeBug сообщений ;) Тоже самое только в jass'еВсе вышеизложенное имеет также применение и при написании скриптов на jass. Лично я предпочитаю писать следующим образом: Код:
Т.е. во-первых я выделяю DeBug просто комментариями (ой, насколько это удобней делать на jass, в редакторе тригеров ввод комментариев сделан просто жутко), во вторых использую функцию BJDebugMsg(string) - наверное единственная true BJ function ;) Имеется еще несколько преимуществ, к примеру мы можем "отключить" выполнение какой либо инструкции/инструкций сделав ее комментарием (еще Sergey писал про это): Код:
А также мы можем вывести на экран integer значение handle обьекта, это также иногда бывает весьма полезно: Код:
ЗаключениеИ все таки, возможно ваш алгоритм все-таки не будет работать именно так как вы хотите - именно из-за того, что действие которое вы используете просто так устроено, а других подходящих нет, тогда... Если того, что бы вы хотели нет в common.j - то стандартными средствами вы никак не добьетесь желаемого результата. Нет, конечно можно сторонней программой попробовать, но это уже немного другой разговор ;) Вроде все, статью хоть и простая, но думаю весьма полезная. Отредактировано ADOLF, 05.06.2008 в 13:09. |
18.01.2008, 18:59 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
S
offline
Опыт:
43,833Активность: |
Статья неплохая... чуток доработать и дать пример карты - и можно в базу, ИМХО |
18.01.2008, 20:09 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Harakternyk
offline
Опыт:
2,703Активность: |
ADOLF, чувствуется, что статья "наболела" в "Академии" - сам тому свидетель... Молодец - нужное дело сделал =)
» Теперь по существу: Преимущества:
В целом статья очень (!) актуальна и по приложению к ней карты-примера и устранению перечисленных выше недостатков будет с большой радостью помещена в базу. ADOLF, спасибо за статью - теперь будет куда послать новичков из "Академии" по части способов проверки работоспособности их кода Отредактировано Harakternyk, 20.01.2008 в 15:05. |
18.01.2008, 22:09 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Цитата:
омг, зачем? смысл статьи не в примере тригера как сделать победу после убийства крипов, а в поиске ошибок, тут скринов хватает) Цитата:
хм, можно же вроде тригеры выключать, а... хм :хз: Цитата:
имхо ненужно, те кто шарят в жасс напишут все на нем, а те кто не шарят непоймут Цитата:
норм оформление, читаемо и т.д. (ну на сцайт если лить скрины по центру поставлю) |
||||
19.01.2008, 11:28 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Klop
Папа римский
offline
Опыт:
13,006Активность: |
Harakternyk, ты ошибаешся всё нормально читается и понятно.
Отредактировано Harakternyk, 20.01.2008 в 17:36. |
19.01.2008, 11:35 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Harakternyk
offline
Опыт:
2,703Активность: |
ADOLF, я переофорлю твою статью согласно своим представлениям о норме (копию твоей версии сохраню), если это никому не придётся по душе и мои допонения не сочтут необходимыми, то зальём статью в твоём варианте. Думаю, такой подход снимет все вопросы о моей возможной правоте/неправоте в оценивании твоей статьи.
Отредактировано Harakternyk, 20.01.2008 в 15:07. |
19.01.2008, 14:21 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Цитата:
Не вздумай =/ Делать тебе нечего... лучше о тт напиши Кстати, кто сейчас дает добро на заливку статей в базу?) Отредактировано Harakternyk, 20.01.2008 в 12:27. |
|
20.01.2008, 11:50 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Harakternyk
offline
Опыт:
2,703Активность: |
ADOLF, как модератор этого раздела я стремлюсь к тому, чтобы то, что здесь публикуется было хорошего качества по всем параметрам, поэтому всё, что я делаю, я делаю только в интересах обычных пользователей нашего Форума - адекватность, простота, полнота и нормальное оформление являются основными требованиями к статьям, поэтому я буду реализовывать такое своё представление при модерировании этого раздела. Что же касаеся моей статьи о ТТ - она делается и сделана её основная часть, однако до её полного завершения ещё следует подождать - ибо хорошая статья не бывает быстрой...
Заливом статей занимаюсь я (по согласованию с 1000-й). |
20.01.2008, 12:24 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
залить и я могу ^^
вопрос кто дает добро))) да и вообще, коментариев подозрительно мало=/ (не о офромлении, о наполнение статьи) |
20.01.2008, 21:43 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Nikolya
offline
Опыт:
195Активность: |
Наполнение статьи харошее, очень помогло. описано в обоих способах. Поможет нубасям (к которым и себя причисляю). +1 к атаке (автору) :rofl: |
12.02.2008, 17:11 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
Ну незнай, я считаю что нет большого ума в этой статье, и как говорят наши флудера "многабукав" - количество текста не соответствует количеству пользы. Если бы ужать - вышло бы неплохо. Многим, ища ошибку в триггере, стоило просто прочитать 2 строки как это делать, но здесь же пара страничек..
Предложения: - Засунуть пояснения под каты(cut) - Переоформить картинки - они только увеличивают текст Вывод: Я за существование этой статьи, но нужна ее переработка, ведь она тоже отнимает время. А время - деньги. » Ворчание.... Можно вобще заменить ее предложением Цитата:
хее для чайников, это для тех кто WE первый раз открыл при прочтении твоей статьи? =\\\ буээээ... Дану какое наполнение, вы тут расписываете.. а ведь слово Оптимизация уместно и в статьях, нужно знать свои размахи Отредактировано ScorpioT1000, 13.02.2008 в 02:10. |
|
13.02.2008, 01:23 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Harakternyk
offline
Опыт:
2,703Активность: |
ScorpioT1000, статья будет переоформлена так, чтобы это было предельно лаконично, полно и понятно. Просто время есть не всегда в достточном количестве... Однако эта статья полезна и потому будет доведена до ума в числе первых (автором и мной по согласованию с ним же).
|
13.02.2008, 13:23 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
AR Gen
.........................
offline
Опыт:
102Активность: |
<_<
Лично моё мнение, хотя ,конечно, вы вправе оправергнуть моё высказывание но всё же скажу. Для того что бы не было ошибок нужна всего лишь голова на плечах ,внимательность, и самое главное ЗНАТЬ принцип работы каждого действия,условия,события и уметь разбивать на эти три основы то что ты хочешь реализовать в этом триггере. Я дочитал до середины и чуть не уснул , в статье много воды , ты мне мясо давай мясо.=) Мой приговор : статье - быть, но если только оптимизируют её и сделают оптимальной для чтения как middle-mappers( картостроителей среднего уровня ) так и newbie - mappers (начинающих картостроителей ) |
13.02.2008, 21:30 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DFlyer
<3 MJ
offline
Опыт:
44,079Активность: |
Эта статья как я понимаю ориентирована только на новичков. Мидл-мэпперы, как ты выразился, вполне в состоянии самому искать свои ошибки. |
13.02.2008, 23:34 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
AR Gen
.........................
offline
Опыт:
102Активность: |
О_о
Цитата:
Да?Тогда наверное это очепятка |
|
14.02.2008, 06:33 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DFlyer
<3 MJ
offline
Опыт:
44,079Активность: |
AR Gen
Сама эта проблема имхо для новичков, а используемые методы уж точно не для них. Не знаю, короче. ADOLF У тебя маленькая опечатка в последнем коде, call DoSemething(12,... |
14.02.2008, 13:19 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
lazy fiend
offline
Опыт:
16Активность: |
Статью можно дополнить более сложными примерами. |
15.02.2008, 18:33 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Цитата:
м, наверное просто неписал никогда нечего стоющего - когда код на несколько тыщ строк с полсотней переменных никакая внимательность непоможет) Цитата:
ADOLF добавил: DFlyer, спс, пофиксил) |
||
16.02.2008, 14:21 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Омега
offline
Опыт:
12,033Активность: |
Нифига я из статьи непонял,тока запутался и все. Сам найду баги если что. Статья плохочитаема,а для новичка совсем бесполезна. |
17.02.2008, 23:58 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Zeibel, а что именно непонял?) постарайся обяснить ;)
нервному товарищу посоветую остыть, ибо он не шарит=/ |
18.02.2008, 14:23 | #20
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|