Я долгое время публиковал свои результаты прыжка в своем кругу друзей. Сегодня я случайно видел видео коллеги, который использовал код для получения результатов. Я пошел в Байду и увидел код (код был в конце). После нескольких поворотов я наконец -то успешно побежал и немного забил.
Во -первых, давайте кратко поговорим о шагах:
1. Код сцены загрузки Baidu
2. Установите ADB
3. Найдите телефон для подключения к компьютеру с помощью режима отладки USB
4. Начать мини -программу WeChat
5. Запустите код в Eclipse (здесь нам нужно постоянно отлаживать и изменять параметры в соответствии с размером экрана мобильного телефона)
Результатом является то, что ваш экран телефона автоматически нажимает и позволит шахматной части прыгать.
Давайте поговорим о вопросе:
1. Установите набор задач ADB:
Скачать адрес инструмента ADB
В диспетчере устройств здесь, если он не установлен на других устройствах, ADB является восклицательным знаком. После установки, как показано на рисунке, появится устройство Android Line.
Если вы установите его, щелкните правой кнопкой мыши в столбце ADB, чтобы выбрать свойства, и появится следующий интерфейс, нажмите «Обновить драйвер», выберите «Просмотр компьютера» и выберите программы (то есть вторая опция). В настоящее время появится параметр «Просмотр драйверов» на компьютере, выберите местоположение пакета установки, а затем все будет выпущено для установки.
Вопрос:
После установки вы можете использовать ADB под командным окном CMD, но запуск кода в Eclipse вообще не имеет никакого эффекта (программа не сообщает об ошибке, и на телефоне нет снимков экрана), а затем консоль Eclipse показывает, что изображение не существует.
В настоящее время вам нужно скопировать две библиотеки динамических ссылок DLL, которые вы установили в следующие два каталога: (если вы не можете их найти, поиск глобально на дискоте C)
adb.exe
Adbwinapi.dll
Adbwinusbapi.dll
C:/Windows/System32
C:/windows/syswow64
В настоящее время он должен быть размещен под Syswow64. Я win7 64 бит, так что есть этот каталог (другие люди в Интернете говорят, что Win32 не нуждается в этом, я не пробовал).
Если каталог Syswow64 не размещен, операция Eclipse по -прежнему не имеет никакого эффекта в настоящее время: но если вы запустите экрану Shell Shell -P -P /SDCARD/Tencent/customerpic/current.png в CMD, вы обнаружите, что в телефоне будет изображена изображение.
Я обнаружил, что использовал CD для System32 и в рамках каталога установки (C:/Program Files (x86)/Thunder Network/Thunder/Program), я успешно запустил вышеуказанную команду в программе и сообщил об ошибке в System32:
----------------------------------------------------------------------------------------------------------------------------
Эта программа не может быть запущена, потому что adbwinapi.dll отсутствует на компьютере. Попробуйте переустановить программу, чтобы решить эту проблему.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
Конечно
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
Хорошо, это означает, что ADB в System32 не может найти динамическую ссылку Adbwinapi.dll, но очевидно, что случайно я увидел каталог syswow64, а затем, что означает этот каталог и что это значит? ОК, скопируйте три файла, скопированные в каталог System32, а затем скопируйте их в этот каталог syswow64, и сделайте это.
Вопрос 2: Устройство в автономном режиме
Запуск оболочки ADB в окне команд CMD привел к тому, что устройство ошибки в автономном режиме. Я думал, что что -то не так с моей установкой ADB. У меня было много Байду. Я попробовал ADB Kill Server, ADB Remount и другие команды, но я обнаружил, что код был /sdcard /. Я видел, что это должна быть внешняя SD -карта. Путь неправильный? (Я использовал Vivo X9, и у этого телефона нет внешней опции SD -карты). После перехода на более старый телефон (Vivo Y27) я могу запустить оболочку ADB, но /SDCARD - это не внешний путь SD -карты, а путь к дискому телефону.
Это означает, что это не должно быть проблемой пути кода. Мне сказали, что инструмент ADB слишком стар, а версия ADB имеет версию 1.0.26. Ну, мне лень найти новую версию ADB. Я отлаживал его со старым Vivo Y27, и его можно вспыхнуть.
Позвольте мне перечислить то, что я узнал:
1. Я знаю, что есть АБР, и я также знаю, что использование оболочки ADB может получить сеанс Bash телефона. Вы можете сделать снимки экрана, и использование ADB Pull может получить файлы с телефона. Если на официальном сайте есть больше команд, я не могу вспомнить это, даже если я читаю слишком много.
2. Знайте, что Java использует runtime.getRuntime (). Exec () в исходном коде для вызова системных команд в Windows:
process = runtime.getRuntime (). Exec (Command); System.out.println ("Команда Exec Command start:" + Command); process.waitfor (); Process.getInputStream (); BufferedReader BufferedReader = New BufferedReader (New InputStreamReader (Process.GetErrorStream ())); String Line = BufferedReader.Readline (); 3. Понять, что в коде проанализируйте изображение, вычисляя значение цвета RGB на снимке экрана и т. Д., int pixel = bufferedimage.getrgb (x, y);
Все коды:
пакет com.lw.test; Импорт java.awt.image.bufferedImage; Импорт java.io.bufferedReader; Импорт java.io.file; импортировать java.io.ioexception; Импорт java.io.inputStreamReader; импортировать java.util.arrays; импортировать java.util.concurrent.timeUnit; Импорт javax.imageio.imageio; /** * Ссылка на Zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "enfully" target = "_blank" Public Class JumpJumphelper {Private Static Final String Image_Name = "current.png"; Private Static Final String Store_dir = "D:/Jump_screencapture"; // Количество частного статического окончательного окончания ImageLengthLength = 5; // размер изображения частная статическая окончательная длинная длинный [] Imagelength = new Long [ImageLengthLength]; Частный финальный rgbinfo rgbinfo = new rgbinfo (); Private Final String Path = "/sdcard/tencent/customerpic/"; Приватная конечная строка [] adb_screen_capture_cmds = {"adb Shell Screencap -p"+path+image_name, "adb pull"+path+"current.png"+store_dir}; // Координата Y В нижней части области отображения игрового счета на снимке экрана, 300 - это значение 1920x1080. Модифицировать частный финал int gamescorebottomy = 300 в соответствии с фактической ситуацией; // коэффициент времени пресса может быть соответствующим образом скорректирован в соответствии с конкретной ситуацией; Приватный окончательный двойной presstimecoeffiet = 2,05; // Координата начальной точки прессы также является координатой отправной точки следующей игры Private Final Final Int Swipex = 280; Частный финал int swipey = 600; // Высота основания шахматной части является частным финальным int HalfbaseboardHeight = 20; // Ширина шахматного элемента сделана с скриншота и отрегулируйте частный конечный int int halmabodywidth = 74; // Средние координаты двух пружин на игровом скриншоте в основном используются для расчета угла. Доля XY может быть рассчитана на основе фактического скриншота. Частный финальный int boardx1 = 813; Частный финальный int boary1 = 1122; Частный финальный int boardx2 = 310; Частный финальный int boary2 = 813; / ** * Получить шашки и центральные координаты следующего расплывчатого доска * * @return * @author leeho * @throws ioexception * @update 31 декабря 2017 года в 12:18:22 вечера */ private int [] Gethalmaandboardxyvalue (File CurrentImage) ThrrowSception {BuffereMage BufferedImage = Image.Read (CurrentImage); int width = bufferedimage.getwidth (); int height = bufferedimage.getheight (); System.out.println ("width:" + width + ", высота:" + высота); int halmaxsum = 0; int halmaxcount = 0; int halmaymax = 0; int boardx = 0; int boardy = 0; // Передача точек пикселей с скриншота сверху вниз и используйте цвет шахматного куска в качестве основы для распознавания позиции. Наконец, среднее значение всех пикселей на самом низком ряду цвета шахмата вывозится, то есть рассчитайте координаты шахматного куска для (int y = gamescorebottomy; y <высота; y ++) {для (int x = 0; x <width; x ++) {processrgbinfo (bufferemage, x, y); int rvalue = this.rgbinfo.getrvalue (); int gvalue = this.rgbinfo.getgvalue (); int bvalue = this.rgbinfo.getbvalue (); // Определите положение шахматного элемента в соответствии с цветом RGB, if (rvalue> 50 && rvalue <60 && gvalue> 53 && gvalue <63 && bvalue> 95 && bvalue <110) {halmaxsum += x; halmaxcount ++; // y координата значения нижнего ряда шахматной части halmaymax = y> halmaymax? y: halmaymax; }}} if (halmaxsum! = 0 && halmaxcount! = 0) {// x Значение координаты нижнего ряда шахматной части int halmax = halmaxsum /halmaxcount; // переместить половину шахмата шасси высота вверх int halmay = halmaymax - HalfbaseboardHeight; // начинать с GameCoreBottomy для (int y = gamescorebottomy; y <высота; y ++) {processrgbinfo (BufferedImage, 0, y); int lastpixelr = this.rgbinfo.getrvalue (); int lastpixelg = this.rgbinfo.getgvalue (); int lastpixelb = this.rgbinfo.getbvalue (); // до тех пор, пока рассчитанное значение BADX больше 0, это означает, что центральная координата X Значение следующего расплывчатого доска была получена. if (boardx> 0) {break; } int boardxsum = 0; int boardxcount = 0; for (int x = 0; x <width; x ++) {processrgbinfo (BufferedImage, x, y); int pixelr = this.rgbinfo.getrvalue (); int pixelg = this.rgbinfo.getgvalue (); int pixelb = this.rgbinfo.getbvalue (); // Обучение случая, где голова шахматного куска выше, чем следующая трамплина, если (math.abs (x - halmax) <halmabodywidth) {продолжить; } // Сканирование сверху вниз до положения вершины следующего трамплина. Следующая трамплина может быть кружком или коробкой. Возьмите несколько очков и найдите среднее if ((math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastpixelg) + math.abs (pixelb - lastpixelb))> 10) {boardxsum + = x; boardxcount ++; }} if (boardxsum> 0) {boardx = boardxsum / boardxcount; }} // С фактического угла найдите координаты близко к центру следующей платы. Boardy = (int) (halmay - math.abs (boardx - halmax) * math.abs (boary1 - boary2) / math.abs (boardx1 - boardx2)); if (boardx> 0 && boardy> 0) {int [] result = new int [4]; // результат координаты x [0] = halmax; // результат координаты Y [1] = halmay; // результат координаты x [2] = boardx; // Результат координаты Y [3] = Boardy; результат возврата; }} return null; } / ** * Выполнить команду * * @param Command * @author Leeho * @update 31 декабря 2017 года в 12:13:39 * / private void executeCommand (строка команда) {Process Process = null; try {process = runtime.getRuntime (). Exec (command); System.out.println ("Команда Exec Command start:" + Command); process.waitfor (); Process.getInputStream (); BufferedReader BufferedReader = New BufferedReader (New InputStreamReader (Process.GetErrorStream ())); String Line = BufferedReader.Readline (); if (line! = null) {System.out.println (line); } bufferedReader = new BufferedReader (новый inputStreamReader (process.getInputStream ())); String Line02 = BufferedReader.Readline (); if (line02! = null) {System.out.println (line02); } System.out.println ("Exec Exec Command:" + Command); } catch (Exception e) {e.printstackTrace (); } наконец {if (process! = null) {process.destroy (); }}} / ** * ADB Получает экран -снимки Android * * @author Leeho * @Update 31 декабря 2017 г. 12:11:42 PM * / private void executeAdbcaptureCommands () {for (строка команда: adb_screen_capture_cmds) {executiveCommand (команда); }} / ** * Jump * * @param Distance * @author Leeho * @update 31 декабря 2017 г. в 12:23:19 * / private void dojump (двойное расстояние) {System.out.println ("Distance:" + Distance); // Рассчитайте время нажатия, минимум 200 мс int presstime = (int) math.max (расстояние * presstimecoeffiet, 200); System.out.println ("presstime:" + presstime); // Выполнить операцию нажатия string string = string.format ("Входная оболочка ADB Swipe %s %s %s %s %s", Swipex, Swipey, Swipex, Swipey, Presstime); System.out.println (command); executeCommand (команда); } / ** * Еще одна игра * * @Author Leeho * @Update 31 декабря 2017 г. в 12:47:06 * / private void ReplayGame () {String command = string.format ("Ввод оболочки ADB Tap %s %s", swipex, swipey); executeCommand (команда); } /** * Calculate the distance of the jump, that is, the distance between two points* * @param halmaX * @param halmaY * @param boardX * @param boardY * @return * @author LeeHo * @update December 31, 2017 at 12:27:30 pm */ private double computeJumpDistance(int halmaX, int halmaY, int boardX, int boardY) { return Math.sqrt (math.pow (math.abs (boardx - halmax), 2) + math.pow (math.abs (boardy - halmay), 2)); } public static void main (string [] args) {JumpJumphelper JumpJumphelper = new JumpJumphelper (); // string command = "ADB Shell Screencap -p" + jumpjumphelper.path + image_name; //// command = "ADB устройства"; // Jumpjumphelper.executecommand (command); // // if (true) {return;} try {file storeDir = new File (store_dir); if (! storedir.exists ()) {boolean flag = storedir.mkdir (); if (! flag) {System.err.println ("Создание каталога хранения изображений не удалось"); возвращаться; }} // Номер выполнения int executeCount = 0; for (;;) {// выполнить команду ADB, чтобы получить экранный скриншот android jumpjumphelper.executeadbcapturecommands (); File CurrentImage = новый файл (store_dir, image_name); if (! currentImage.exists ()) {System.out.println («Изображение не существует»); продолжать; } long Length = currentImage.length (); ImageLength [executeCount % ImageLengthLength] = длина; // Проверьте, нужно ли вам повторно запустить jumpjumphelper.checkdoreplay (); executeCount ++; System.out.println ("currentth" + executeCount + "execution!"); // Получить центральные координаты шашек и базовую плиту int [] result = jumpjumphelper.gethalmaandboardxyvalue (currentImage); if (result == null) {System.out.println («Результат метода gethalmaandboardxyvalue - это null!»); продолжать; } int halmax = result [0]; int halmay = результат [1]; int boardx = результат [2]; int boardy = результат [3]; System.out.println ("halmax:" + halmax + ", halmay:" + halmay + ", boardx:" + boardx + ", boary:" + boary); // Рассчитайте расстояние от прыжка двойного прыжка = jumpjumphelper.computejumpdistance (Halmax, Halmay, Boardx, Boardy); Jumpjumphelper.dojump (Jumpdistance); // оставаться на 2,5 секунды каждый раз, время withUnit.milliseconds.sleep (2500); }} catch (Exception e) {e.printstackTrace (); }} / ** * Проверьте, нужно ли вам перезапустить * * @author leho * @update 31 декабря 2017 г. 1:39:18 PM * / private void checkDorePlay () {if (ImageLength [0]> 0 && ImageLength [0] == ImageLength [1] && imageLength [1] == ImageLength [2] && imagel длину [1] и ImageLength [1] == ImageLength [2] = ImageLength [3] == ImageLength [4]) {// Это означает, что размер изображения был таким же в течение 5 раз подряд. Вы можете знать, что текущий экран находится в другом раунде массивов. // Моделируйте и нажмите кнопку, чтобы запустить игру снова ReplayGame (); }} / ** * Получите значение RGB указанных координат * * @param bufferedimage * @param x * @param y * @@author leho * @update 2017-02-31 12:12:43 PM * / private void processrgbinfo (BufferedImage BufferedImage, int x, int y) {this.rgbinfo; int pixel = bufferedimage.getrgb (x, y); // преобразовать в RGB Digit this.rgbinfo.setrvalue ((Pixel & 0xff0000) >> 16); this.rgbinfo.setgvalue ((Pixel & 0xff000) >> 8); this.rgbinfo.setbvalue ((Pixel & 0xff)); } class rgbinfo {private int rvalue; частный int gvalue; Частный int bvalue; public int getrvalue () {return rvalue; } public void setrvalue (int rvalue) {rvalue = rvalue; } public int getGvalue () {return gvalue; } public void setGvalue (int gvalue) {gvalue = gvalue; } public int getBvalue () {return bvalue; } public void setBvalue (int bvalue) {bvalue = bvalue; } public void reset () {this.rvalue = 0; this.gvalue = 0; this.bvalue = 0; }}}Конечно, результаты будут очищены через некоторое время, но, как программист, все еще хорошо. Из первоначальной уязвимости представления после компьютера было предложено взять пакеты и изменить данные в качестве агента. Теперь код имитирует клики (хотя он не вступит в силу.)
Для получения дополнительного контента вы можете обратиться к специальной теме «прыжок на WeChat», чтобы узнать.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.