Доброго времени суток. Делаю ТД, и мне нужно, чтобы нельзя было заблокировать проход башнями. Для этого я написал этот код. Он работает, но не всегда.
Башни можно строить в поле 8*128 по горизонтали и 10*128 по вертикали. Миньоны идут сверху вниз. Башня занимает 128x128. Таким образом, можно построить максимум 80 башен, но так как блокировать проход нельзя, то 70.
Но если строить башни друг за другом, оставив первую колонну пустой (как на картинке), то код будет работать до постройки 61-й башни.
При постройке 61-й башни что-то ломается, так как после её постройки у первых 60 CustomValue==1, хотя это значение должно обнулится.
Я думаю, что дело в функции ConstructCount. Это рекурсия с циклом. Возможно, я просто упираюсь в какой-то лимит? Если такой лимит есть, то какой код не упрётся в него?

Принятый ответ

в чем разница между ExecuteFunc и просто call
PT153, ну call просто вызываешь потоком (он не создает поток), например у тебя в ряд выставлены сверху вниз названия функции со скобочками (и внутри скобок аргументы, а если не берет никаких аргументов, то внутри скобок пусто) и через call вызывает одну за другой последовательно сверху вниз.
call название функции (аргументы)
Допустим первую верхнюю функцию вызвали, и ее обработали, потом поток берет вторую внизу функцию и обрабатывает и т.д. Но у потока есть ограничения в операциях, как только выполнится определенное количество операций, варкрафт экстренно завершает поток и даже не сообщает об этом.
call функция 1()
call функция 2()
......
call функция 999()
Тут хочу обратить внимание и на то, насколько длинный код в этой вызываемой функции. И сколько вызываемой работы потребует: всякие вычисления, бесконечные циклы и другое. Если длинный код у тебя, и кучу циклов, и сами циклы большую работу совершают, то следует разбить на участки или как-то переделать что ли, уменьшить работу цикла и др.
Можно разбить на функции и ...
  1. вызывать через call, но так делать не стоит. Поток вызывает эти функции последовательно.
  2. Нужно делать задержку (через вэйт), например в ИИ-скриптах варкрафта делают задержку, чтобы не было нагрузки. Вместо вэйта можно таймер.
  3. через ExecuteFunc, ExecuteFunc создает отдельный новый поток. информацию про ExecuteFunc скидывал выше.
Этот комментарий удален
0
28
7 лет назад
0
А ничего, что CN увеличивается в функции ConstructCount?
Hate:
и как у вас вообще что либо работает?
0
26
7 лет назад
0
PT153:
А ничего, что CN увеличивается в функции ConstructCount?
Hate:
и как у вас вообще что либо работает?
я уже заметил. вообще лимит операций существует, вы дебажить пробовали для начала?
2
27
7 лет назад
Отредактирован MpW
2
можно дебагом проверять. просто что-то сказать сложно без карты.
xgm.guru/p/wc3/184889 был у меня похожий вопрос, правда там про строительство ИИ. циклами проверял каждую точку и расстояния. у меня похуже было. из циклов мог вообще не выйти. мог поток нафиг убиться, и в некоторых случаях может критануть из-за не правильного кода. мне помог ExecuteFunc и правильный код.
но вопрос интересный.
0
28
7 лет назад
0
Hate:
я уже заметил. вообще лимит операций существует, вы дебажить пробовали для начала?
Зависит от того, что подразумевать под словом "дебажить". Я профессионально не умею, наверное.
Я в функцию ConstructCount добавил счётчик выполнения M, который я вывожу на экран сразу после её выполнения в функции PathCheck и обнуляю. Так вот, при постройке 61-й башни ничего не выводится. Если обнулять CustomValue вручную и продолжать строить, то ничего выводится не будет.
Дело в том, что я написал обычную рекурсию без циклов внутри, она спокойно выполнилась 61 раз. Также сама идея кода взята из LTW, но там автор использует группы (с ними у меня постоянно какие-то проблемы, поэтому я их не использую), то есть циклов нет, однако есть лимит башен в 100.
Steal nerves:
ExecuteFunc
А в чём разница между ExecuteFunc и просто call?
2
27
7 лет назад
Отредактирован MpW
2
в чем разница между ExecuteFunc и просто call
PT153, ну call просто вызываешь потоком (он не создает поток), например у тебя в ряд выставлены сверху вниз названия функции со скобочками (и внутри скобок аргументы, а если не берет никаких аргументов, то внутри скобок пусто) и через call вызывает одну за другой последовательно сверху вниз.
call название функции (аргументы)
Допустим первую верхнюю функцию вызвали, и ее обработали, потом поток берет вторую внизу функцию и обрабатывает и т.д. Но у потока есть ограничения в операциях, как только выполнится определенное количество операций, варкрафт экстренно завершает поток и даже не сообщает об этом.
call функция 1()
call функция 2()
......
call функция 999()
Тут хочу обратить внимание и на то, насколько длинный код в этой вызываемой функции. И сколько вызываемой работы потребует: всякие вычисления, бесконечные циклы и другое. Если длинный код у тебя, и кучу циклов, и сами циклы большую работу совершают, то следует разбить на участки или как-то переделать что ли, уменьшить работу цикла и др.
Можно разбить на функции и ...
  1. вызывать через call, но так делать не стоит. Поток вызывает эти функции последовательно.
  2. Нужно делать задержку (через вэйт), например в ИИ-скриптах варкрафта делают задержку, чтобы не было нагрузки. Вместо вэйта можно таймер.
  3. через ExecuteFunc, ExecuteFunc создает отдельный новый поток. информацию про ExecuteFunc скидывал выше.
Принятый ответ
0
28
7 лет назад
0
Словом, я решил проблему, правда, без использования ExecuteFunc. Всем спасибо, было довольно интересно почитать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.