Помогите разобраться

Закрыто
Admin
Главный админ
Сообщения: 214
Зарегистрирован: 28 окт 2021 14:01

Re: Помогите разобраться

Сообщение Admin »

Вот ваш скрипт. Лучше всего изучить его на ПК, если есть. В крайнем случае на планшете. Потому что в некоторых местах оставил комментарии, с которыми вам необходимо внимательно ознакомиться. На телефоне это делать будет не очень удобно.

Код: Выделить всё

Image Next = Image.load("Next");
Point Next_Area_1 = Point.get(20, 1700);
Point Next_Area_2 = Point.get(180, 1920);
int nextMidX = (int)(Next.getWidth() * 0.5);
int nextMidY = (int)(Next.getHeight() * 0.5);
//---------------------------------------------------
Point defense_Area_1 = Point.get(270, 1540);
Point defense_Area_2 = Point.get(298, 1584);
Image def1 = Image.load("1");
Image def2 = Image.load("2");
Image def3 = Image.load("3");
Image def4 = Image.load("4");
//---------------------------------------------------
Point refresh_P = Point.get(978, 1730);
//---------------------------------------------------
Image ukr = Image.load("UKR");
Image pnx = Image.load("PNX");
Image u1k = Image.load("U1K");
Image ufu = Image.load("UFU");
Point clan_Area_1 = Point.get(210, 1465);
Point clan_Area_2 = Point.get(350, 1530);
//---------------------------------------------------
Point Attack_P = Point.get(871, 1536);
//---------------------------------------------------
Image coin = Image.load("coin");
Point coin_Area_1 = Point.get(990, 180);
Point coin_Area_2 = Point.get(1055, 246);
//---------------------------------------------------
Image Gold4 = Image.load("Gold4");
Image Gold5 = Image.load("Gold5");
Image Gold6 = Image.load("Gold6");
Image Gold7 = Image.load("Gold7");
Point Gold_Area_1 = Point.get(898, 197);
Point Gold_Area_2 = Point.get(932, 237);
//---------------------------------------------------
Image k = Image.load("k");
Point k_Area_1 = Point.get(964, 164);
Point k_Area_2 = Point.get(999, 244);
//---------------------------------------------------

startScreenCapture(2);
sleep(180);

Point pFoundNext;
while (!EXIT)
{
    // 2) кликер должен найти изображение Next в зоне Next_Area_1~2
    // 3) пока изображения не найдено (кликер - далее К) не переходит к следующим действиям
    pFoundNext = findImg(Next, Next_Area_1, Next_Area_2);

    if (pFoundNext.x > -1)
    {

        // 4) после того как изображение Next найдено - определяем его координаты - создаём точку с центром картинки Next
        // (ПРИМ. разработчика. здесь величина отклонения 15 пикселей вокруг центра, можете поменять, если нужно.)
        Point pRandNext = randomize(Point.get(pFoundNext.x + nextMidX, pFoundNext.y + nextMidY), 15);

        // 5) нажимаем Next с функций рандома
        click(pRandNext);

        // 6) ждём с функцией рандома 50-200 мс
        //(ПРИМ. разработчика. здесь рандом не нужен. Достаточно просто подождать перед началом проверки цвета)
        sleep(200);

        // 7) проверяем в совпадение цвета в точке (х у) (задам координаты точки позже),
        //делаем эту проверку до тех пор пока цвет не появится в нужной точкe
        //(ПРИМ. разработчика. цвет вы также не указали, запишите его вместо color)
        while (getColor(x, y) != color)
            sleep(100);

        // 8) ждем рандомное время (50-180мс)
        sleep(rand(50, 180));

        // 9) в зоне defense_Area_1~2 ищем изображения def1~2~3~4,
        //что бы перейти к следующему этапу в коде необходим факт нахождения одной из картинки.
        while (!hasImg(def1, defense_Area_1, defense_Area_2) 
        && !hasImg(def2, defense_Area_1, defense_Area_2) 
        && !hasImg(def3, defense_Area_1, defense_Area_2) 
        && !hasImg(def4, defense_Area_1, defense_Area_2))
        {
            // 10) Если картинка не найдена то нажимаем с рандомным показателем (18) в точку refresh_P,
            //ждем рандомное время 50-180 мс, и повторяем операцию в пункте «9»
            click(randomize(refresh_P, 18));
            sleep(rand(50, 180));
        }

        // 11) если изображение найдено то начинаем поиск группы изображений (ukr , pnx, u1k , ufu)
        // поиск в альфа канале потому что в рандомное время может присутствовать другой цвет и наложенный градиент.
        // Так же для лучшего результата точность поиска устанавливаем 70.
        //(ПРИМ. разработчика. точность нужно будет тестировать, чтоб не срабатывал на любой текст. Минимальный порог 60.)
        setMinMatchQuality(70);

        //(ПРИМ. разработчика. вы не указали где искать эти изображения. Я предполагаю, что в зоне clan_Area_1-2, если нет - замените точки)

        /*------------ Удалите эту строку после тестирования и настройки скрипта

        while (hasImg(ukr, clan_Area_1, clan_Area_2, GREY)
        || hasImg(pnx, clan_Area_1, clan_Area_2, GREY)
        || hasImg(u1k, clan_Area_1, clan_Area_2, GREY)
        || hasImg(ufu, clan_Area_1, clan_Area_2, GREY))
        {
            //12) Если изображение найдено то делаем принтскрин в зоне PS_1~2
            // (что бы в первое время проверить правильность отсеивание противников)
            // и выполняем «10» пункт ( именно нажимаем refresh)
             click(randomize(refresh_P, 18));
             sleep(rand(50, 180));
        }

        ------------ Удалите эту строку после тестирования и настройки скрипта */

        //(ПРИМ. разработчика. этот цикл делает скрин и отмечает тот участок который он нашел.
        // Его нужно будет удалить после настройки setMinMatchQuality)
        while (testImgDetection(ukr, clan_Area_1, clan_Area_2, GREY)     //
               || testImgDetection(pnx, clan_Area_1, clan_Area_2, GREY)  //
               || testImgDetection(u1k, clan_Area_1, clan_Area_2, GREY)  //
               || testImgDetection(ufu, clan_Area_1, clan_Area_2, GREY)) //
        {                                                                //
            click(randomize(refresh_P, 18));                             //
            sleep(rand(50, 180));                                       //
        }                                                                //
        //---------------------------------------------------------------//

        // 13) если изображение НЕ найдено то нажимаем с рандомным показателем (по у - 36 по х - 80 ) от центральной заданной точки Attack_P
        click(rand(Attack_P.x - 80, Attack_P.x + 80), rand(Attack_P.y - 36, Attack_P.y + 36));

        // (ПРИМ. разработчика. я так понимаю успешное нахождение противника считается успешным после нажатия кнопки атаки)
        // сохраняем время начала атаки
        long atackTime = Time.getMillis();

        // 14) ждём с рандомным временем 100-300
        //(ПРИМ. разработчика. здесь рандом не нужен. Достаточно просто подождать перед началом поиска)
        sleep(300);

        // (ПРИМ. разработчика. возвращаем точность поиска)
        setMinMatchQuality(95);

        // 15) ищем изображение coin в зоне coin_Area_1~2, ищем до тех пор пока не найдём.
        while (!hasImg(coin, coin_Area_1, coin_Area_2))
            sleep(300);

        // 16) coin найден! Переходим к поиску одного из изображений Gold4~5~6~7 в зоне
        // Gold_Area_1~2 и обязательно в любой совокупности изображение k в зоне k_Area_1~2
        if ((hasImg(Gold4, Gold_Area_1, Gold_Area_2) 
        || hasImg(Gold5, Gold_Area_1, Gold_Area_2) 
        || hasImg(Gold6, Gold_Area_1, Gold_Area_2) 
        || hasImg(Gold7, Gold_Area_1, Gold_Area_2)) 
        && hasImg(k, k_Area_1, k_Area_2))
        {
            // 18) если совокупность изображений найдена то в течении 20 минут,
            // каждые полминуты начиная с момента обнаружение подходящего противника посылаем вибро и аудио уведомления
            // а так же нажимаем в точку x,y.

            long battleTime = 20 * 60 * 1000;
            long lastClickTime = Time.getMillis();
            //запускаем цикл на 20минут
            while ((Time.getMillis() - atackTime) < battleTime)
            {

                //проверяем прошло ли полминуты
                if ((Time.getMillis() - lastClickTime) > 30000)
                {
                    // если прошло нажимаем в точку x,y
                    click(x, y);
                    // уведомляем о нажатии
                    showNotification("Нажали точку х у");
                     // сохраняем время последнего нажатия
                    lastClickTime = Time.getMillis();
                }

                //повторяем проверку каждые 100мс в течении 20минут
                sleep(100);
            }
        }

        // 17) если совокупность не найдена то ждём рандомное время 50-180,
        //делаем принтскрин в зоне PS_3~4 и преступаем к выполнению 2 пункта (мегацикл)

        //(ПРИМ. разработчика. Автокликер не умеет делать скрины в любое время,
        // он умеет делать скрины только во время тестирования поиска изображения)
        // До сих пор как-то никто не спрашивал об этой функции.
        // Добавлю в следующем обновлении.
        // Если у вас андроид 10+ можно вызвать диалог выключения и нажать на кнопку сделать скриншот
        // Только скриншот будет сохранен в системную папку скриншотов, а не в папку приложения
        // вот код, как это можно сделать
        showPowerDialog();
        sleep(200);
        click(x, y); // Где х и у это координаты кнопки "Скриншот"
    }

    sleep(200);
}
Остались невостребованны некоторые переменные. Где они используются в ТЗ не сказано. Поэтому разбирайтесь сами, нужны они или нет. Вот их список:

Код: Выделить всё

Image refresh = Image.load("refresh");

Point Attack_Area_1 = Point.get(720,1420);
Point Attack_Area_2 = Point.get(990,1600);

Point refresh_Area_1 = Point.get(900,1680);
Point refresh_Area_2 = Point.get(1020,1780);

Image Attack = Image.load("Attack");
Serg72
Сообщения: 25
Зарегистрирован: 12 сен 2022 04:26

Re: Помогите разобраться

Сообщение Serg72 »

Спасибо большое! Отдельно спасибо за ваши комментарии в коде.
Действительно эти области не стал использовать, решил завести просто точки с координатами. удалять пока не стал.
Не закрывайте пока эту ветку в течении пары дней пожалуйста
Serg72
Сообщения: 25
Зарегистрирован: 12 сен 2022 04:26

Re: Помогите разобраться

Сообщение Serg72 »

Есть парочку вопрос по поводу кода.

int nextMidX = (int)(Next.getWidth() * 0.5);
int nextMidY = (int)(Next.getHeight() * 0.5);

Как эта функция работает? Почему пустые скобки?


Point pFoundNext;
Как это понять? Тут нет значения никакого, для чего мы это изпользуем?
Serg72
Сообщения: 25
Зарегистрирован: 12 сен 2022 04:26

Re: Помогите разобраться

Сообщение Serg72 »

Правильно ли я понимаю что тут (pFoundNext.x + nextMidX, pFoundNext.y + nextMidY)
Результат будет тот же что и до этого когда мы приписывали точные цифры? Просто система сама вычислит половину ширины и высоты картинки?


Вот тут загадка.

Код: Выделить всё

while (!hasImg(def1, defense_Area_1, defense_Area_2) 
        && !hasImg(def2, defense_Area_1, defense_Area_2) 
        && !hasImg(def3, defense_Area_1, defense_Area_2) 
        && !hasImg(def4, defense_Area_1, defense_Area_2))
        {
        
Почему мы тут инвертируем поиск?
И второе скорее всего это опечатка, почему тут используем функцию && (и) когда по идее нужно || (или)
Serg72
Сообщения: 25
Зарегистрирован: 12 сен 2022 04:26

Re: Помогите разобраться

Сообщение Serg72 »

Код: Выделить всё

 /*------------ Удалите эту строку после тестирования и настройки скрипта

        while (hasImg(ukr, clan_Area_1, clan_Area_2, GREY)
        || hasImg(pnx, clan_Area_1, clan_Area_2, GREY)
        || hasImg(u1k, clan_Area_1, clan_Area_2, GREY)
        || hasImg(ufu, clan_Area_1, clan_Area_2, GREY))
        {
Объясните пожалуйста как работает /*- - -
Grey это в альфканале поиск?
Admin
Главный админ
Сообщения: 214
Зарегистрирован: 28 окт 2021 14:01

Re: Помогите разобраться

Сообщение Admin »

1) Как эта функция работает? Почему пустые скобки? - Упомянутые функции возвращают ширину и высоту шаблонного изображения. В данном случае Next. После чего полученные значения деляться на половину и приводяться к целочисленному значению. Это необходимо для получения центральной точки изображения.

2) Point pFoundNext; Как это понять? Тут нет значения никакого, для чего мы это изпользуем? - В этой строке нету значения. Но через одну строку уже есть. Там же и используем.

3) Правильно ли я понимаю что тут (pFoundNext.x + nextMidX, pFoundNext.y + nextMidY) - Если изображение найдено, автокликер сам определит его центральную точку, после чего рандомизирует ее и уже по новой случайной точке, в пределах центра, выполнит нажатие.

4) Почему мы тут инвертируем поиск? - Потому что в задании сказано "что бы перейти к следующему этапу в коде необходим факт нахождения одной из картинки". В условии как раз и написано "Пока не найдено первое изображение И не найдено второе И не найдено N-ное нажимаем рефреш." Как только будет обнаружено хотя бы одно из изображений условие будет ложным и цикл будет прерван, а скрипт продолжит выполнение и поиск тега союзного клана, в данном случае.

5) Объясните пожалуйста как работает /*- - - Это МНОГОстрочный комментарий. То есть все что написано между такими символами /* и */ Будет проигнорировано. Точно так же как и при // . Только два слеша это ОДНОстрочный комментарий. Пока там стоят эти две строки, весь цикл между ними выполняться не будет. Как только вы настроите коэфициент совпадения и удалите эти строки, начнет выполнять цикл с функцией hasImg при этом цикл с testImgDetection нужно будет удалить, чтоб он не делал кучу скриншотов.

6)Grey это в альфканале поиск? - Вы наверное не корректно понимаете значение "альфаканал". И нет это не в альфаканале поиск. Использование этой переменной в функции, указывает ей, что сравнение должно происходить без учета цвета. То есть в оттенках серого. Это удобно, когда, как в вашем случае, изображение может иметь разный цвет, при этом логически это одно и то же изображение.
Serg72
Сообщения: 25
Зарегистрирован: 12 сен 2022 04:26

Re: Помогите разобраться

Сообщение Serg72 »

4) не совсем понимаю где это написано « пока не найдём первое и второе и третье изображение”

Вот только тут описывается этот пункт:
11) если изображение найдено то начинаем поиск группы изображений (ukr , pnx, u1k , ufu) поиск в альфа канале потому что в рандомное время может присутствовать другой цвет и наложенный градиент. Так же для лучшего результата точность поиска устанавливаем 70.
:?

Произошло видимо недоразумение, вы применяете сюда трактовку из 9 пункта, но мы находимся на 11 в этом моменте уже.

Разъясню
Так как в 9 пункте была найдена одна из картинок, мы сейчас в 11 пункте. У нас настал второй этап отсева противников. Сейчас мы будем отсекать наших союзников, что бы даже не переходить к проверке их золотого запаса, не тратить время.
Мы в области clan_Area проверяем / ищем изображения их тега. Если хотя бы одно было найдено из этих 4 то дальше мы не идём и жмём рефреш. Если рассматриваемый противник не наш союзник тогда нападаем и дальше бою происходит проверка золотого запаса
Закрыто