Le code d'implémentation Java spécifique assisté par WeChat Jump concerne votre référence. Le contenu spécifique est le suivant
1. Reportez-vous à Zhihu pour vous apprendre à utiliser Python pour jouer à WeChat. Étant donné que j'ai toujours été un python à moitié cuit, j'ai prévu d'utiliser Python pour marquer des points auparavant, mais je n'avais pas d'autre choix que d'installer l'environnement Python et divers modules manquaient et ont été signalés. Je l'ai donc réimplémenté en utilisant Java.
2. Configuration de l'environnement et instructions connexes:
1) Système Windows, je suis Win10
2) Installer AVA Environment, JDK7 ou supérieur
3) un téléphone Android, un câble de données
4) Installez le pilote ADB pour l'ordinateur, connectez-vous au téléphone Android et activez le mode de débogage USB en même temps
5) Ouvrez le jeu de saut du programme WeChat Mini, le programme Java commence à fonctionner et lisez le code spécifique ci-dessous
6) J'utilise le téléphone Android Meilan Note2, avec une résolution d'écran de 1920x1080. Différents modèles de téléphones mobiles peuvent avoir besoin d'ajuster les paramètres pertinents. Veuillez vous référer aux commentaires du code pour plus de détails.
7) Ajout de la fonction de redémarrer automatiquement le jeu après avoir échoué à marquer des points
8) C'est juste du divertissement, ne soyez pas sérieux. On dit que le responsable de WeChat y a prêté attention. Si le score est trop élevé, il peut être éliminé. Haha
3. Sans plus tarder, veuillez ajouter le code:
Package Com.yihusitian.gamehelper; Importer java.awt.image.bufferedImage; Importer java.io.bufferedReader; Importer java.io.file; Importer java.io.ioException; Importer java.io.inputStreamReader; import java.util.arrays; Importer java.util.concurrent.TimeUnit; import javax.imageio.imageio; / ** * Référence zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "external nofollow" rel = "external nofollow" target = "_blank"> htttps://zhuanlan.zhuhu.com/p/32452473 </a> * * saut Assist * * @author Leeho * / public class JumpJumpHelper {private static final String image_name = "current.png"; String final statique privé store_dir = "D: / JUMP_SCREENCAPTURE"; // Quantité privée statique finale finale INMELLOGHTLENGHT = 5; // Taille du stockage d'image Private Static Final Long [] ImageLength = new Long [ImageLengthLength]; Final privé rgbinfo rgbinfo = new rgbinfo (); String final privé [] adb_screen_capture_cmds = {"ADB Shell Screencap -p / sdcard /" + image_name, "adb pull /sdcard/current.png" + store_dir}; // La coordonnée Y au bas de la zone d'affichage du score du jeu dans la capture d'écran, 300 est la valeur de 1920x1080. Modifier private final int gamescorebottomy = 300 selon la situation réelle; // Le coefficient de temps de presse peut être ajusté de manière appropriée en fonction de la situation spécifique; Private Final Double PressTimeCoEFICIENT = 1,35; // La coordonnée du point de départ de la presse est également la coordonnée de point de départ du prochain jeu privé final int swipex = 550; private final int swipey = 1580; // La hauteur de base de la pièce d'échecs est privée final int halfbaseboardHeight = 20; // La largeur de la pièce d'échecs est tirée de la capture d'écran et ajuste le Final Int privé par vous-même HalmabodyWidth = 74; // Les coordonnées médianes des deux tremplins dans la capture d'écran du jeu sont principalement utilisées pour calculer l'angle. La proportion de XY peut être calculée sur la base de la capture d'écran réelle. Int final privé Int Boardx1 = 813; Final privé int boardy1 = 1122; Int final privé Int Boardx2 = 310; private final int boardy2 = 813; / ** * Obtenez les vérificateurs et les coordonnées centrales du Springboard suivant * * @return * @Author Leeho * @throws ioException * @upDate 31 décembre 2017 à 12:18:22 PM * / private int [] GethalmaandBoardxyValue (File CurrentImage) Throws ioException {BufferedImage BubireddiMage = ImageIo.Read (CurrentImage); int width = bufferedImage.getWidth (); int height = bufferedImage.getheight (); System.out.println ("largeur:" + largeur + ", hauteur:" + hauteur); int halmaxsum = 0; int halMaxCount = 0; int halmayMax = 0; int boardx = 0; int boardy = 0; // Transférer les points de pixels de la capture d'écran de haut en bas et utiliser la couleur de la pièce d'échecs comme base de reconnaissance de position. Enfin, la valeur moyenne de tous les pixels sur la rangée la plus basse de la couleur de la pièce d'échec est retirée, c'est-à-dire calculer les coordonnées de la pièce d'échecs pour (int y = jeuScorebottomy; y <height; y ++) {for (int x = 0; x <width; x ++) {processrgbinfo (tamponage, x, y); int rValue = this.rgbinfo.getrValue (); int gvalue = this.rgbinfo.getGValue (); int bValue = this.rgbinfo.getBValue (); // Identifiez la position de la pièce d'échecs en fonction de la couleur de RGB, if (rValue> 50 && rValue <60 && gvalue> 53 && gvalue <63 && bValue> 95 && bValue <110) {halmaxsum + = x; halMaxCount ++; // Y Valeur de coordonnées de la ligne inférieure de la pièce d'échecs halmaymax = y> halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxcount! = 0) {// x Valeur de coordonnées de la ligne inférieure de la pièce d'échecs int halmax = halmaxsum / halmaxcount; // Déplacez la moitié de la hauteur du châssis de pièce d'échecs en haut dans Halmay = HalmayMax - HalfbaseboardHeight; // Commencez à partir de jeuxCoreBottomy pour (int y = GamesCoreBottomy; y <height; y ++) {processrgbinfo (bufferedImage, 0, y); int lastPixelr = this.rgbinfo.getrValue (); int lastPixelg = this.rgbinfo.getgValue (); int lastPixelb = this.rgbinfo.getBValue (); // Tant que la valeur Boardx calculée est supérieure à 0, cela signifie que la valeur X de coordonnée centrale du tremplin suivant a été obtenue. if (boardX> 0) {break; } int boardXSUM = 0; int boardxCount = 0; pour (int x = 0; x <width; x ++) {processrgbinfo (tamponedImage, x, y); int pixelr = this.rgbinfo.getrValue (); int pixelg = this.rgbinfo.getgValue (); int pixelb = this.rgbinfo.getBValue (); // entraîner le cas où la tête de la pièce d'échecs est plus élevée que le tremplin suivant if (math.abs (x - halmax) <halmabodywidth) {continuer; } // Scannez de haut en bas à la position du sommet du tremplin suivant. Le tremplin suivant peut être un cercle ou une boîte. Prenez plusieurs points et trouvez la moyenne if ((math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastPixelg) + math.abs (pixelb - lastPixelb))> 10) {BarkXsum + = x; BoardXCount ++; }} if (boardxsum> 0) {boardx = boardxsum / boardxCount; }} // Dans l'angle réel, trouvez les coordonnées près du centre de la carte suivante. boardy = (int) (halmay - math.abs (boardx - halmax) * math.abs (barky1 - boardy2) / math.abs (boardx1 - boardx2)); if (boardx> 0 && bandy> 0) {int [] result = new int [4]; // le résultat de la coordonnée x [0] = halmax; // le résultat de la coordonnée y [1] = halmay; // le résultat de la coordonnée x [2] = boardx; // le résultat de la coordonnée y [3] = embarqué; Résultat de retour; }} return null; } / ** * Exécutez la commande * * @param commande * @author leeho * @update 31 décembre 2017 à 12:13:39 PM * / private void exécucommand (String Command) {Process process = null; try {process = runtime.getRuntime (). exec (commande); 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 (ligne); } System.out.println ("Exec Command end:" + Command); } catch (exception e) {e.printStackTrace (); } enfin {if (process! = null) {process.destroy (); }}} / ** * ADB obtient des captures d'écran Android * * @author leeho * @update 31 décembre 2017 à 12:11:42 PM * / private void eaxeAdBcaptureCommands () {for (String Commande: adb_screen_capture_cmds) {execumand (Command); }} / ** * Jump * * @param Distance * @author leeho * @update 31 décembre 2017 à 12:23:19 PM * / private void dojump (double distance) {System.out.println ("Distance:" + Distance); // Calculez le temps de presse, minimum 200 ms int presstime = (int) math.max (Distance * PressTimecoEfficient, 200); System.out.println ("PressTime:" + PressTime); // Exécuter la sous-opération String Commande = String.format ("ADB Shell Entrée Swipe% S% S% S% S% S", Swipex, Swipey, Swipex, Swipey, PressTime); System.out.println (commande); EXECTIONCOMAND (Commande); } / ** * Un autre jeu * * @author leeho * @update 31 décembre 2017 à 12:47:06 PM * / private void relayGame () {String Command = String.Format ("Adb Shell Entrée tap% s% s", swipex, swipey); EXECTIONCOMAND (Commande); } / ** * Calculez la distance du saut, c'est-à-dire la distance entre deux points * * @param halmax * @param halmay * @param boardx * @param borny * @return * @author leeho * @update 31 décembre 2017 à 12:27:30 PM * / Private Double ComputeDistance (Int Halmax, int halmay, int bandin Math.sqrt (math.pow (math.abs (boardx - halmax), 2) + math.pow (math.abs (bandy - halmay), 2)); } public static void main (String [] args) {try {file storeir = new File (store_dir); if (! storeir.exists ()) {booléen flag = storeir.mkdir (); if (! Flag) {System.err.println ("Créer un répertoire de stockage d'images Échec"); retour; }} JumpJumpHelper JumpJumpHelper = new JumpJumpHelper (); // Nombre d'exécutions int exécuteCount = 0; pour (;;) {// Exécuter la commande ADB pour obtenir une capture d'écran Android JumpJumpHelper.ExecuteadBcaptureCommands (); File currentImage = new File (store_dir, image_name); if (! currentImage.exists ()) {System.out.println ("L'image n'existe pas"); continuer; } longue longueur = currentImage.length (); ImageLength [exécution% ImageLengthLength] = longueur; // Vérifiez si vous devez rouvrir JumpJumphelper.CheckDorePlay (); ExecuteCount ++; System.out.println ("CurrentThrow" + exécution + "Exécution!"); // Obtenez les coordonnées centrales des dames et de la plaque de base int [] result = JumpJumphelper.GethalmaandboardxyValue (currentImage); if (result == null) {System.out.println ("Le résultat de la méthode gethalmaandboardxyvalue est null!"); continuer; } int halmax = résultat [0]; int halmay = résultat [1]; int boardx = résultat [2]; int boardy = résultat [3]; System.out.println ("halmax:" + halmax + ", halmay:" + halmay + ", boardx:" + boardx + ", bandy:" + bandy); // Calculez la distance du saut double saut Distance = JumpJumphelper.computeJumpDistance (Halmax, Halmay, Boardx, Boardy); JumpJumphelper.Dojump (JumpDistance); // Restez pendant 2,5 secondes à chaque fois TimeUnit.Millisecondes.Sleep (2500); }} catch (exception e) {e.printStackTrace (); }} / ** * Vérifiez si vous devez redémarrer * * @Author Leeho * @update 31 décembre 2017 1:39:18 PM * / private void checkDorePlay () {if (ImageLength [0]> 0 && iMageLength [0] == ImageLength [1] && ImageLeng ImageLength [2] ImageLength [3] && ImageLength [3] == ImageLength [4]) {// Cela signifie que la taille de l'image a été la même depuis 5 fois consécutives. Vous pouvez savoir que l'écran actuel est dans un autre jeu de jeux. // simulez et cliquez sur le bouton pour démarrer le jeu ReplayGame (); }} / ** * Obtenez la valeur RGB des coordonnées spécifiées * * @param bufferedImage * @param x * @param y * @author leeho * @update 31 décembre 2017 à 12:12:43 PM * / private void processrgbinfo (buffredimage BuffreDImage, int x, int y) {this.rgbinfo.resew (); int pixel = bufferedImage.getrgb (x, y); // Convertir en numéro RVB this.rgbinfo.setrValue ((pixel & 0xff0000) >> 16); this.rgbinfo.setGValue ((pixel & 0xff00) >> 8); this.rgbinfo.setBValue ((pixel & 0xff)); } class rgbinfo {private int RValue; int gvalue privé; Int privé 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; }}}Pour plus de contenu, vous pouvez vous référer au sujet spécial "Jump on WeChat" pour apprendre.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.