Конкретный код реализации Java, которым помогает WeChat Jump, предназначен для вашей ссылки. Конкретный контент заключается в следующем
1. См. Чжиху, чтобы научить вас использовать Python для игры WeChat. Учитывая, что я всегда был наполовину выпеченным питоном, я планировал использовать Python, чтобы набрать очки раньше, но у меня не было выбора, кроме как установить среду Python, и различные модули отсутствовали и сообщали об ошибках. Поэтому я повторно внедрил его, используя Java.
2. Конфигурация среды и связанные с ними инструкции:
1) Система Windows, я win10
2) Установить среду AVA, JDK7 или выше
3) Один телефон Android, один кабель данных
4) Установите драйвер ADB для компьютера, подключитесь к телефону Android и одновременно включите режим отладки USB
5) Откройте игру WeChat Mini Program.
6) Я использую Meilan Note Android Phone с разрешением экрана 1920x1080. Различным моделям мобильных телефонов может потребоваться настраивать соответствующие параметры. Пожалуйста, обратитесь к комментариям кода для получения подробной информации.
7) Добавлено функцию автоматического перезапуска игры после невыполнения очков
8) Это просто развлечение, не будь серьезным. Говорят, что чиновник WeChat обратил на это внимание. Если счет слишком высок, он может быть очищен. Хаха
3. Без лишних слов, пожалуйста, добавьте код:
пакет com.yihusitian.gamehelper; Импорт 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; /**. @Author Leeho */ 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 (); Приватная конечная строка [] adb_screen_capture_cmds = {"adb Shell Screencap -p /Sdcard /" + image_name, "adb pull /sdcard/current.png" + store_dir}; // Координата Y В нижней части области отображения игрового счета на снимке экрана, 300 - это значение 1920x1080. Модифицировать частный финал int gamescorebottomy = 300 в соответствии с фактической ситуацией; // коэффициент времени пресса может быть соответствующим образом скорректирован в соответствии с конкретной ситуацией; Приватный окончательный двойной presstimecoeffiet = 1,35; // Координата начальной точки прессы также является координатой отправной точки следующей игры Private Final Final Int Swipex = 550; Частный финал int swipey = 1580; // базовая высота шахматной части является частным финальным int полубазерасовой клеткой = 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 (); BufferedReader BufferedReader = New BufferedReader (New InputStreamReader (Process.GetErrorStream ())); String Line = BufferedReader.Readline (); if (line! = null) {System.out.println (line); } 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 * / private void executeAdbcaptureCommands () {for (строка команда: adb_screen_capture_cmds) {executeCommand (команда); }} / ** * 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) {try {file storeDir = new File (store_dir); if (! storedir.exists ()) {boolean flag = storedir.mkdir (); if (! flag) {System.err.println ("Создание каталога хранения изображений не удалось"); возвращаться; }} JumpJumphelper JumpJumphelper = new JumpJumphelper (); // количество выполнения 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 ("currentThrow" + recementecount + "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 [2] ImageLength [3] && ImageLength [3] == ImageLength [4]) {// Это означает, что размер изображения был одинаковым в течение 5 последовательных времен. Вы можете знать, что текущий экран находится в других игровых массивах. // Моделируйте и нажмите кнопку, чтобы запустить игру ReplayGame (); }} / ** * Получите значение RGB указанных координат * * @param bufferedimage * @param x * @param y * @author leeho * @update 31 декабря 2017 в 12:12:43 PM * / private void processrgbinfo (BufferedImage BufferedImage, int x, int y) {this. int pixel = bufferedimage.getrgb (x, y); // конвертировать в номер RGB this.rgbinfo.setrvalue ((Pixel & 0xff0000) >> 16); this.rgbinfo.setgvalue ((Pixel & 0xff00) >> 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 больше.