XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Желтая пресса: обучающие статьи
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

 
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. Лично я предпочитаю писать следующим образом:

Код:
...
 call MyFunc(i_my, .0, ...
 set i_my=i_my+i_some+...
//
 call BJDebugMsg("i_my "+I2S(i_my)+"   i_some "+I2S(i_some))
//
 call DoSomething()
...


Т.е. во-первых я выделяю DeBug просто комментариями (ой, насколько это удобней делать на jass, в редакторе тригеров ввод комментариев сделан просто жутко), во вторых использую функцию BJDebugMsg(string) - наверное единственная true BJ function ;)

Имеется еще несколько преимуществ, к примеру мы можем "отключить" выполнение какой либо инструкции/инструкций сделав ее комментарием (еще Sergey писал про это):

Код:
...
 call SomeFunc(i_my, ...
 set x=x+...
// call DoSemething() //temporarily off
 set i_my=i_my+1
...


А также мы можем вывести на экран integer значение handle обьекта, это также иногда бывает весьма полезно:

Код:
function H2I takes handle h returns integer
 return h
 return 0
endfunction

...
 call DoSomething(12, ...
//
 call BJDebugMsg(I2S(H2I(u_myUnit))+" "+I2S(H2I(d_myDestructable)))
//
...


Заключение



И все таки, возможно ваш алгоритм все-таки не будет работать именно так как вы хотите - именно из-за того, что действие которое вы используете просто так устроено, а других подходящих нет, тогда... Если того, что бы вы хотели нет в common.j - то стандартными средствами вы никак не добьетесь желаемого результата. Нет, конечно можно сторонней программой попробовать, но это уже немного другой разговор ;)

Вроде все, статью хоть и простая, но думаю весьма полезная.

Отредактировано ADOLF, 05.06.2008 в 13:09.
Старый 18.01.2008, 18:59
S

offline
Опыт: 43,833
Активность:
Статья неплохая... чуток доработать и дать пример карты - и можно в базу, ИМХО
Старый 18.01.2008, 20:09
Harakternyk

offline
Опыт: 2,703
Активность:
ADOLF, чувствуется, что статья "наболела" в "Академии" - сам тому свидетель... Молодец - нужное дело сделал =)

» Теперь по существу:


Преимущества:
  1. Простой пример.
  2. Рассмотрены варианты использования приёма как на GUI, так и на MUI.
Недостатки:
  1. Не указано, что "функции" в редакторе триггеров также можно выключать для проверки методом исключения нерабочей части кода.
  2. Не указано задействование Return Bug через Custom Script (триггерщикам будет полезно)
  3. Статья нужнадется в небольшой работе по устранению недостатков оформления.


В целом статья очень (!) актуальна и по приложению к ней карты-примера и устранению перечисленных выше недостатков будет с большой радостью помещена в базу.

ADOLF, спасибо за статью - теперь будет куда послать новичков из "Академии" по части способов проверки работоспособности их кода

Отредактировано Harakternyk, 20.01.2008 в 15:05.
Старый 18.01.2008, 22:09
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
дать пример карты

омг, зачем? смысл статьи не в примере тригера как сделать победу после убийства крипов, а в поиске ошибок, тут скринов хватает)

Цитата:
Не указано, что "функции" в редакторе триггеров также можно выключать для проверки методом исключения нерабочей части кода.

хм, можно же вроде тригеры выключать, а... хм :хз:

Цитата:
Не указано задействование Return Bug через Custom Script (триггерщикам будет полезно)

имхо ненужно, те кто шарят в жасс напишут все на нем, а те кто не шарят непоймут

Цитата:
Статья нужнадется в небольшой работе по устранению недостатков оформления.

норм оформление, читаемо и т.д. (ну на сцайт если лить скрины по центру поставлю)
Старый 19.01.2008, 11:28
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Harakternyk, ты ошибаешся всё нормально читается и понятно.

Отредактировано Harakternyk, 20.01.2008 в 17:36.
Старый 19.01.2008, 11:35
Harakternyk

offline
Опыт: 2,703
Активность:
ADOLF, я переофорлю твою статью согласно своим представлениям о норме (копию твоей версии сохраню), если это никому не придётся по душе и мои допонения не сочтут необходимыми, то зальём статью в твоём варианте. Думаю, такой подход снимет все вопросы о моей возможной правоте/неправоте в оценивании твоей статьи.

Отредактировано Harakternyk, 20.01.2008 в 15:07.
Старый 19.01.2008, 14:21
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
ADOLF, я переофорлю твою статью согласно своим представлениям о норме

Не вздумай =/

Делать тебе нечего... лучше о тт напиши

Кстати, кто сейчас дает добро на заливку статей в базу?)

Отредактировано Harakternyk, 20.01.2008 в 12:27.
Старый 20.01.2008, 11:50
Harakternyk

offline
Опыт: 2,703
Активность:
ADOLF, как модератор этого раздела я стремлюсь к тому, чтобы то, что здесь публикуется было хорошего качества по всем параметрам, поэтому всё, что я делаю, я делаю только в интересах обычных пользователей нашего Форума - адекватность, простота, полнота и нормальное оформление являются основными требованиями к статьям, поэтому я буду реализовывать такое своё представление при модерировании этого раздела. Что же касаеся моей статьи о ТТ - она делается и сделана её основная часть, однако до её полного завершения ещё следует подождать - ибо хорошая статья не бывает быстрой...

Заливом статей занимаюсь я (по согласованию с 1000-й).
Старый 20.01.2008, 12:24
adic3x

offline
Опыт: 108,439
Активность:
залить и я могу ^^
вопрос кто дает добро)))
да и вообще, коментариев подозрительно мало=/ (не о офромлении, о наполнение статьи)
Старый 20.01.2008, 21:43
Nikolya

offline
Опыт: 195
Активность:
Наполнение статьи харошее, очень помогло. описано в обоих способах. Поможет нубасям (к которым и себя причисляю). +1 к атаке (автору) :rofl:
Старый 12.02.2008, 17:11
ScorpioT1000
Работаем
offline
Опыт: отключен
Ну незнай, я считаю что нет большого ума в этой статье, и как говорят наши флудера "многабукав" - количество текста не соответствует количеству пользы. Если бы ужать - вышло бы неплохо. Многим, ища ошибку в триггере, стоило просто прочитать 2 строки как это делать, но здесь же пара страничек..

Предложения:
- Засунуть пояснения под каты(cut)
- Переоформить картинки - они только увеличивают текст

Вывод:
Я за существование этой статьи, но нужна ее переработка, ведь она тоже отнимает время. А время - деньги.

» Ворчание....
Можно вобще заменить ее предложением
Цитата:
Проверь триггер, вставляя между функциями "Игра - Text Message" с нужными данными.


хее для чайников, это для тех кто WE первый раз открыл при прочтении твоей статьи? =\\\ буээээ...

Дану какое наполнение, вы тут расписываете.. а ведь слово Оптимизация уместно и в статьях, нужно знать свои размахи

Отредактировано ScorpioT1000, 13.02.2008 в 02:10.
Старый 13.02.2008, 01:23
Harakternyk

offline
Опыт: 2,703
Активность:
ScorpioT1000, статья будет переоформлена так, чтобы это было предельно лаконично, полно и понятно. Просто время есть не всегда в достточном количестве... Однако эта статья полезна и потому будет доведена до ума в числе первых (автором и мной по согласованию с ним же).
Старый 13.02.2008, 13:23
AR Gen
.........................
offline
Опыт: 102
Активность:
<_<
Лично моё мнение, хотя ,конечно, вы вправе оправергнуть моё высказывание но всё же скажу. Для того что бы не было ошибок нужна всего лишь голова на плечах ,внимательность, и самое главное ЗНАТЬ принцип работы каждого действия,условия,события и уметь разбивать на эти три основы то что ты хочешь реализовать в этом триггере.
Я дочитал до середины и чуть не уснул , в статье много воды , ты мне мясо давай мясо.=)
Мой приговор : статье - быть, но если только оптимизируют её и сделают оптимальной для чтения как middle-mappers( картостроителей среднего уровня ) так и newbie - mappers (начинающих картостроителей )
Старый 13.02.2008, 21:30
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Эта статья как я понимаю ориентирована только на новичков. Мидл-мэпперы, как ты выразился, вполне в состоянии самому искать свои ошибки.
Старый 13.02.2008, 23:34
AR Gen
.........................
offline
Опыт: 102
Активность:
О_о
Цитата:
Статья посвещена вопросу поиска ошибок в алгоритме и ориентирована на тригерщиков среднего уровня, хотя и новичкам будет полезна к ознакомлению.


Да?Тогда наверное это очепятка
Старый 14.02.2008, 06:33
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
AR Gen
Сама эта проблема имхо для новичков, а используемые методы уж точно не для них. Не знаю, короче.
ADOLF
У тебя маленькая опечатка в последнем коде, call DoSemething(12,...
Старый 14.02.2008, 13:19
lazy fiend

offline
Опыт: 16
Активность:
Статью можно дополнить более сложными примерами.
Старый 15.02.2008, 18:33
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Для того что бы не было ошибок нужна всего лишь голова на плечах ,внимательность, и самое главное ЗНАТЬ принцип работы каждого действия,условия,события и уметь разбивать на эти три основы то что ты хочешь реализовать в этом триггере

м, наверное просто неписал никогда нечего стоющего - когда код на несколько тыщ строк с полсотней переменных никакая внимательность непоможет)
Цитата:
Эта статья как я понимаю ориентирована только на новичков. Мидл-мэпперы, как ты выразился, вполне в состоянии самому искать свои ошибки
не всегда + я старался обьяснить именно логику, как отлавливать ошибку. в моем понимании любой тригерщик == новичок, из этого и исходите

ADOLF добавил:
DFlyer, спс, пофиксил)
Старый 16.02.2008, 14:21
Омега

offline
Опыт: 12,033
Активность:
Нифига я из статьи непонял,тока запутался и все.
Сам найду баги если что.
Статья плохочитаема,а для новичка совсем бесполезна.
Старый 17.02.2008, 23:58
adic3x

offline
Опыт: 108,439
Активность:
Zeibel, а что именно непонял?) постарайся обяснить ;)

нервному товарищу посоветую остыть, ибо он не шарит=/
Старый 18.02.2008, 14:23

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 08:35.