Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Andrey_13 on January 29, 2015, 04:33:38 PM
-
Здравствуйте.
как организовать компактный цикл для выполнения следующей задачи?
При входе на страницу попадаю на ВКЛАДКА1. С правой стороны высвечиваются кнопки, предположим ПРИЗ. На вкладке может быть от нуля до четырех кнопок ПРИЗ.
Надо эти кнопки нажать. Как призы закончены, надо перейти на ВКЛАДКА2 и там же собрать призы, потом ВКЛАДКА3, ВКЛАДКА4.
Я сделал вот так:
// попадаем на вкладку1
FOR ($i, $i<5) // 4 раза
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "ПРИЗ.bmp", -1, 100)
LOGWRITE("изображение ПРИЗ найдено") // пока сделал чтоб писалось в лог, что происходит в программе
LCLICK($_return1+*, $_return2+*) // забирает ПРИЗ
WAIT(5)
ELSE
LOGWRITE("изображение ПРИЗ НЕнайдено")
END_IF
END_CYC
потом надо зациклить этот цикл, так как вкладок четыре. я так понимаю, что этот цикл можно сделать как подпрограмму SUB, а потом просто вызывать, после того как перешел на новую вкладку.
(http://s7.hostingkartinok.com/uploads/thumbs/2015/01/afca9118f7c0bbaed42a43187c3b4e97.png) (http://hostingkartinok.com/show-image.php?id=afca9118f7c0bbaed42a43187c3b4e97)
-
Ну, правильно думаешь.
Переменную цикла нужно обнулять.
FOR ($i=0, $i<5)
Если не найдено на каком-то этапе - зачем продолжать? ведь закончились. Выходи из цикла принудительно
ELSE
$i = 10
LOGWRITE("изображение ПРИЗ НЕнайдено")
END_IF
Если кнопки приз после клика по одной из них не перемещаются, GETSCREEN достаточно сделать один перед циклом
GETSCREEN
FOR ($i=0, $i<5) // 4 раза
Или вообще уйти от цикла и заменить IF_PICTURE_IN на SCANPICTURE
GETSCREEN
SCANPICTURE($ARR_SCAN, 0,0,$_xmax,$_ymax, "ПРИЗ.bmp")
$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
$X = $ARR_SCAN [$ARR_NUM]
$Y = $ARR_SCAN [$ARR_NUM]
INC($ARR_NUM,2)
LOGWRITE("изображение ПРИЗ найдено") // пока сделал чтоб писалось в лог, что происходит в программе
LCLICK($_return1+*, $_return2+*) // забирает ПРИЗ
WAITMS(500)
END_CYC
UNDEFINE($ARR_SCAN)
-
Спасибо. Попробую.
Просто у меня информатика - три класса церковной школы, делаю скрип на подобии скриптов, сделанных на этом сайте.
SCANPICTURE скорее всего не подойдет, так как не все кнопки ПРИЗ сразу видны на экране, а только 2,5, а когда на них нажимаешь они уходят вниз, а на место них поднимаются другие кнопки.
-
Помогите с картинками. Пытаюсь найти ключевые точки, получается найти только в одной картинке, другие кажущиеся одинаковыми имеют мелкие отличия. Даже в КОЛОРМОД8 и то есть отличия
(http://s7.hostingkartinok.com/uploads/thumbs/2015/01/936636c61be46cc159668d42d99a83a8.png) (http://hostingkartinok.com/show-image.php?id=936636c61be46cc159668d42d99a83a8)
(http://s7.hostingkartinok.com/uploads/thumbs/2015/01/e253734ff216245cead8cc8589ecf61b.png) (http://hostingkartinok.com/show-image.php?id=e253734ff216245cead8cc8589ecf61b)
В других КОЛОРМОДАХ просто жуткая мешанина цветов.
(http://s7.hostingkartinok.com/uploads/thumbs/2015/01/0ac6eef569e1c15393584b92e04d45db.png) (http://hostingkartinok.com/show-image.php?id=0ac6eef569e1c15393584b92e04d45db)
Других кнопок с надписью ПОЛУЧИТЬ в игре под 20 штук. Брать одну букву не получается так как на странице их встречается много. Как проще и надежнее делать поиск ??
-
Вырезаешь картинку поменьше и указываешь процент совпадения
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "поиск.bmp", -1, 85)
LCLICK($_return1, $_return2)
WAITMS(100)
END_IF
-
Спасибо. Попробую.
-
Добрый день.
Спасибо за помощь. Все получается.
Но вот в чем вопрос!!
Предположим есть некоторая локация, в которой надо сделать определенные действия: что-то зарядить, что-то собрать, улучшить (и таких локаций с десяток).
Каждый раз появляются менюшки, кнопки но:
1. каждый раз надо делать поиск этих картинок (но тогда 80% скрипта будет гетскрин, колормод, иф пикче ин ;)
или
2. можно в локации найти какую-то точку отсчета и прибавлять координаты, что бы бот кликал по кнопкам (они всегда бывают только в строго определенных места) ?!
Мысли по методам:
1. посложнее (уж больно много времени занимает обработка картинок, поиск фрагментов) и точнее (если не нашел картинку, сделал скрин и остановился)
2. может "тупо" "тыкнуть" не туда.
3. Какой легкий редактор картинок можно использовать вместо Виндовского Пайна?
4. к примеру играю на смартфоне, тут в игре появляется редкая картинка, если сделаю скриншот, он потом пригодится в работе или надо обязательно скрины которые делает сам кликер?
-
Конечно можно использовать ориентир по которому несложно вычислить координаты кнопок
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
$sav_X = $_return1
$sav_Y = $_return2
LCLICK($sav_X-400, $sav_Y+200)
WAITMS(100)
LCLICK($sav_X-300, $sav_Y+500)
WAITMS(100)
LCLICK($sav_X-400, $sav_Y+500)
WAITMS(100)
END_IF
Для редактирования картинок я использую фотошоп, но и более простые подойдут, например более навороченный чем Paint Paint.NET (http://www.getpaint.net/download.html)
Скриншот можно делать чем угодно, главное чтобы сжатие было без потерь BMP или PNG. Сохранение в JPG портит картинку.
-
Спасибо.
А если скриншот со смарта надо "обесцветить" (черно-белый сделать) то как быть? Картинку открыть на компе (полный экран или окно) и применить гетскрин, колормод8?
-
Конечно. Открываешь при масштабе 100% вьювером и грабишь уже кликером в нужном колормоде.
-
Винт, подскажи пожалуйста, как выйти из цикла принудительно, не совсем понял
Если не найдено на каком-то этапе - зачем продолжать? ведь закончились. Выходи из цикла принудительно
Опишите кратко структуру скрипта, если я хочу использовать sub. В справке
Однако, описание подпрограммы должно быть раньше (выше) любого из ее вызовов.
Я должен описать все SUB программы, а потом уже скрипт?
-
1. FOR ($i, $i<5) - это условия вашего цикла
$i = 10 - а это та самая переменная которая наращивается внутри цикла, так вот, как только цикл вам надоел приравниваете переменную цикла к значению выше указанного в условии (5), в данном случае всё что больше 6 приведёт к выходу из этого цикла.
полагаю, всё, что больше 4 имелось ввиду
-
:) :D 10 само собой для удобочитаемости скрипта. Глянув на условие сразу понятно что валим. Без вникания . А так конечно да, все что больше 4.
-
Добрый день. спасибо за помощь. многому научили и пояснили.
вот возник вопрос:
IF_PICTURE_IN ищет нужный фрагмент с левого верхнего в правый нижний.
а как и чем можно произвести поиск в обратную сторону, справа налево и при первом совпадении попасть в эту точку?
и еще вопрос связан с поиском картинки, но с ожиданием. такой скрипт есть в шаблоне. его применение только в случае если нужная картинка может появится как через 5 сек, так и через 25, чтобы убыстрить работу скрипта. если время появление картинки точно известно стоит его применять ?
-
Профессионалы. Помогите в общих чертах со скриптом.
Есть много мелких блоков, отдельно они работают. А вот как их собрать в один большой скрип?!
Есть задания которые надо выполнить 1 раз за день (но есть задания только утром, есть только вечером), не которые 2-3 раза в день.
можно ли сделать так:
1-ый поток - все что надо выполнить 1 раз, выполнился 1 раз и закончился
2-ой поток - следит за рекламой, ошибками связи, и прочими редкими окнами и как там внутри организовать проверки этих событий? зациклить поиск 2-3 картинок?
3-ий потом - можно сделать, чтоб он стартовал по времени и работал к примеру с 12 до 13
а как сделать повтор тех заданий, которые повторяются 2-3 раза, но на их выполнения требуется время, т.е. их выполнение разнесено по времени.
И в дополнение: если все это надо выполнить для 2-3 разных учеток, как можно организовать?
-
Профессионалы. Помогите в общих чертах со скриптом.
Есть много мелких блоков, отдельно они работают. А вот как их собрать в один большой скрип?!
Есть задания которые надо выполнить 1 раз за день (но есть задания только утром, есть только вечером), не которые 2-3 раза в день.
можно ли сделать так:
1-ый поток - все что надо выполнить 1 раз, выполнился 1 раз и закончился
2-ой поток - следит за рекламой, ошибками связи, и прочими редкими окнами и как там внутри организовать проверки этих событий? зациклить поиск 2-3 картинок?
3-ий потом - можно сделать, чтоб он стартовал по времени и работал к примеру с 12 до 13
а как сделать повтор тех заданий, которые повторяются 2-3 раза, но на их выполнения требуется время, т.е. их выполнение разнесено по времени.
И в дополнение: если все это надо выполнить для 2-3 разных учеток, как можно организовать?
Да что же вы все потоки лепите куда надо и куда не надо. То привязку лепили, теперь потоки ещё :-\
Потоки нужны для распараллеливания задач, их одновременного выполнения.
Для выделения куска кода использующегося несколько раз - существуют подпрограммы.
В твоём случае потоки нужны только для указанного тобой "2-ой поток".
Остальные действия выделяем в свои подпрограммы.
В основном скрипте будет такой себе шедулер, который крутится в цикле и в зависимости от времени и прочего запускает ту или иную подпрограмму.
Т.к. всё абстрактно, покажу пример из одного моего скрипта
// Здесь запускаем то, что нужно выполнить 1 раз в начале
// первый старт
IF($first_start = 1)
// запуск копателя
IF($digger = 1)
IF($run_main = 1)
reload()
digger()
reload()
END_IF
END_IF
IF(($akk_main = 1) & ($run_main = 0)) // основной
main()
WAIT(15)
END_IF
IF($akk_bill = 1) // bill
bill()
WAIT(7)
END_IF
IF($akk_fake = 1) // fake
fayk()
WAIT(7)
END_IF
END_IF
// --- основной цикл ---
$time_start = $_ms
$time_reload = $_ms + 1800000
$loop_all = 0
WHILE($loop_all = 0)
// перезапуск
IF(($time_reload < $_ms) & ($run_main = 1) & ($run_bill = 0) & ($run_fake = 0))
reload()
$time_reload = $_ms + 1800000
END_IF
// сброс привязки таймера
IF(($run_ontime = 1) & ($_time_h = 1) & ($_time_m > 6))
$run_ontime = 0
END_IF
IF(($run_ontime = 1) & ($_time_h = 4) & ($_time_m > 6))
$run_ontime = 0
END_IF
IF(($run_ontime = 1) & ($_time_h = 9) & ($_time_m > 6))
$run_ontime = 0
END_IF
IF(($run_ontime = 1) & ($_time_h = 12) & ($_time_m > 6))
$run_ontime = 0
END_IF
IF(($run_ontime = 1) & ($_time_h = 16) & ($_time_m > 6))
$run_ontime = 0
END_IF
IF(($run_ontime = 1) & ($_time_h = 20) & ($_time_m > 6))
$run_ontime = 0
END_IF
// запуск копателя
IF($digger = 1)
IF($run_main = 1)
reload()
digger()
reload()
$time_reload = $_ms + 1800000
END_IF
END_IF
// запуск основного
IF(($akk_main = 1) & ($run_main = 0))
main()
END_IF
// Запускаем в 01:00
IF(($run_ontime = 0) & ($_time_h = 1) & ($_time_m < 5))
$run_ontime = 1
IF(($akk_bill = 1) & ($run_bill = 0)) // bill
bill()
END_IF
IF(($akk_fake = 1) & ($run_fake = 0)) // fake
fayk()
END_IF
END_IF
// Запускаем в 05:00
IF(($run_ontime = 0) & ($_time_h = 5) & ($_time_m < 5))
$run_ontime = 1
IF(($akk_bill = 1) & ($run_bill = 0)) // bill
bill()
END_IF
IF(($akk_fake = 1) & ($run_fake = 0)) // fake
fayk()
END_IF
END_IF
// Запускаем в 09:00
IF(($run_ontime = 0) & ($_time_h = 9) & ($_time_m < 5))
$run_ontime = 1
IF(($akk_bill = 1) & ($run_bill = 0)) // bill
bill()
END_IF
IF(($akk_fake = 1) & ($run_fake = 0)) // fake
fayk()
END_IF
END_IF
// Запускаем в 12:00
IF(($run_ontime = 0) & ($_time_h = 12) & ($_time_m < 5))
$run_ontime = 1
IF(($akk_bill = 1) & ($run_bill = 0)) // bill
bill()
END_IF
IF(($akk_fake = 1) & ($run_fake = 0)) // fake
fayk()
END_IF
END_IF
// Запускаем в 16:00
IF(($run_ontime = 0) & ($_time_h = 16) & ($_time_m < 5))
$run_ontime = 1
IF(($akk_bill = 1) & ($run_bill = 0)) // bill
bill()
END_IF
IF(($akk_fake = 1) & ($run_fake = 0)) // fake
fayk()
END_IF
END_IF
// Запускаем в 20:00
IF(($run_ontime = 0) & ($_time_h = 20) & ($_time_m < 5))
$run_ontime = 1
IF(($akk_bill = 1) & ($run_bill = 0)) // bill
bill()
END_IF
IF(($akk_fake = 1) & ($run_fake = 0)) // fake
fayk()
END_IF
END_IF
WAIT(60)
END_CYC
HALT
Здесь при запуске запускаем main() и через небольшую задержку, параллельно ему, запускаем последовательно bill() и fayk().
Подпрограмма main() запускается в начале и работает всегда.
Раз в 30 минут запускается его принудительная перезагрузка reload() точнее убийство и происходит перезапуск main()
При запуске 1 раз сразу (в любое время) и по расписанию в 1, 5, 9, 12, 16, 20 часов запускаются последовательно
bill() и fayk()
Во время работы, если запущены и работают bill() или fayk() перезагрузка reload() не срабатывает. Иначе вместе с мэйном убъёт только начавшиеся и не отработанные bill() или fayk()
-
Я только всему учусь, в программировании вообще не силен :( , делаю для себя бот, чтобы не делать очень много однотипных действий. попозже напишу, что хочу от бота, чтобы было понятнее
-
есть игра Легенды Галактики. надо много занудных действий делать каждый день.
в 0-00 по серверу (в 3-0 по Москве) происходит перегрузка сервера и надо сначала выполнять по кругу задания.
Работа скрипта должна начаться в 2-50, чтобы до перегрузки сервера истратить снабжение (ходы).
1. запустить БлюСтакс
2. запустить игру
3. выбор персонажа (есть три аккаунта, надо по очереди зайти ко всем по очереди (сокланы отдали погонять)) (пока не знаю как подступиться)
4. при входе бывает "рекламное окно", бывает получить "приз за вход" (есть призы, которые дают вот таким способом: зашел в игру, через 15 мин загорается ! знак, заходишь туда, берешь приз, запускается таймер для другого, и так время постоянно растет, т.е. типа так 15мин, 30, 1час, 1,5 часа)
5. зайти в Альянс: (это обязательно сделать первым делом, так как после этого убыстряется прокачка персонажей)
внутри вкладки альянс есть еще три вкладки, в которые надо зайти, нажать на кнопки и выйти опять в альянс, зайти во вторую, и так далее. выполняется 1 раз
5.1 внести пожертвования (тут хитрость такая, у разных аккаунтах разные пожертвования, не совсем соображу как это сделать, типа имя А - то жми сюда, если имя Б - то жми туда?
5.2 отправить экспедицию (тут если ты последний в очереди, то будет небольшой ролик, который нельзя пропустить, надо подождать и потом выйти)
5.3 позвать союзников (тут все просто)
6 вход в лабораторию.
внутри тоже не сколько окошек в которые надо зайти
6.1 рулетка (1 раз) (тут просто)
6.2 добыча (3 раза) (на добычу тратится от 40 мин до 1,5 часа) (надо выбрать руду, где больше денег, различаются по цвету)
6.3 грабеж (4 раза) (грабить можно через 5 мин, но своих грабить нельзя, желательно чужой альянс, но тех, кто по зубам (по общей мощности флота) (думаю пока пропустить данный шаг) и при грабеже надо искать более дорогие источники, отличаются по цвету)
6.4 боевая тренировка (1 раз)
WAITMS(500)
LOGWRITE("начало боевой подготовки")
GETSCREEN
COLORMODE(8)
SCREENSHOT
IF_PICTURE_IN (0,0, 1100,600, "textures\batl_tren.bmp", -1, 90)
LOGWRITE("изображение batl_tren найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1+50, $_return2-10)
WAIT(8) // зашли в подготовку
// есть 5 целей, которые надо уничтожить, но вторая цель появляется после уничтожения первой
FOR ($i=0, $i<6)
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\target4.bmp", -1, 85)
LOGWRITE("изображение target найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1-83, $_return2) // нажимает на корабли
WAIT(7) //зашли в Инфо Противника
// надо нажать на кнопку
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\sragenie.bmp", -1, 80)
LOGWRITE("изображение sragenie найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1, $_return2) // нажимает на кнопку сражение
WAIT(10) //зашли в расстановку флота
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\sragenie_2ur.bmp", -1, 90)
LOGWRITE("изображение sragenie_2ur найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1, $_return2) // вступаем в бой
WAIT(50) // идет бой
// должна быть проверка
// если Выграли - идем дальше
// если проиграл - оставновка и выход
// пока без проверки, идем дальше
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\2strelki-2.bmp", -1, 82)
LOGWRITE("изображение 2strelki найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1, $_return2) // вышли из просмотра результатов
// там где 5 целей
WAIT(5)
ELSE
LOGWRITE("изображение 2strelki НЕнайдено")
END_IF
ELSE
LOGWRITE("изображение sragenie_2ur НЕнайдено")
END_IF
ELSE
LOGWRITE("изображение sragenie НЕнайдено")
END_IF
ELSE
LOGWRITE("изображение target НЕнайдено")
$i = 10
END_IF
END_CYC
ELSE
LOGWRITE("изображение batl_tren НЕнайдено")
END_IF
LOGWRITE(" конец боевой подготовки")
WAIT(5)
HALT
7. зарядить Портал
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, 1100,600, "textures\CITADEL-2.bmp", -1, 90)
LOGWRITE("изображение Цитадель найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
$sav_X = $_return1
$sav_Y = $_return2
LCLICK($sav_X+230, $sav_Y-56)
WAIT(3)
LCLICK($sav_X+230, $sav_Y+317)
WAIT(3)
LCLICK($sav_X-142, $sav_Y-93)
WAIT(3)
LCLICK($sav_X+512, $sav_Y+177)
WAIT(3)
LCLICK($sav_X+512, $sav_Y+177)
WAIT(3)
LCLICK($sav_X+177, $sav_Y+350)
WAIT(6)
LCLICK($sav_X+57, $sav_Y+363)
WAIT(3)
LCLICK($sav_X+609, $sav_Y-118) //выход
else
LOGWRITE("изображение Цитадель НЕнайдено")
end_IF
8. получить галактонит (тут росто)
9. зайти в хоз центр (тут просто)
10. зайти на арену
10.1 забрать приз (тут просто)
10.2 кого-то стукнуть (для разных акков по разному, пока не буду делать)
11. собрать деньги в Цитадели (ресурсы восстанавливаются, поэтому лучше заходить через 6-8 часов) (сам сбор сделал, надо сделать чтоб с периодичностью заходил)
12. истратить снабжение (сложная задача, часть сделал, пока не стабильно работает), снабжение копится 20 ходов (это максимум) за 10 часов.
13. бой с Праймусом (большой корабль, БОсс, начинается в 18-00, но надо зайти пораньше, сделать подготовку, бой идет максимум до 18-30).
14. в конце дня еще один блок, это сбор наград, за выполнения заданий
/
sub(sbor_prizov)
/== подпрограмма сбор наград в ежедневнике ==//
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, 1100,600, "textures\NAGRADA-2.bmp", -1, 90)
LOGWRITE("изображение награда найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1+10, $_return2)
WAIT(5)
ELSE
LOGWRITE("изображение награда НЕнайдено")
END_IF
WAIT(1)
FOR ($i=0, $i<7)
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0, 0, 1100, 700, "textures\POLUCHIT-4.bmp", -1, 80)
LOGWRITE("изображение ПОЛУЧИТЬ найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1, $_return2)
WAIT(6)
ELSE
LOGWRITE("изображение ПОЛУЧИТЬ НЕнайдено")
$i = 10
END_IF
END_CYC
end_sub
//сама программа
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, 1100,600, "textures\LISTOK-2.bmp", -1, 90) //
LOGWRITE("изображение Листок найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1+10, $_return2+10)
WAIT(5)
ELSE
LOGWRITE("изображение Листок НЕнайдено")
END_IF
//== попадаем на вкладку Бизнес
sbor_prizov()
//== надо попасть на вкладку ФЛОТ
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\FLOT-2.bmp", -1, 90)
LOGWRITE("изображение ФЛОТ найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1, $_return2)
WAIT(3)
ELSE
LOGWRITE("изображение ФЛОТ НЕнайдено")
END_IF
// попадаем на вкладку ФЛОТ
sbor_prizov()
//== надо попасть на вкладку ОПЫТ
GETSCREEN
COLORMODE(8)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\OPIT-2.bmp", -1, 90)
LOGWRITE("изображение ОПЫТ найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1, $_return2)
WAIT(3)
ELSE
LOGWRITE("изображение ОПЫТ НЕнайдено")
END_IF
// попадаем на вкладку ОПЫТ
sbor_prizov()
Вот что хочется от бота. Вынес на обозрения пару блоков, самых больших, остальные меньше.
Так как игра очень "цветная" делаю колормод8. ищу базовую точку, от нее идет отсчет координат, а так же идет поиск кнопок, куда надо нажать. Если надо скрины то завтра могу их приложить, для полного понятия.
Помогите со структурой скрипта, так как по примеру, приведенному Vint я не пойму. Ну и может еще можно оптимизировать и улучшить код.
-
старт и работа по времени лежат на форуме.
я много тем посмотрел, но пока не играл эти игры то не совсем понятен алгоритм, так же как и я сейчас Вас прошу.
Если один игрок, то я вроде бы понял как делать, но мне надо, чтобы было переключение между тремя (5-7) акаунтов, хотя бы 1 раз чтобы прошелся по всем.
-
Добрый день, Vint.
Не совсем понял Вас.
В игре нельзя одновременно играть двумя игроками. Тут получается, что надо зайти игроком А, выполнить часть действий, выйти, зайти игроком В, выполнить часть действий, выйти, зайти игроком С, выполнить часть действий, выйти, потом через 15 минут опять зайти А, выполнить задание, выйти, зайти В, выполнить задание, выйти, зайти С, выполнить задание.
-
Значит нужно выходить и заходить.
Создать список аккаунтов иходить по нему. Хочешь по кругу, хочешь выборочно.
Пишешь подпрограмму перелогинивающую на следующего игрока и где нужно вызываешь.
-
Доброй ночи.
Встретился со странной ошибкой или глюком.
Вот кусочек скрипта.
GETSCREEN
COLORMODE(8)
SCREENSHOT
IF_PICTURE_IN (0,0, 1100,600, "textures\batl_tren.bmp", -1, 90)
LOGWRITE("изображение batl_tren найдено")
LOGWRITE("x: ", $_return1," y: ", $_return2)
LCLICK($_return1+50, $_return2-10)
У меня работает нормально. Все находит, на все кнопки жмет.
Принес все знакомому, пробую - пишет, что изображение не найдено и самое странное, что командой SCREENSHOT создаются совершенно чисто белые скрины. А если включить Лупу и посмотреть, то в окошечке видно увеличенное изображение.
-
Я знаю, что колормод8 это черно-белое изображение, но почему-то скрины получаются как просто белый лист. Все текстуры естественно перенес. Просто колормод работат, получаются полноцветные скрины.
а могут какие-то настройки экрана, видеокарты или еще чего-то так повлиять?!
-
А можно сделать поиск в заданной области всех картинок с любыми именами из определённой папки?
-
А можно сделать поиск в заданной области всех картинок с любыми именами из определённой папки?
Лень двигатель прогресса.
Можно. Но оно тебе точно нужно?
неужели тяжело имена подготовить. Подсказать пакетный переименователь?
Если только ради спортивного интереса... Создаешь бат файл который будет формировать в текстовый файл список из имен файлов в каталоге. Скрипт вызывает этот батник, и в цикле ищет картинки по считанным именам.
Тебе нужны сразу все результаты по всем картинкам в одном массиве?
Или поиск до первого совпадения?
-
Интересно, как делается такой поиск. Это на случай, если картинки будут нестабильно распознаваться по образцам, а уменьшение процента совпадения пикселей опять же с некоторого значения вызовет неточности и количество образцов придётся увеличивать, причём, постепенно, в процессе испытаний. Чтобы можно было накидать их в одну папку и не заморачиваться с написанием имени каждого файла образца в тексте программы.
С бат файлами никогда не приходилось возиться, и такое для меня вообще тёмный лес. :(
До первого совпадения. А если ни одного не будет - в логе надпись об этом и создание скриншота, чтобы вырезать с него ещё один образец и сохранить к остальным в папку.
-
Вот тебе пример.
// картинки находятся в папке Текстуры рядом со скриптом.
// формат
// "Текстуры\Image_1.bmp"
// "Текстуры\Image_2.bmp"
// ...
// "Текстуры\Image_10.bmp"
$count = 10 // количество картинок
GETSCREEN
FOR($num=1,$num<$count+1) // Ищем картинки от начала до конца
IF_PICTURE_IN(0,0, $_xmax,$_ymax, STRCONCAT("Текстуры\Image_",$num,".bmp"), -1, 100)
LCLICK($_return1+1, $_return2+1)
WAITMS(100)
$num = 9999 // прерываем цикл если есть совпадение
END_IF
END_CYC
HALT
-
Вот на... если не хочешь переименовывать и считать файлы.
$pref = "Текстуры\" // префикс отдельной папки с картинками"
$cmd = STRCONCAT($pref,"cmd.bat")
$dir = STRCONCAT($pref,"dir.txt")
TFWRITE($cmd, "chcp 1251>nul")
TFWRITE($cmd, STRCONCAT("cd ", $pref))
TFWRITE($cmd, "dir *.bmp /b /on >dir.txt")
TFWRITE($cmd, "del /F /S cmd.bat")
EXECUTE($cmd)
WAIT(1)
GETSCREEN
FOR($i=0, $i < TFCOUNT($dir))
$name = TFREAD($dir, $i+1)
IF_PICTURE_IN(0,0, $_xmax,$_ymax, STRCONCAT($pref,$name))
LOGWRITE ("Найдена картинка: ", $name)
MOVE($_return1, $_return2)
WAITMS(10)
$i = 9999 // прерываем цикл если есть совпадение
END_IF
END_CYC
IF($i ! 10000)
LOGWRITE ("Ничего не найдено")
//SCREENSHOTEX(100,100, 150,150, "Image_", 0)
END_IF
HALT
Немножко всё усложнилось из-за имён на русском. Если только англ. - создание списка проще. И если картинки не в отдельной папке, а в папке скрипта - ещё упростится.
пример:
// вариант попроще, если без папки и только Английский
EXECUTE("cmd.exe", STRCONCAT(" /C dir *.bmp /b /on >dir.txt"))
WAIT(1)
GETSCREEN
FOR($i=0, $i < TFCOUNT("dir.txt"))
$name = TFREAD("dir.txt", $i+1)
IF_PICTURE_IN(0,0, $_xmax,$_ymax, $name)
LOGWRITE ("Найдена картинка: ", $name)
MOVE($_return1, $_return2)
WAITMS(10)
$i = 9999 // прерываем цикл если есть совпадение
END_IF
END_CYC
IF($i ! 10000)
LOGWRITE ("Ничего не найдено")
//SCREENSHOTEX(100,100, 150,150, "Image_", 0)
END_IF
HALT
-
Спасибо за исчерпывающие ответы. Получаются удобные програмки для помощи при создании образцов для поиска, когда всё сложно с изображениями. А после получения его нормальной работы они же с небольшими изменениями могут использоваться, как блоки и большая часть программы для поиска изображений с последующими разными действиями, в зависимости от того, какая из картинок или их комбинация найдена. Halt останавливает работу всей программы, где бы он ни находился и куда бы ни был вложен? А если надо сначала определиться с параметром №1, перебрав кучу картинок №1 до совпадения и присвоить переменной параметра №1 значение, в зависимости от того, какая из картинок нашлась (среди них есть как бы несколько групп, обозначающих разное, а внутри групп похожие картинки, обозначающие одно и тоже), потом остановить перебор и перейти к перебору кучи картинок №2 для определения параметра №2 до совпадения и присвоить переменной параметра №2 значение, в зависимости от того, какая из картинок нашлась, потом остановить перебор и CASEом из комбинации значений переменных параметров №1 и №2 выбрать дальнейшие действия и сделать их. Тут с помощью GOTO оптимально "прыгать" от первого досрочно завершённого перебора ко второму и от второго дальше?
-
Не нужно никуда досрочно прыгать по GOTO. Нужно просто прервать перебор и завершить штатно.
Halt останавливает работу всей программы, где бы он ни находился и куда бы ни был вложен
Да. Если если он выполнился.
потом остановить перебор и CASEом из комбинации значений переменных параметров №1 и №2 выбрать дальнейшие действия ...
CASE, точнее SWITCH, для этого не подойдёт, нужно использовать группы условий.
-
Подумал, что с помощью STRCONCAT можно было бы сначала слепить две переменные-параметра, полученные в первом и втором переборе картинок, в одну, которую использовать в SWITCH. Например, из "2" и "3" получить "23" или из "c" и "b" получить "cb". Ещё появилась идея в первом переборе присвоить переменной-параметру №1 одно из чисел 1, 2, ..., 9 (или до 99, если так много вариантов) и во втором №2 одно из чисел 10, 20, ..., 90 (или 100, 200, ..., 9900, если в обоих нужно двузначное число вариантов), тупо сложить их, присвоить результат одной переменной и по нему выбрать SWITCHем одно из действий. Ну и нераспознавание обозначать нулём, чтобы, например, если в двузначном значении переменной число однозначное или кратное десяти или 0 (второй или первый или оба разряда 0), то предпринять какое-то особое действие, типа сообщить об этом и скриншот.
-
IF($i ! 10000)
LOGWRITE ("Ничего не найдено")
//SCREENSHOTEX(100,100, 150,150, "Image_", 0)
END_IF
Что-то непонятно, почему это должно выполниться только если не найдены картинки, а не всегда?
-
Что-то непонятно, почему это должно выполниться только если не найдены картинки, а не всегда?
Если картинка найдена, переменной $i присваивается 9999, цикл начинается еще раз, переменная $i увеличивается на 1 и становится 10000, проверяется условие $i < 10, условие не верно а значит внутренность цикла пропускается и мы переходим к условию IF($i ! 10000). $i у нас равна 10000 а значит условие не верно и пропускается. Если же в твоем случае картинка не будет найдена, переменная $i не станет равна 9999 и условие после цикла будет выполнено.
FOR($i=0, $i < 10)
$i = 9999 // прерываем цикл если есть совпадение
END_CYC
LOGWRITE ("i= ", $i)
IF($i ! 10000)
LOGWRITE ("Ничего не найдено")
END_IF
HALT