Ich habe meine Sprungergebnisse schon lange in meinem Freundeskreis gepostet. Heute habe ich versehentlich ein Video eines Kollegen gesehen, der Code verwendet hat, um Punktzahlen zu erzielen. Ich ging nach Baidu und sah den Code (der Code war am Ende). Nach mehreren Wendungen lief ich schließlich erfolgreich und erzielte ein wenig.
Lassen Sie uns zunächst kurz über die Schritte sprechen:
1. Baidu Download -Score -Code
2. Installieren Sie ADB
3. Suchen Sie ein Telefon, mit dem Sie über den USB -Debugging -Modus eine Verbindung zum Computer herstellen können
4. Starten Sie das WeChat Mini -Programm
5. Führen Sie den Code in Eclipse aus (hier müssen wir ständig die Parameter entsprechend der Größe des Mobiltelefonbildschirms debuggen und ändern).
Das Ergebnis ist, dass Ihr Telefonbildschirm automatisch drückt und das Schachstück springen lässt.
Sprechen wir über die Frage:
1. Installieren Sie das ADB -Problemsatz:
Laden Sie die Adb -Tool -Adresse herunter
Wenn es im Geräte -Manager hier nicht auf anderen Geräten installiert ist, ist ADB ein Ausrufezeichen. Nach der Installation wird, wie in der Abbildung gezeigt, das Android -Gerät der Linie angezeigt.
Wenn Sie es installieren, klicken Sie mit der rechten Maustaste in die ADB-Spalte, um Eigenschaften auszuwählen. Die folgende Schnittstelle wird angezeigt, klicken Sie auf den Treiber Aktualisieren, den Computer auswählen und Programme auswählen (dh die zweite Option). Zu diesem Zeitpunkt wird eine Durchstecher -Treiberoption auf dem Computer angezeigt, den Speicherort des Installationspakets auswählen und dann wird alles für die Installation freigegeben.
Die Frage ist:
Nach der Installation können Sie ADB im CMD -Befehlsfenster verwenden, aber das Ausführen des Codes in Eclipse hat überhaupt keine Wirkung (das Programm meldet keinen Fehler, und es gibt keine Screenshots auf dem Telefon), und dann zeigt die Eclipse -Konsole, dass das Bild nicht vorhanden ist.
Zu diesem Zeitpunkt müssen Sie die beiden dynamischen Linkbibliotheken kopieren, die Sie in den folgenden beiden Verzeichnissen installiert haben: (Wenn Sie sie nicht finden können, suchen Sie global im C -Laufwerk)
adb.exe
Adbwinapi.dll
Adbwinusbapi.dll
C:/Windows/System32
C:/Windows/Sywow64
Zu diesem Zeitpunkt muss es unter SYSWOW64 platziert werden. Ich bin Win7 64 -Bit, also gibt es dieses Verzeichnis (andere Leute im Internet sagen, dass Win32 dies nicht ausdrücken muss, ich habe es nicht ausprobiert).
Wenn das Verzeichnis von SySwow64 nicht platziert ist, hat der Eclipse -Operation zu diesem Zeitpunkt immer noch keine Wirkung. Wenn Sie jedoch den ADB -Shell -Screencap -p /sdcard/tencent/customerpic/current.png -Befehl in CMD ausführen, finden Sie ein aktuelles ADB -Werkzeug.
Ich fand heraus, dass ich CD zu System32 und im Installationsverzeichnis (C:/Programmdateien (x86)/Thunder -Netzwerk/Thunder/Programm) verwendet habe.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Dieses Programm kann nicht gestartet werden, da adbwinapi.dll am Computer fehlt. Versuchen Sie, das Programm neu zu installieren, um dieses Problem zu beheben.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sicher
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OK, dies bedeutet, dass die ADB in System32 die dynamische Verknüpfungsdatei adbwinapi.dll nicht finden kann, aber es ist offensichtlich, dass ich das Verzeichnis SYSWOW64 durch Zufall gesehen habe, und was bedeutet dieses Verzeichnis und was bedeutet es? OK, kopieren Sie die drei Dateien, die in das System32 -Verzeichnis kopiert wurden, und kopieren Sie sie dann in dieses Verzeichnis SYSWOW64 und erledigen Sie es.
Frage 2: Gerät offline
Durch das Ausführen von ADB -Shell im CMD -Befehlsfenster führte er offline zu einem Fehlergerät. Ich dachte, mit meiner ADB -Installation stimmte etwas nicht. Ich hatte viel Baidu. Ich habe ADB Kill Server, ADB Remount und andere Befehle ausprobiert, aber ich fand, dass der Code /SDCard /war. Ich habe gesehen, dass dies eine externe SD -Karte sein sollte. Ist der Weg falsch? (Ich habe Vivo X9 verwendet, und dieses Telefon hat keine externe SD -Kartenoption). Nach dem Wechsel zu einem älteren Telefon (Vivo Y27) kann ich ADB -Shell ausführen, aber /sdcard ist kein externer SD -Kartenpfad, sondern der U -Festplattenpfad des Telefons.
Das heißt, es sollte kein Codepfadproblem sein. Mir wurde gesagt, dass das ADB -Tool zu alt ist und die ADB -Version Version 1.0.26 hat. Nun, ich bin zu faul, um die neue Version von ADB zu finden. Ich habe es mit dem alten Vivo Y27 debuggen und es kann geblitzt werden.
Lassen Sie mich auflisten, was ich gelernt habe:
1. Ich weiß, dass es ADB gibt, und ich weiß auch, dass die Verwendung der ADB -Shell die Bash -Sitzung des Telefons erhalten kann. Sie können Screenshots aufnehmen und adb Pull können Dateien vom Telefon abrufen. Wenn es auf der offiziellen Website mehr Befehle gibt, kann ich mich nicht daran erinnern, selbst wenn ich es zu viel gelesen habe.
2. Wisse, dass Java RunTime.GetRuntime (). Exec () im ursprünglichen Code verwendet, um Systembefehle in Windows aufzurufen:
process = runTime.getRuntime (). Exec (Befehl); System.out.println ("Exec -Befehl starten:" + Befehl); process.waitfor (); process.getInputStream (); BufferedReader bufferedReader = new bufferedReader (neuer InputStreamReader (process.getErrorStream ())); String line = bufferedReader.readline (); 3. Verstehen Sie, dass im Code ein Bild analysieren, indem Sie den RGB -Farbwert des Screenshots usw. berechnen.
Alle Codes:
Paket com.lw.test; Import Java.awt.image.BuffenedImage; Import Java.io.BufferedReader; Import Java.io.file; importieren java.io.ioException; importieren java.io.inputStreamReader; Import Java.util.Arrays; Import Java.util.Concurrent.TimeUnit; import Javax.imageo.imageo; /** * Referenz zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "external nofollow" target = "_blank"> https:/zhuanlan.zhihu.com/p/P/3245473 </a. Leeeho */ Public Class JumpJumpHelper {private statische endgültige String image_name = "current.png"; private statische endgültige String Store_dir = "D:/jump_screencapture"; // Quantity Private statische endgültige Int ImagelengthLength = 5; // Größe des Bildes private statische endgültige Länge [] Imagelength = new Long [ImagelengthLength]; private final rgbinfo rgbinfo = new rgbinfo (); private final String path = "/sdcard/tencent/customerpic/"; private endgültige String [] adb_screen_capture_cmds = {"adb Shell screencap -p"+Pfad+Image_Name, "adb pull"+path+"current.png"+store_dir}; // Die y -Koordinate am unteren Rand des Spiels der Spiele im Screenshot ist der Wert von 1920x1080. Ändern Sie die private endgültige Int Gamescorebottomy = 300 gemäß der tatsächlichen Situation; // Der Druckzeitkoeffizient kann entsprechend der spezifischen Situation angemessen eingestellt werden. private endgültige doppelte pressTimeCoeffiction = 2,05; // Die Startpunktkoordinate der Presse ist auch die Ausgangspunktkoordinate des nächsten Spiels Private Final int Swipex = 280; Private Final Int Swipey = 600; // Die Höhe der Basis des Schachstücks ist private endgültige Int Halfbaseboardheight = 20; // Die Breite des Schachstücks wird aus dem Screenshot entnommen und die private endgültige INT alleine Halmabodywidth = 74 anpassen; // Die Mittelpunktkoordinaten der beiden Springboards im Spiel -Screenshot werden hauptsächlich zur Berechnung des Winkels verwendet. Der Anteil von XY kann basierend auf dem tatsächlichen Screenshot berechnet werden. Private endgültige int boardx1 = 813; privates Final INT Boardy1 = 1122; private endgültige int boardx2 = 310; Private Final INT Boardy2 = 813; / ** * Holen Sie sich die Checkers und die Mitte -Koordinaten des nächsten Sprungbretts * * @return * @Author Leeho * @Throws ioException * @Update 31. Dezember 2017 um 12:18:22 Uhr */ privat int [] gethalmaandboardxyvalue (Dateistromabkommen) throws ioException {bufperedimage = pageio.read (aktuelle IoException); int width = bufferedImage.getWidth (); int Höhe = bufferedImage.getheight (); System.out.println ("Breite:" + width + ", Höhe:" + Höhe); int halmaxsum = 0; int halmaxCount = 0; int halmaymax = 0; int boardx = 0; int boardy = 0; // Übertragen Sie die Pixelpunkte vom Screenshot von oben nach unten und verwenden Sie die Farbe des Schachstücks als Grundlage für die Positionserkennung. Schließlich wird der Durchschnittswert aller Pixel auf der niedrigsten Zeile der Schach -Stückfarbe herausgenommen, dh die Koordinaten des Schachstücks für (int y = Gamescorebottomy; y <height; y ++) {für (int x = 0; x <breit; x ++) {processRgbinfo (gepuffert (int x = 0; x <); int rvalue = this.rgbinfo.getRValue (); int gValue = this.rgbinfo.getGValue (); int bValue = this.rgbinfo.getBValue (); // Identifizieren Sie die Position des Schachstücks gemäß der Farbe von RGB, if (rvalue> 50 && rvalue <60 && gvalue> 53 && gvalue <63 && bvalue> 95 && bvalue <110) {Halmaxsum += x; HalmaxCount ++; // y Koordinatenwert der unteren Reihe des Schachstücks Halmaymax = y> Halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxCount! // Hälfte des Schachstückshöhehöhe nach oben Halmay = Halmaymax - HalfbaseboardHeight; // Beginnen Sie von Gamescorebottomy für (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 (); // Solange der berechnete Boardx -Wert größer als 0 ist, bedeutet dies, dass der Zentrumkoordinaten -X -Wert des nächsten Sprungbretts erhalten wurde. if (boardx> 0) {break; } int boardxsum = 0; int boardxCount = 0; für (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 (); // trainiere den Fall, in dem der Kopf des Schachstücks höher ist als das nächste Sprungbrett, wenn (math.abs (x - halmax) <halmabodywidth) {Fortsetzung; } // Scannen Sie von oben nach unten bis zur Scheitelpunktposition des nächsten Sprungbretts. Das nächste Sprungbrett kann ein Kreis oder eine Schachtel sein. Nehmen Sie mehrere Punkte und finden Sie den Durchschnitt if ((math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastpixelg) + math.abs (pixelb - lastpixelb))> 10) {boardxsum + = x; boardxCount ++; }} if (boardxsum> 0) {boardx = boardxsum / boardxCount; }} // Finden Sie aus dem tatsächlichen Winkel die Koordinaten in der Nähe der Mitte des nächsten Boards. 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]; // das X -Koordinatenergebnis [0] = Halmax; // das Y -Koordinatenergebnis [1] = Halmay; // das X -Koordinatenergebnis [2] = boardx; // das Y -Koordinatenergebnis [3] = Boardy; Rückgabeergebnis; }} return null; } / ** * Führen Sie den Befehl * * * @param aus * @author leeeho * @update 31. Dezember 2017 um 12:13:39 Uhr * / private void executeCommand (String -Befehl) {Process Process = null; try {process = runTime.getRuntime (). exec (command); System.out.println ("Exec -Befehl starten:" + Befehl); process.waitfor (); process.getInputStream (); BufferedReader bufferedReader = new bufferedReader (neuer InputStreamReader (process.getErrorStream ())); String line = bufferedReader.readline (); if (line! = null) {System.out.println (Linie); } bufferedReader = new bufferedReader (neuer InputStreamReader (process.getInputStream ())); String line02 = bufferedReader.readline (); if (line02! = null) {System.out.println (line02); } System.out.println ("Exec -Befehlsende:" + Befehl); } catch (Ausnahme e) {e.printstacktrace (); } endlich {if (prozess! = null) {process.destroy (); }}} / ** * ADB erhält Android -Screenshots * * @author Leeeho * @Update 31. Dezember 2017 12:11:42 PM * / private void executeadbcaptureCommands () {for (String -Befehl: adb_screen_capture_cmds) {executecommand (Befehl); }} / ** * springen * * @param distanz * @author Leeho * @Update 31. Dezember 2017 um 12:23:19 Uhr * / private void DoJump (Doppelentfernung) {system.out.println ("Distanz:" + Distanz); // Berechnen Sie die Drückenzeit, minimal 200 ms int pressTime = (int) math.max (Entfernung * pressTimeCoefficienz, 200); System.out.println ("PressTime:" + pressTime); // Führen Sie den Befehl für den Betrieb von Betriebsstring = string.Format aus ("ADB -Shell -Eingangs -Swipe %s %s %s %s", Swipex, Swipey, Swipex, Swipey, PressTime); System.out.println (Befehl); ExecuteCommand (Befehl); } / ** * Ein weiteres Spiel * * @Author Leeeho * @Update 31. Dezember 2017 um 12:47:06 Uhr * / private void replaygame () {String command = string.format ("Adb Shell Input TAP TIP %S %S", SWIPEX, SWIPEY); ExecuteCommand (Befehl); } /** * 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 devices"; // JumpJumpHelper.executeCommand (Befehl); // // if (true) {return;} try {file sporedir = new File (store_dir); if (! storedir.exists ()) {boolean flag = storedir.mkdir (); if (! Flag) {System.err.println ("Bildspeicherverzeichnis erstellen"); zurückkehren; }} // Anzahl der Ausführungen int executeCount = 0; für (;;) {// ADB -Befehl ausführen, um Android -Screenshot JumpJumpHelper.ExecuteadbcaptureCommands () zu erhalten; Datei CurrentImage = New Datei (Store_dir, Image_Name); if (! currentImage.exists ()) {System.out.println ("Das Bild existiert nicht"); weitermachen; } Langlänge = CurrentImage.length (); Imagelength [ExecuteCount % ImagelengthLength] = Länge; // Überprüfen Sie, ob Sie JumpJumpHelper.CheckDoreplay () neu starten müssen; ExecuteCount ++; System.out.println ("Currentth" + executeCount + "Ausführung!"); // Die Mittelkoordinaten von Checkern und Basisplatte int [] result = JumpJumpHelper.gethalmaandboardxyValue (CurrentImage) erhalten; if (result == null) {System.out.println ("Das Ergebnis der Methode GethalmaandboardxyValue ist null!"); weitermachen; } int halmax = result [0]; int halmay = result [1]; int boardx = Ergebnis [2]; int boardy = Ergebnis [3]; System.out.println ("Halmax:" + Halmax + ", Halmay:" + Halmay + ", boardx:" + boardx + ", boardy:" + boardy); // Berechnen Sie die Entfernung des Sprung -Double Jumpdistance = JumpJumphelper.comPutejumpdistance (Halmax, Halmay, Boardx, Boardy); JumpJumpHelper.Dojump (Jumpdistance); // Jedes Mal 2,5 Sekunden bleiben. }} catch (Ausnahme e) {e.printstacktrace (); }} / ** * Überprüfen Sie, ob Sie neu gestartet werden müssen Bildelänge [3] == Bildelength [4]) {// Dies bedeutet, dass die Bildgröße für 5 aufeinanderfolgende Zeiten gleich war. Sie können wissen, dass sich der aktuelle Bildschirm in einer anderen Runde von Arrays.Fill befindet (Imagelength, 0); // simulieren und klicken Sie auf die Schaltfläche, um das Spiel erneut zu starten. ReplayGame (); }} / ** * Erhalten Sie den RGB-Wert der angegebenen Koordinaten * * @param bufferedImage * @param x * @param y * @author leeeho * @update 2017-02-31 12:12:43 PM * / private void processrgbinfo (bufpedimage bufferedimage, int x, int x, int x, int y) {this. this int pixel = bufferedImage.getRGB (x, y); // in RGB Digit this.rgbinfo.setRValue ((Pixel & 0xff0000) >> 16) konvertieren; this.rgbinfo.setGValue ((Pixel & 0xff000) >> 8); this.rgbinfo.setbValue ((Pixel & 0xff)); } class rgbinfo {private int rvalue; Privat int gvalue; Privat 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; }}}Natürlich werden die Ergebnisse nach einer Weile gelöscht, aber als Programmierer ist es immer noch gut. Aus der anfänglichen Sicherheitsanfälligkeit nach der Einreichung wurde der Computer gebeten, Pakete zu schnappen und Daten als Agent zu ändern. Jetzt simuliert der Code Klicks (obwohl er nicht wirksam wird.)
Für weitere Inhalte können Sie sich auf das spezielle Thema "Spring on WeChat" beziehen, um zu lernen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.