El código específico de implementación de Java asistido por WeChat Jump es para su referencia. El contenido específico es el siguiente
1. Consulte Zhihu para enseñarle cómo usar Python para jugar a WeChat. Dado que siempre he sido una pitón a medias, planeaba usar Python para anotar puntos antes, pero no tenía más remedio que instalar el entorno de Python y faltaban varios módulos e informaron errores. Así que lo volví a implementar usando Java.
2. Configuración del entorno e instrucciones relacionadas:
1) Sistema de Windows, soy Win10
2) Instale el entorno AVA, JDK7 o superior
3) Un teléfono Android, un cable de datos
4) Instale el controlador ADB para la computadora, conecte al teléfono Android y active el modo de depuración USB al mismo tiempo
5) Abra el juego de salto del programa WeChat Mini, el programa Java comienza a funcionar y lea el código específico a continuación
6) Uso el teléfono Android Meilan Note2, con una resolución de pantalla de 1920x1080. Los diferentes modelos de teléfonos móviles pueden necesitar ajustar los parámetros relevantes. Consulte los comentarios del código para obtener más detalles.
7) Se agregó la función de reiniciar automáticamente el juego después de no obtener puntos de puntuación
8) Es solo entretenimiento, no seas serio. Se dice que el funcionario de WeChat le ha prestado atención. Si el puntaje es demasiado alto, puede limpiarse. Ja ja
3. Sin más ADO, agregue el código:
paquete com.yihusitian.gamehelper; import java.awt.image.bufferedImage; import java.io.bufferedReader; import java.io.file; import java.io.ioException; import java.io.inputstreamreader; importar java.util.arrays; import java.util.concurrent.timeunit; import javax.imageio.imageio; /** * referencia zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "externo nofollow" rel = "externo nofollow" asistir * * @author leeho */ public class JumpJumphelper {private static final string image_name = "current.png"; sting de cadena final estática privada_dir = "d:/jump_screencapture"; // cantidad privada estática final int imageLengthlength = 5; // Tamaño del almacenamiento de imagen Private static final long [] imageLength = new Long [imageLengthLength]; RGBINFO final privado rgbinfo = new rgbinfo (); String final privada [] ADB_Screen_Capture_Cmds = {"ADB Shell Screencap -p /SdCard /" + Image_Name, "ADB Pull /sdcard/Current.png" + store_dir}; // La coordenada y en la parte inferior del área de visualización de puntaje del juego en la captura de pantalla, 300 es el valor de 1920x1080. Modifique la final de GamesCorebottomy privada Final = 300 de acuerdo con la situación real; // El coeficiente de tiempo de prensa se puede ajustar adecuadamente de acuerdo con la situación específica; Private Double PressTimecoEfeFient = 1.35; // La coordenada del punto de partida de la prensa también es la coordenada del punto de partida del próximo juego privado final int swipex = 550; Private final int swipey = 1580; // La altura base de la pieza de ajedrez es privada final intalfbaseBoardHeight = 20; // El ancho de la pieza de ajedrez se toma de la captura de pantalla y ajusta la final privada int por ti mismo HalmabodyWidth = 74; // Las coordenadas de punto medio de las dos trampolín en la captura de pantalla del juego se usan principalmente para calcular el ángulo. La proporción de XY se puede calcular en función de la captura de pantalla real. Private Final Int BoardX1 = 813; Privado final int boardy1 = 1122; Private final int boardx2 = 310; Private final int boardy2 = 813; / ** * Obtenga los damas y las coordenadas del centro del próximo trampolín * * @return * @author leeho * @throws ioexception * @Update el 31 de diciembre de 2017 a las 12:18:22 pm */ private int [] gethalmaandboardxyvalue (archivo de actualización) lanza ioexception {bufferedimage bufferedimage = image.read (lectura de corriente); int width = bufferedImage.getWidth (); int hight = bufferedImage.getheight (); System.out.println ("Ancho:" + ancho + ", altura:" + altura); int halmaxsum = 0; int halmaxcount = 0; int halmaymax = 0; int boardx = 0; int broardy = 0; // Transfiere los puntos de píxeles de la captura de pantalla de arriba a abajo, y use el color de la pieza de ajedrez como base para el reconocimiento de posición. Finalmente, se toma el valor promedio de todos los píxeles en la fila más baja del color de la pieza del ajedrez, es decir, calcule las coordenadas de la pieza de ajedrez para (int y = gamescorebottomy; y <altura; y ++) {para (int x = 0; x <width; x ++) {processrgbinfo (bufferedimage, x, y); int rValue = this.rgbinfo.getRValue (); int gValue = this.rgbinfo.getgValue (); int bvalue = this.rgbinfo.getBValue (); // Identificar la posición de la pieza de ajedrez de acuerdo con el color de RGB, if (rValue> 50 && rValue <60 && gvalue> 53 && gValue <63 && bvalue> 95 && bvalue <110) {halmaxsum += x; HalmaxCount ++; // y el valor coordinado de la fila inferior de la pieza de ajedrez halmaymax = y> halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxCount! = 0) {// x Valor de coordenadas de la fila inferior de la pieza de ajedrez int halmax = halmaxsum /halmaxcount; // mover la mitad de la altura del chasis de la pieza de ajedrez hacia arriba int halmay = halmaymax - halfbaseBoardHeight; // Comience desde GamesCorebottomy para (int y = gamescorebottomy; y <altura; y ++) {processrgbinfo (bufferedImage, 0, y); int lastpixelr = this.rgbinfo.getRValue (); int lastpixelg = this.rgbinfo.getgValue (); int lastpixelb = this.rgbinfo.getBValue (); // Mientras el valor de BoardX calculado sea mayor que 0, significa que se ha obtenido el valor X de la coordenada central del próximo trampolín. if (boardx> 0) {break; } int boardxsum = 0; int boardxcount = 0; para (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 (); // Entrena el estuche donde la cabeza de la pieza de ajedrez es más alta que el próximo trampolín if (math.abs (x - halmax) <halmabodywidth) {continuar; } // Escanear de arriba a abajo a la posición del vértice del siguiente trampolín. El próximo trampolín puede ser un círculo o una caja. Tome múltiples puntos y encuentre el promedio if ((math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastpixelg) + math.abs (pixelb - lastpixelb))> 10) {boardxsum + = x; BoardXCount ++; }} if (boardxsum> 0) {boardx = boardxsum / boardxcount; }} // Desde el ángulo real, encuentre las coordenadas cerca del centro de la siguiente placa. Boardy = (int) (halmay - math.abs (boardx - halmax) * math.abs (boardy1 - boardy2) / math.abs (boardx1 - boardx2)); if (boardx> 0 && boardy> 0) {int [] result = new int [4]; // El resultado de la coordenada x [0] = Halmax; // El resultado de la coordenada y [1] = Halmay; // El resultado de la coordenada x [2] = boardx; // El resultado de la coordenada y [3] = boardy; resultado de retorno; }} return null; } / ** * Ejecutar el comando * * @param comando * @author leeho * @Update 31 de diciembre de 2017 a las 12:13:39 pm * / private void ejecutecommand (comando de cadena) {proceso proceso = null; intente {process = runtime.getRunTime (). Exec (comando); System.out.println ("EXEC Command Start:" + comando); process.waitfor (); BufferedReader BufferedReader = new BufferedReader (new InputStreamReader (Process.getErRorStream ())); String line = bufferedReader.readline (); if (line! = null) {system.out.println (línea); } System.out.println ("EXEC Command End:" + comando); } catch (Exception e) {E.PrintStackTrace (); } finalmente {if (proceso! = null) {process.destroy (); }}} / ** * ADB obtiene capturas de pantalla de Android * * @author leeho * @Update 31 de diciembre de 2017 a las 12:11:42 pm * / private void ejecutebcaptureCommands () {for (comando de cadena: adb_screen_capture_cmds) {ejecutecommand); }} / ** * saltar * * @param distancia * @author leeho * @update 31 de diciembre de 2017 a las 12:23:19 pm * / private void dojump (doble distancia) {system.println ("Distancia:" + distancia); // Calcule el tiempo de prensa, mínimo 200 ms int presstime = (int) Math.max (Distancia * PressTimecoEftient, 200); System.out.println ("Presstom:" + Press Hora); // Ejecutar el comando de string de operación de presione = string.format ("ADB Shell Input Swipe %S %S %S %S %S", SwipEx, SwipEy, SwipEx, Swipey, Repress); System.out.println (comando); ejecutecommand (comando); } / ** * Otro juego * * @author leeho * @Update el 31 de diciembre de 2017 a las 12:47:06 pm * / private void replayGame () {String command = String.format ("ADB SHell Entrada Tap %S %S", SwipEx, Swipey); ejecutecommand (comando); } / ** * Calcule la distancia del salto, es decir, la distancia entre dos puntos * * * @param halmax * @param halmay * @param boardx * @param boardy * @return * @author leeho * @update el 31 de diciembre de 2017 a las 12:27:30 pm * / doble computejumpdistance (int halmay, int halmay, introxx, intboaty {introd MATH.SQRT (MATH.POW (MATH.ABS (BOUNDX - HALMAX), 2) + MATH.POW (MATH.ABS (BODARY - 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 ("Crear directorio de almacenamiento de imagen fallido"); devolver; }} JUMTJUMPHELPER JUTPJUMPHELPER = new JumpJumphelper (); // Número de ejecuciones int ejecutecount = 0; para (;;) {// Ejecutar el comando ADB para obtener una captura de pantalla de Android JUMTJUMPHELPER.EXECUTEADBCAPTURECOMMANDS (); Archivo TRENTIMAGE = nuevo archivo (store_dir, image_name); if (! CurrentImage.Exists ()) {System.out.println ("La imagen no existe"); continuar; } larga longitud = currentImage.length (); ImageLength [ExecoCount % imageLengthLength] = longitud; // Verifique si necesita reabrir JUTPJUMPHELPER.CHECKDOREPLAY (); ejecutecount ++; System.out.println ("CurrentThrow" + Executecount + "Ejecución!"); // Obtenga las coordenadas centrales de los damas y la placa base int [] resultado = JumpJumphelper.GethalMaandBoardxyValue (CurrentImage); if (result == null) {system.out.println ("El resultado del método gethalmaandboardxyValue es nulo!"); continuar; } int halmax = resultado [0]; int halmay = resultado [1]; int boardx = resultado [2]; int broardy = resultado [3]; System.out.println ("Halmax:" + Halmax + ", Halmay:" + Halmay + ", BoardX:" + Boardx + ", Boardy:" + Boardy); // Calcule la distancia de Jump Double JumpDistance = JumpJumphelper.ComputeJumpDistance (Halmax, Halmay, BoardX, Boardy); JumpJumphelper.dojump (JumpDistance); // quédate por 2.5 segundos cada vez que TimeUnit.milliseConds.sleep (2500); }} catch (Exception e) {E.PrintStackTrace (); }} / ** * Compruebe si necesita reiniciar * * @author leeho * @update el 31 de diciembre de 2017 1:39:18 pm * / private void checkdorePlay () {if (imageLength [0]> 0 && imageLength [0] == imageLength [1] & imageLength [1] == ImageLength [2] && imagel longitud imageLength [2] imageLength [3] && imageLength [3] == imageLength [4]) {// Esto significa que el tamaño de la imagen ha sido el mismo durante 5 veces consecutivas. Puedes saber que la pantalla actual está en otro juego de juegos. // simular y hacer clic en el botón para iniciar el juego ReplayGame (); }} / ** * Obtenga el valor RGB de las coordenadas especificadas * * @param bufferedImage * @param x * @param y * @author leeho * @update el 31 de diciembre de 2017 a las 12:12:43 pm * / private void processrgbinfo (bufferedimage bufferedimage, int x, int y) {this. int pixel = bufferedImage.getRgb (x, y); // Convertir al número RGB this.rgbinfo.setRValue ((píxel y 0xff0000) >> 16); this.rgbinfo.setgValue ((píxel y 0xff00) >> 8); this.rgbinfo.setBValue ((Pixel & 0xff)); } clase rgbinfo {private int rValue; privado int gvalue; private 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; }}}Para obtener más contenido, puede consultar el tema especial "Jump on WeChat" para aprender.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.