Версия для печати темы
UoKit.com Форумы _ UO Pilot в Ultima Online _ Цикл for в цикле for
Автор: Naprasno 31.1.2019, 16:06
Помогите, пожалуйста, с кодом. Мне нужно, чтобы чар летел по руне проверял по картинке определённых животных/монстров (3-5 видов) и если их нет, то летел по следующей. Не могу понять как реализовать цикл for в for?
set %rune[1] 1075168369 //
set %rune[2] 1074830230 //
set %rune[3] 1074843396 //
set %rune[4] 1074000392 //
set %rune[5] 1074801159 //
set %rune[6] 1074920757 //
set %rune[7] 1074525574 //
set %rune[8] 1074633397 //
:start0
set lasttargetid %rune[1] // вот здесь сначала перебирать через for но не смог...
send b
wait 3500
set $path "C:\Users\Desktop\" // путь к картинкам
set %image [1] mob13 // имя изображения
set %image [2] mob1 // имя второго изображения
set %image [3] mob14 // третьего
set #size size(%image) // всего картинок
for #i 1 #size 1
send esc // это алл неймс чтобы имена считать
set #d findimage (0, 0 1021, 760 ($path%image[#i].bmp) %arr 2)
if #d > 0 // если есть
wait 100
send f1 // кидаем таргет
wait 500
move %arr[1 1] %arr[1 2]
wait 500
left %arr[1 1] %arr[1 2] // кликнули
wait 1500
goto start
end_if
end_for
как после проверки всех трёх картинок перейти на следующую руну?
Автор: cirus 31.1.2019, 19:00
Код
set %rune[1] 1075168369 //
set %rune[2] 1074830230 //
set %rune[3] 1074843396 //
set %rune[4] 1074000392 //
set %rune[5] 1074801159 //
set %rune[6] 1074920757 //
set %rune[7] 1074525574 //
set %rune[8] 1074633397 //
set %image [1] mob13 // имя изображения
set %image [2] mob1 // имя второго изображения
set %image [3] mob14 // третьего
log clear
log mode compact
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
for #j 1 size(%image) // цикл для всех мобов
log %image[#j]
end_for
end_for
end_script
Если поймёте принцип, то не составит проблем исправить ваш код.
Автор: Naprasno 31.1.2019, 22:08
Цитата(cirus @ 31.1.2019, 19:00)
Код
set %rune[1] 1075168369 //
set %rune[2] 1074830230 //
set %rune[3] 1074843396 //
set %rune[4] 1074000392 //
set %rune[5] 1074801159 //
set %rune[6] 1074920757 //
set %rune[7] 1074525574 //
set %rune[8] 1074633397 //
set %image [1] mob13 // имя изображения
set %image [2] mob1 // имя второго изображения
set %image [3] mob14 // третьего
log clear
log mode compact
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
for #j 1 size(%image) // цикл для всех мобов
log %image[#j]
end_for
end_for
end_script
Если поймёте принцип, то не составит проблем исправить ваш код.
Кажется я понял. При полёте по рунам нужно прерывать цикл. Прошёл по одной, прервал, сделал что нужно и потом продолжил. Верно?
Цитата(Naprasno @ 31.1.2019, 22:04)
Кажется я понял. При полёте по рунам нужно прерывать цикл. Прошёл по одной, прервал, сделал что нужно и потом продолжил. Верно?
То что вы написали ещё круче. Спасибо. Почему то не пришло это в голову. С прерыванием Геморой.
Автор: Naprasno 1.2.2019, 9:27
Цитата(Naprasno @ 31.1.2019, 22:08)
Кажется я понял. При полёте по рунам нужно прерывать цикл. Прошёл по одной, прервал, сделал что нужно и потом продолжил. Верно?
То что вы написали ещё круче. Спасибо. Почему то не пришло это в голову. С прерыванием Геморой.
А почему у меня вот здесь циклится на долго? У меня там всего 1 секунда есть на проверку имён. Почему он по кругу гоняет?
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
set lasttargetid %rune[#i]
send b
wait 3000
for #j 1 size($path%image) // цикл для всех мобов
log %image[#j]
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
move %arr[1 1] %arr[1 2]
wait 200
left %arr[1 1] %arr[1 2] // кликнули
wait 1500
end_if
send \
if (lastmsg your target) or (lastmsg away from you) or (lastmsg you can't)
goto xogdenie
else wait 19000
end_if
Автор: FREEON 1.2.2019, 9:46
Цитата(Naprasno @ 1.2.2019, 9:27)
А почему у меня вот здесь циклится на долго? У меня там всего 1 секунда есть на проверку имён. Почему он по кругу гоняет?
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
set lasttargetid %rune[#i]
send b
wait 3000
for #j 1 size($path%image) // цикл для всех мобов
log %image[#j]
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
move %arr[1 1] %arr[1 2]
wait 200
left %arr[1 1] %arr[1 2] // кликнули
wait 1500
end_if
send \
if (lastmsg your target) or (lastmsg away from you) or (lastmsg you can't)
goto xogdenie
else wait 19000
end_if
во первых у тебя нет в этом скрипте end_for конца цикла что не будет работать(да и собственно не дает представления о том где заканчивается цикл), а если смотреть скрипт выше и сопоставить с этим то у тебя в цикле wait 3000(ожидание по 3 секунды) что соответвено долго пока переберет весь массив из переменных
есчо не понятно что за данные и для чего нужны?
Код
set %rune[1] 1075168369 //
set %rune[2] 1074830230 //
set %rune[3] 1074843396 //
set %rune[4] 1074000392 //
set %rune[5] 1074801159 //
set %rune[6] 1074920757 //
set %rune[7] 1074525574 //
set %rune[8] 1074633397 //
Если это цвет в вашем скрипте он никак не используется...
Код
set %rune[1] 16710906
set %rune[2] 6857136
for #i 1 size(%rune)
if color (1021, 188 ) = %rune[#i] //определить цвет в координатах 1021, 188, если он равен одному из значений то выполнить действие
log Цвет совпал %rune[#i] //показать сообщение
end_if
end_for
end_script
Для улучшения ожидания лучше использовать цикл while
Код
while_not 329, 289 14386954 or 517, 834 8582073 // цикл будет ожидать пока не появился 1 из цветов или оба
wait 100
end_while
log появился нужный цвет
Автор: Naprasno 1.2.2019, 11:05
Цитата(FREEON @ 1.2.2019, 9:46)
во первых у тебя нет в этом скрипте end_for конца цикла что не будет работать(да и собственно не дает представления о том где заканчивается цикл), а если смотреть скрипт выше и сопоставить с этим то у тебя в цикле wait 3000(ожидание по 3 секунды) что соответвено долго пока переберет весь массив из переменных
есчо не понятно что за данные и для чего нужны?
Код
set %rune[1] 1075168369 //
set %rune[2] 1074830230 //
set %rune[3] 1074843396 //
set %rune[4] 1074000392 //
set %rune[5] 1074801159 //
set %rune[6] 1074920757 //
set %rune[7] 1074525574 //
set %rune[8] 1074633397 //
Если это цвет в вашем скрипте он никак не используется...
Код
set %rune[1] 16710906
for #i 1 size(%rune)
if color (1021, 188 ) = %rune[#i] //определить цвет в координатах 1021, 188, если он равен одному из значений то выполнить действие
log Цвет совпал %rune[#i] //показать сообщение
end_if
end_for
end_script
Для улучшения ожидания лучше использовать цикл while
Код
while_not 329, 289 14386954 or 517, 834 8582073 // цикл будет ожидать пока не появился 1 из цветов или оба
wait 100
end_while
log появился нужный цвет
Я кусок вырезал, поэтому там нет окончания. Это не цвета, а ID рун по покоторым летает чар. Летает всё норм. Задержка 3 секунды на рекол - время каста. Как раз подходит с моим пингом. Проблема здесь (правильно ли я понимаю, что по циклу фор он должен прогнать два раза (две картинки)?):
"for #j 1 size($path%image) // цикл для всех мобов
log %image[#j]
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
move %arr[1 1] %arr[1 2]
wait 200
left %arr[1 1] %arr[1 2] // кликнули
wait 1500
end_if
:start
send \
if (lastmsg your target) or (lastmsg away from you)
goto xogdenie
else wait 19000
end_if
if (lastmsg your can't)
continue
end_if
end_for
end_for"
А он гоняет раз 20, когда не находит... А мне нужно чтобы он за секунду эти две картинки сравнил и продолжил главный цикл фор облёт по рунам...
Цитата(Naprasno @ 1.2.2019, 11:03)
Я кусок вырезал, поэтому там нет окончания. Это не цвета, а ID рун по покоторым летает чар. Летает всё норм. Задержка 3 секунды на рекол - время каста. Как раз подходит с моим пингом. Проблема здесь (правильно ли я понимаю, что по циклу фор он должен прогнать два раза (две картинки)?):
"for #j 1 size($path%image) // цикл для всех мобов
log %image[#j]
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
move %arr[1 1] %arr[1 2]
wait 200
left %arr[1 1] %arr[1 2] // кликнули
wait 1500
end_if
:start
send \
if (lastmsg your target) or (lastmsg away from you)
goto xogdenie
else wait 19000
end_if
if (lastmsg your can't)
continue
end_if
end_for
end_for"
А он гоняет раз 20, когда не находит... А мне нужно чтобы он за секунду эти две картинки сравнил и продолжил главный цикл фор облёт по рунам...
while не подходит, т.к. этих мобов может и не быть на этом месте и он должен в этом случае дальше лететь...
Автор: FREEON 1.2.2019, 11:29
интересные у вас условия...для чего они?
Код
if (lastmsg your target) or (lastmsg away from you)
end_if
if (lastmsg your can't)
end_if
какой код находится в метках :start и метке :xogdenie? Возможно тут скрипт уходит в бесконечный цикл
Автор: cirus 1.2.2019, 12:32
Цитата
for #j 1 size($path%image) // цикл для всех мобов
$path лишнее.
Код
for #j 1 size(%image) // цикл для всех мобов
Автор: Naprasno 1.2.2019, 13:03
Цитата(cirus @ 1.2.2019, 12:32)
$path лишнее.
Код
for #j 1 size(%image) // цикл для всех мобов
убрал и заработало как должно, но теперь не видит картинок. пилот похоже не может найти где эти картинки лежат... я через path прописывал папку вот так:
set $path "C:\Users\Desktop\" // путь к картинкам
Цитата(FREEON @ 1.2.2019, 11:29)
интересные у вас условия...для чего они?
Код
if (lastmsg your target) or (lastmsg away from you)
end_if
if (lastmsg your can't)
end_if
какой код находится в метках :start и метке :xogdenie? Возможно тут скрипт уходит в бесконечный цикл
условия для того, чтобы можно было подойти к мобу, если он далеко или таргет перекрыт структурой...
старт - там начало таминга, он не зациклен и с ним всё норм.
хождение - это просто подходим к координатам которые нашли, если цель далека или перекрыта
Цитата(cirus @ 31.1.2019, 19:00)
Код
set %rune[1] 1075168369 //
set %rune[2] 1074830230 //
set %rune[3] 1074843396 //
set %rune[4] 1074000392 //
set %rune[5] 1074801159 //
set %rune[6] 1074920757 //
set %rune[7] 1074525574 //
set %rune[8] 1074633397 //
set %image [1] mob13 // имя изображения
set %image [2] mob1 // имя второго изображения
set %image [3] mob14 // третьего
log clear
log mode compact
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
for #j 1 size(%image) // цикл для всех мобов
log %image[#j]
end_for
end_for
end_script
Если поймёте принцип, то не составит проблем исправить ваш код.
наверное вот здесь можно прописать путь к картинке?
set %image [1] mob13 // имя изображения
set %image [2] mob1 // имя второго изображения
set %image [3] mob14 // третьего
Автор: Naprasno 1.2.2019, 13:29
Цитата(Naprasno @ 1.2.2019, 13:03)
убрал и заработало как должно, но теперь не видит картинок. пилот похоже не может найти где эти картинки лежат... я через path прописывал папку вот так:
set $path "C:\Users\Desktop\" // путь к картинкам
условия для того, чтобы можно было подойти к мобу, если он далеко или таргет перекрыт структурой...
старт - там начало таминга, он не зациклен и с ним всё норм.
хождение - это просто подходим к координатам которые нашли, если цель далека или перекрыта
наверное вот здесь можно прописать путь к картинке?
set %image [1] mob13 // имя изображения
set %image [2] mob1 // имя второго изображения
set %image [3] mob14 // третьего
Прописал путь и теперь всё пашет супер.
Может знаете что за ошибка:
13:24:28 2 (autosaved_2.txt, 2): move - (2): Ошибка! Проверьте правильность скрипта! EConvertError '' is not a valid integer value
move %arr[1 1] %arr[1 2]
Где список ошибок посмотреть?
Автор: cirus 1.2.2019, 13:47
Цитата
Может знаете что за ошибка:
Код надо выкладывать.
Это ошибка при обращении к пустому массиву.
Автор: FREEON 1.2.2019, 13:52
Цитата(Naprasno @ 1.2.2019, 13:29)
Прописал путь и теперь всё пашет супер.
Может знаете что за ошибка:
13:24:28 2 (autosaved_2.txt, 2): move - (2): Ошибка! Проверьте правильность скрипта! EConvertError '' is not a valid integer value
move %arr[1 1] %arr[1 2]
Где список ошибок посмотреть?
Код
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
set #x (%arr [1 1] + %arr [1 3]) / 2
set #y (%arr [1 2] + %arr [1 4]) / 2
kleft #x #y
end_if
Автор: Naprasno 1.2.2019, 13:58
Цитата(Naprasno @ 1.2.2019, 13:29)
Прописал путь и теперь всё пашет супер.
Может знаете что за ошибка:
13:24:28 2 (autosaved_2.txt, 2): move - (2): Ошибка! Проверьте правильность скрипта! EConvertError '' is not a valid integer value
move %arr[1 1] %arr[1 2]
Где список ошибок посмотреть?
С этой разобрался. Я переменную не проверял на соответствие. Теперь вот такая:
"end_for - (63): Немогу найти имя переменной for"
"end_for - (64): Немогу найти имя переменной for"
вот здесь:
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
set lasttargetid %rune[#i]
send b
wait 2500
for #j 1 size(%image) // цикл для всех мобов
log %image[#j]
set #d findimage (0, 0 1021, 760 (%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
move %arr[1 1] %arr[1 2]
wait 200
left %arr[1 1] %arr[1 2] // кликнули
wait 1500
goto start
else continue
end_if
goto end
:start
send \
wait 300
if (lastmsg your target) or (lastmsg away from you) or (lastmsg you can't)
goto xogdenie
end_if
if (lastmsg this creature) or (lastmsg from the) or (lastmsg it seems)
wait 1500
send esc
wait 500
move %arr[1 1] %arr[1 2]
wait 100
double_left %arr[1 1] %arr[1 2]
wait 1500
send 4
wait 3500
send n
wait 500
drag 379, 188 398, 266 2
wait 500
drag 390, 289 330, 235 1
wait 500
end_if
if (lastmsg I always) or (lastmsg here) or (lastmsg I won't)
wait 19000
end_if
:end
end_for
end_for
Автор: FREEON 1.2.2019, 14:22
Цитата(Naprasno @ 1.2.2019, 13:58)
С этой разобрался. Я переменную не проверял на соответствие. Теперь вот такая:
"end_for - (63): Немогу найти имя переменной for"
"end_for - (64): Немогу найти имя переменной for"
вот здесь:
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
set lasttargetid %rune[#i]
send b
wait 2500
for #j 1 size(%image) // цикл для всех мобов
log %image[#j]
set #d findimage (0, 0 1021, 760 (%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
move %arr[1 1] %arr[1 2]
wait 200
left %arr[1 1] %arr[1 2] // кликнули
wait 1500
goto start
else continue
end_if
goto end
:start
send \
wait 300
if (lastmsg your target) or (lastmsg away from you) or (lastmsg you can't)
goto xogdenie
end_if
if (lastmsg this creature) or (lastmsg from the) or (lastmsg it seems)
wait 1500
send esc
wait 500
move %arr[1 1] %arr[1 2]
wait 100
double_left %arr[1 1] %arr[1 2]
wait 1500
send 4
wait 3500
send n
wait 500
drag 379, 188 398, 266 2
wait 500
drag 390, 289 330, 235 1
wait 500
end_if
if (lastmsg I always) or (lastmsg here) or (lastmsg I won't)
wait 19000
end_if
:end
end_for
end_for
Код
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
set lasttargetid %rune[#i]
send b
wait 2500
for #j 1 size(%image) // цикл для всех мобов
log %image[#j]
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
set #x (%arr [1 1] + %arr [1 3]) / 2
set #y (%arr [1 2] + %arr [1 4]) / 2
kleft #x #y //навели мышь и кликнули
wait 1500
end_if
goto start
else
continue
end_if
goto end
:start
send \
wait 300
if (lastmsg your target) or (lastmsg away from you) or (lastmsg you can't)
goto xogdenie
end_if
if (lastmsg this creature) or (lastmsg from the) or (lastmsg it seems)
wait 1500
send {Esc} // код для клавиши {Esc} иначе может писать e+s+c
wait 500
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
set #x (%arr [1 1] + %arr [1 3]) / 2
set #y (%arr [1 2] + %arr [1 4]) / 2
move #x #y //навели
wait 1500
double_left #x #y //сделали двойной клик
wait 1500
end_if
wait 100
send 4
wait 3500
send n
wait 500
drag 379, 188 398, 266 2
wait 500
drag 390, 289 330, 235 1
wait 500
end_if
if (lastmsg I always) or (lastmsg here) or (lastmsg I won't)
wait 19000
end_if
:end
end_for
end_for
Автор: Naprasno 1.2.2019, 14:48
Цитата(FREEON @ 1.2.2019, 14:22)
Код
for #i 1 size(%rune) // цикл для всех рун
log %rune[#i]
set lasttargetid %rune[#i]
send b
wait 2500
for #j 1 size(%image) // цикл для всех мобов
log %image[#j]
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
wait 50
send f1
wait 100
set #x (%arr [1 1] + %arr [1 3]) / 2
set #y (%arr [1 2] + %arr [1 4]) / 2
kleft #x #y //навели мышь и кликнули
wait 1500
end_if
goto start
else
continue
end_if
goto end
:start
send \
wait 300
if (lastmsg your target) or (lastmsg away from you) or (lastmsg you can't)
goto xogdenie
end_if
if (lastmsg this creature) or (lastmsg from the) or (lastmsg it seems)
wait 1500
send {Esc} // код для клавиши {Esc} иначе может писать e+s+c
wait 500
set #d findimage (0, 0 1021, 760 ($path%image[#j].bmp) %arr 2)
if #d > 0 // если есть
set #x (%arr [1 1] + %arr [1 3]) / 2
set #y (%arr [1 2] + %arr [1 4]) / 2
move #x #y //навели
wait 1500
double_left #x #y //сделали двойной клик
wait 1500
end_if
wait 100
send 4
wait 3500
send n
wait 500
drag 379, 188 398, 266 2
wait 500
drag 390, 289 330, 235 1
wait 500
end_if
if (lastmsg I always) or (lastmsg here) or (lastmsg I won't)
wait 19000
end_if
:end
end_for
end_for
Те мои ошибки из-за неправильной пунктуации? Не могу пока что проверить.
Автор: cirus 1.2.2019, 14:53
Цитата
else continue
В одной строке, должно быть 1 действие.
Автор: FREEON 1.2.2019, 15:22
Цитата(Naprasno @ 1.2.2019, 14:48)
Те мои ошибки из-за неправильной пунктуации? Не могу пока что проверить.
да, с фор такое бывает иногда не может найти конец блока(не видит дальше носа), и ошибка с координатами move(и д.р.) так как не было привязки к изображению, первый цикл он проходит на ура а вот в последующие заходы может выбивать ошибку и к тому же разные if-ы. Строка move %arr[1 1] %arr[1 2] и double_left %arr[1 1] %arr[1 2] никчему не привязывалась
Автор: DarkMaster 2.2.2019, 10:16
В целом я бы не рекомендовал использовать goto для выхода из циклов. Это не очень хорошо. Так же если используются подобные конструкции будте внимательны к версии пилота - в старых версиях подобные действия не поддерживались и приводили к ошибкам.
Автор: Naprasno 4.2.2019, 18:07
Цитата(FREEON @ 1.2.2019, 15:22)
да, с фор такое бывает иногда не может найти конец блока(не видит дальше носа), и ошибка с координатами move(и д.р.) так как не было привязки к изображению, первый цикл он проходит на ура а вот в последующие заходы может выбивать ошибку и к тому же разные if-ы. Строка move %arr[1 1] %arr[1 2] и double_left %arr[1 1] %arr[1 2] никчему не привязывалась
Огромное спасибо!
А есть ли в пилоте оператор, который ждёт определённого действия, последнего сообщения? Каждый раз разное время...
While у меня почему то дальше продолжает скрипт фигачить, а мне нужно чтобы ждал пока не закончится действие...
Автор: DarkMaster 4.2.2019, 18:39
Код
while lastmsg != "сообщение"
wait 10
end_while
Не?
Автор: Naprasno 5.2.2019, 15:27
Цитата(DarkMaster @ 4.2.2019, 18:39)
Код
while lastmsg != "сообщение"
wait 10
end_while
Не?
вот теперь да!
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)