Доброго времени суток. Делаю ТД, и мне нужно, чтобы нельзя было заблокировать проход башнями. Для этого я написал этот код. Он работает, но не всегда.
Башни можно строить в поле 8*128 по горизонтали и 10*128 по вертикали. Миньоны идут сверху вниз. Башня занимает 128x128. Таким образом, можно построить максимум 80 башен, но так как блокировать проход нельзя, то 70.
Но если строить башни друг за другом, оставив первую колонну пустой (как на картинке), то код будет работать до постройки 61-й башни.
Но если строить башни друг за другом, оставив первую колонну пустой (как на картинке), то код будет работать до постройки 61-й башни.
При постройке 61-й башни что-то ломается, так как после её постройки у первых 60 CustomValue==1, хотя это значение должно обнулится.
Я думаю, что дело в функции ConstructCount. Это рекурсия с циклом. Возможно, я просто упираюсь в какой-то лимит? Если такой лимит есть, то какой код не упрётся в него?
Я думаю, что дело в функции ConstructCount. Это рекурсия с циклом. Возможно, я просто упираюсь в какой-то лимит? Если такой лимит есть, то какой код не упрётся в него?
Принятый ответ
в чем разница между ExecuteFunc и просто call
PT153, ну call просто вызываешь потоком (он не создает поток), например у тебя в ряд выставлены сверху вниз названия функции со скобочками (и внутри скобок аргументы, а если не берет никаких аргументов, то внутри скобок пусто) и через call вызывает одну за другой последовательно сверху вниз.
call название функции (аргументы)
Допустим первую верхнюю функцию вызвали, и ее обработали, потом поток берет вторую внизу функцию и обрабатывает и т.д. Но у потока есть ограничения в операциях, как только выполнится определенное количество операций, варкрафт экстренно завершает поток и даже не сообщает об этом.
call функция 1()
call функция 2()
......
call функция 999()
Тут хочу обратить внимание и на то, насколько длинный код в этой вызываемой функции. И сколько вызываемой работы потребует: всякие вычисления, бесконечные циклы и другое. Если длинный код у тебя, и кучу циклов, и сами циклы большую работу совершают, то следует разбить на участки или как-то переделать что ли, уменьшить работу цикла и др.
Можно разбить на функции и ...
- вызывать через call, но так делать не стоит. Поток вызывает эти функции последовательно.
- Нужно делать задержку (через вэйт), например в ИИ-скриптах варкрафта делают задержку, чтобы не было нагрузки. Вместо вэйта можно таймер.
- через ExecuteFunc, ExecuteFunc создает отдельный новый поток. информацию про ExecuteFunc скидывал выше.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Hate:
Отредактирован MpW
Я в функцию ConstructCount добавил счётчик выполнения M, который я вывожу на экран сразу после её выполнения в функции PathCheck и обнуляю. Так вот, при постройке 61-й башни ничего не выводится. Если обнулять CustomValue вручную и продолжать строить, то ничего выводится не будет.
Дело в том, что я написал обычную рекурсию без циклов внутри, она спокойно выполнилась 61 раз. Также сама идея кода взята из LTW, но там автор использует группы (с ними у меня постоянно какие-то проблемы, поэтому я их не использую), то есть циклов нет, однако есть лимит башен в 100.
Steal nerves:
Отредактирован MpW