O código de implementação Java específico assistido pelo WeChat Jump é para sua referência. O conteúdo específico é o seguinte
1. Consulte Zhihu para ensiná -lo a usar o Python para interpretar o WeChat. Dado que sempre fui um python meio cozido, planejei usar o Python para marcar pontos antes, mas não tinha escolha a não ser instalar o ambiente Python e vários módulos estavam ausentes e relataram erros. Então, eu o reimplei usando Java.
2. Configuração do ambiente e instruções relacionadas:
1) Sistema do Windows, eu sou Win10
2) Instale o ambiente AVA, JDK7 ou acima
3) Um telefone Android, um cabo de dados
4) Instale o driver ADB para o computador, conecte -se ao telefone Android e ligue o modo de depuração USB ao mesmo tempo
5) Abra o jogo de salto do WeChat Mini Program, o programa Java começa a ser executado e leia o código específico abaixo
6) Eu uso o telefone Android Meilan Note2, com uma resolução de tela de 1920x1080. Diferentes modelos de telefones celulares podem precisar ajustar os parâmetros relevantes. Consulte os comentários do código para obter detalhes.
7) Adicionado a função de reiniciar automaticamente o jogo depois de não conseguir marcar pontos
8) É apenas entretenimento, não seja sério. Dizem que o funcionário do WeChat prestou atenção a ele. Se a pontuação estiver muito alta, poderá ser liberada. Haha
3. Sem mais delongas, adicione o código:
pacote com.yihusitian.gamehelper; importar java.awt.image.bufferiMage; importar java.io.bufferedReader; importar java.io.file; importar java.io.ioException; importar java.io.inputStreamReader; importar java.util.arrays; importar java.util.Concurrent.TimeUnit; importar javax.imageio.imageio; /** * Referência zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "Nofollow" Rel = "Nofollow" Target = "_blank"> https://zhuanlan.zold " Assist * * @author leeho */ public class Jumpjumphelper {private static final string image_name = "current.png"; Final String estático privado string store_dir = "d:/jump_screencapture"; // Quantidade private estática final int imageLengthLength = 5; // tamanho da imagem de armazenamento de imagem private estático final [] imageLength = novo longo [imageLengthLength]; private final rgbinfo rgbinfo = new rgbinfo (); String final privada [] adb_screen_capture_cmds = {"adb shell screencap -p /sdcard /" + image_name, "adb pull /sdcard/current.png" + store_dir}; // A coordenada Y na parte inferior da área de exibição de pontuação do jogo na captura de tela, 300 é o valor de 1920x1080. Modificar o private final int gamecoreBottomy = 300 de acordo com a situação real; // O coeficiente de tempo de imprensa pode ser ajustado adequadamente de acordo com a situação específica; Pressão duplo final privado PresstimeCoe eficiente = 1,35; // A coordenada do ponto de partida da imprensa também é a coordenada do ponto de partida do próximo jogo, private Int Swipex = 550; Final privado Int Swipey = 1580; // A altura base da peça de xadrez é privada Int HalfBaseboardHeight = 20; // A largura da peça de xadrez é retirada da captura de tela e ajusta o final privado INT por si mesmo HalmabodyWidth = 74; // As coordenadas do ponto médio dos dois trampolins na captura de tela do jogo são usados principalmente para calcular o ângulo. A proporção de XY pode ser calculada com base na captura de tela real. Private final int boardx1 = 813; private final int boardy1 = 1122; private final int boardx2 = 310; private final int boardy2 = 813; / ** * Obtenha as damas e as coordenadas centrais do próximo trampolim * * @return * @author leeho * @throws ioexception * @Update 31 de dezembro de 2017 às 12:18:22 PM */ private int [] gethalmaandboardboardxyValue (FILEGRUNIMAGE) ThreliExeCception {] int width = bufferiMage.getWidth (); int height = bufferiMage.getHeight (); System.out.println ("Width:" + Width + ", altura:" + altura); int halmaxsum = 0; int halmaxCount = 0; int halmaymax = 0; int boardx = 0; int boardy = 0; // Transfira os pontos de pixel da captura de tela de cima para baixo e use a cor da peça de xadrez como base para o reconhecimento de posição. Finalmente, o valor médio de todos os pixels na linha mais baixa da cor da peça de xadrez é retirado, ou seja, calcule as coordenadas da peça de xadrez para (int y = gamecoreBottomy; y <altura; y ++) {para (int x = 0; x <width; x ++) {processrgbinfo (tampão, x, x, y); int rvalue = this.rgbinfo.getRvalue (); int gvalue = this.rgbinfo.getgValue (); int bvalue = this.rgbinfo.getbValue (); // Identifique a posição da peça de xadrez de acordo com a cor do rgb, if (rvalue> 50 && rvalue <60 && gvalue> 53 && gvalue <63 && bvalue> 95 && bvalue <110) {halmaxsum += x; halmaxCount ++; // Valor de coordenada y da linha inferior da peça de xadrez halmaymax = y> halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxCount! = 0) {// x Valor de coordenadas da linha inferior da peça de xadrez int halmax = halmaxsum /halmaxCount; // mova metade do chassi de xadrez altura do chassi para cima int halmay = halmaymax - HalfBaseboardHeight; // Comece a partir do gamecoreBottomy for (int y = gamecoreBottomy; y <altura; y ++) {processrgbinfo (bufferingImage, 0, y); int lastpixelr = this.rgbinfo.getRvalue (); int lastpixelg = this.rgbinfo.getgValue (); int lastpixelb = this.rgbinfo.getbValue (); // Desde que o valor calculado do Boardx seja maior que 0, significa que o valor X de coordenada central do próximo trampolim foi obtido. if (boardx> 0) {break; } int boardxSum = 0; int boardxCount = 0; for (int x = 0; x <largura; x ++) {processrgbinfo (bufferImage, x, y); int pixelr = this.rgbinfo.getRvalue (); int pixelg = this.rgbinfo.getgValue (); int pixelb = this.rgbinfo.getbValue (); // Treine o caso em que a cabeça da peça de xadrez é maior que o próximo trampolim se (Math.abs (x - halmax) <halmabodywidth) {continua; } // Digitalizar de cima para baixo para a posição do vértice do próximo trampolim. O próximo trampolim pode ser um círculo ou uma caixa. Pegue vários pontos e encontre a média se ((math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastpixelg) + math.abs (pixelb - lastpixelb))> 10) {BoardxSum + = x; BoardxCount ++; }} if (BoardxSum> 0) {Boardx = Boardxsum / BoardxCount; }} // No ângulo real, encontre as coordenadas próximas ao centro da próxima placa. Boardy = (int) (Halmay - Math.abs (Boardx - Halmax) * Math.abs (Boardy1 - Boardy2) / Math.abs (Boardx1 - Boardx2)); if (boardx> 0 && boardy> 0) {int [] resultado = new int [4]; // o resultado da coordenada x [0] = halmax; // o resultado de coordenada y [1] = halmay; // o resultado da coordenada x [2] = Boardx; // o resultado de coordenada y [3] = boardy; resultado de retorno; }} retornar nulo; } / ** * Execute o comando * * @param comando * @author leeho * @update 31 de dezembro de 2017 às 12:13:39 * / private void executEcommand (string comando) {process Process = null; tente {process = runtime.getRuntime (). Exec (comando); System.out.println ("Comando EXEC Start:" + Command); process.waitfor (); BufferReader buffaredReader = new BufferredReader (new InputStreamReader (process.getErrorStream ())); Linha de string = bufferredreader.readline (); if (line! = null) {System.out.println (linha); } System.out.println ("EXEC Comando End:" + Command); } catch (Exceção e) {e.printStackTrace (); } finalmente {if (process! = null) {process.Destroy (); }}} / ** * adb recebe screenShots do Android * * @Author Leeho * @Update 31 de dezembro de 2017 às 12:11:42 * / private void ExecutEadBCaptureCommands () {para (comando (string: adb_screen_capture_cmds) {executecommand (); }} / ** * Jump * * @param Distância * @author leeho * @update 31 de dezembro de 2017 às 12:23:19 * / private void Dojump (distância dupla) {System.out.println ("distância:" + distância); // Calcule o tempo de imprensa, mínimo 200ms int PressTime = (int) Math.max (Distance * PresstimeCoe eficiente, 200); System.out.println ("PressTime:" + PressTime); // Execute o comando da Operação da Operação Pressione = String.format ("Swipe de entrada do shell adb %S %S %S %S %S", Swipex, Swipey, Swipex, Swipey, Presstime); System.out.println (comando); executEcommand (comando); } / ** * Outro jogo * * @Author Leeho * @Update 31 de dezembro de 2017 às 12:47:06 * / private void replaygame () {string command = string.format ("adb shell entrada tap %s %s", swipex, swipey); executEcommand (comando); } / ** * Calcule a distância do salto, isto é, a distância entre dois pontos * * @param halmax * @param halmay * @param boardx * @param boardy * @return * @author leeho * @update 31 de dezembro de 2017 às 12:27:30 * / privado computJumpDax (INTRESTANTE (INTSTATEM INTROMAX (INTROUMAT), INTSTATATE (INTSTATEM INTROMENT), INTSTATAX (INTROPDATE, 31 de dezembro de 2017 às 12:27:30 Pm Math.Sqrt (Math.pow (Math.abs (Boardx - Halmax), 2) + Math.pow (Math.abs (Boardy - Halmay), 2)); } public static void main (string [] args) {try {arquivo storedir = new File (store_dir); if (! storedir.exists ()) {sinalizador booleano = stororedir.mkdir (); if (! flag) {System.err.println ("Criar falha no diretório de armazenamento de imagem"); retornar; }} Jumpjumphelper jumpjumphelper = new jumpjumphelper (); // número de execuções int executEcount = 0; para (;;) {// Execute o comando adb para obter o Android ScreenShot jumpjumphelper.executEdBCaptureCommands (); Arquivo currentImage = novo arquivo (store_dir, image_name); if (! currentImage.exists ()) {System.out.println ("A imagem não existe"); continuar; } comprimento longo = currentImage.Length (); imageLength [executEcount % imageLengthLength] = comprimento; // Verifique se você precisa reabrir o jumpjumphelper.checkDoreplay (); executEcount ++; System.out.println ("CurrentHrow" + ExecutEcount + "Execução!"); // Obtenha as coordenadas centrais de damas e placa de base int [] resultado = jumpjumphelper.gethalmaandboardxyValue (currentImage); if (resultado == null) {System.out.println ("O resultado do método gethalmaandboardxyValue é nulo!"); continuar; } int halmax = resultado [0]; int halmay = resultado [1]; int boardx = resultado [2]; int boardy = resultado [3]; System.out.println ("halmax:" + halmax + ", halmay:" + halmay + ", boardx:" + boardx + ", boardy:" + boardy); // calcule a distância da sala de salto duplo de salto = jumpjumphelper.computeJumpDistance (Halmax, Halmay, Boardx, Boardy); jumjumphelper.dojump (Jumpdistance); // Fique por 2,5 segundos a cada tempo }} catch (Exceção e) {e.printStackTrace (); }} / ** * Verifique se você precisa reiniciar * * @Author Leeho * @Update 31 de dezembro de 2017 13:39:18 * / private void checkDoreplay () {if (imageLength [0]> 0 && imageLength [0] == ImageLength [1] &&Engthngth [] [1] [1] [ImagElngthengthengthdengthdend fundo fundod fundod fundod fundo fundod fundo fundo fundo fundo fundo fundo fundo fundo fundo fundo fundo fundo fundo fundo fundo fundo do fundo fundo fundo fundo do fundo fundo fundo fundo conte fundo fundo fundo fundo fundo fundo fundo do fundo do fundo fundo fundo fundo do fundo fundo do fundo fundo fundo do documento local do local no local no local ao dividir um momento do momento do objetivo do estar mais do que o número de sinais de retenia. imageLength [2] imageLength [3] && imageLength [3] == imageLength [4]) {// Isso significa que o tamanho da imagem tem sido o mesmo há 5 vezes. Você pode saber que a tela atual está em outra matriz de jogo.Fill (imageLength, 0); // simular e clique no botão para iniciar o jogo reproduza (); }} / ** * Obtenha o valor RGB das coordenadas especificadas * * @param bufferImage * @param x * @param y * @author leeho * @update 31 de dezembro de 2017 às 12:12:43 * / private processrgrginfo (bufferImate bufferedimage, int x, Int y); int pixel = bufferImage.getRgb (x, y); // converte em número rgb this.rgbinfo.setrValue ((Pixel & 0xff0000) >> 16); this.rgbinfo.setGValue ((Pixel & 0xff00) >> 8); this.rgbinfo.setBValue ((Pixel & 0XFF)); } classe rgbinfo {private int rvalue; private 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 mais conteúdo, você pode consultar o tópico especial "Jump On WeChat" para aprender.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.