Saya telah memposting hasil lompatan saya di lingkaran teman saya untuk waktu yang lama. Hari ini saya tidak sengaja melihat video seorang kolega yang menggunakan kode untuk membuat skor. Saya pergi ke Baidu dan melihat kode (kodenya ada di akhir). Setelah beberapa tikungan dan belokan, saya akhirnya berlari dengan sukses dan mencetak sedikit.
Pertama, mari kita bicara secara singkat tentang langkah -langkahnya:
1. Kode skor unduhan Baidu
2. Instal ADB
3. Temukan telepon untuk terhubung ke komputer menggunakan mode debugging USB
4. Mulai program mini WeChat
5. Jalankan kode di Eclipse (di sini kita perlu terus -menerus men -debug dan memodifikasi parameter sesuai dengan ukuran layar ponsel)
Hasilnya adalah layar ponsel Anda akan secara otomatis menekan dan membiarkan potongan catur melompat.
Mari kita bicara tentang pertanyaannya:
1. Instal ADB Masalah Set:
Unduh Alamat Alat ADB
Di Device Manager di sini, jika tidak diinstal pada perangkat lain, ADB adalah titik seru. Setelah instalasi, seperti yang ditunjukkan pada gambar, perangkat Android Line akan muncul.
Jika Anda menginstalnya, klik kanan di kolom ADB untuk memilih Properties, dan antarmuka berikut muncul, klik Perbarui Driver, pilih Browse Computer dan pilih Program (yaitu, opsi kedua). Pada saat ini, opsi driver browse di komputer akan muncul, pilih lokasi paket instalasi, dan kemudian semuanya akan dirilis untuk menginstal.
Pertanyaannya adalah:
Setelah instalasi, Anda dapat menggunakan ADB di bawah jendela perintah CMD, tetapi menjalankan kode di Eclipse tidak berpengaruh sama sekali (program tidak melaporkan kesalahan, dan tidak ada tangkapan layar di telepon), dan kemudian konsol Eclipse menunjukkan bahwa gambar tidak ada.
Saat ini, Anda perlu menyalin dua perpustakaan tautan dinamis DLL yang Anda instal ke dua direktori berikut: (jika Anda tidak dapat menemukannya, cari secara global di drive C)
adb.exe
Adbwinapi.dll
Adbwinusbapi.dll
C:/Windows/System32
C:/Windows/Syswow64
Pada saat ini, itu harus ditempatkan di bawah Syswow64. Saya win7 64 bit, jadi ada direktori ini (orang lain di internet mengatakan bahwa Win32 tidak perlu meletakkan ini, saya belum mencobanya).
Jika direktori Syswow64 tidak ditempatkan, operasi gerhana masih belum berpengaruh pada saat ini: tetapi jika Anda menjalankan ADB shell screencap -p /sdcard/tencent/customerpic/current.png perintah di CMD, Anda akan menemukan bahwa akan ada gambar yang sesuai.
Saya menemukan bahwa saya menggunakan CD ke System32 dan di bawah Direktori Instalasi (C:/Program Files (x86)/Thunder Network/Thunder/Program), saya berhasil menjalankan perintah di atas dalam program, dan melaporkan kesalahan di System32:
-----------------------------------------------------------------------------------------------------------------------------
Program ini tidak dapat dimulai karena adbwinapi.dll tidak ada dari komputer. Coba instalasi ulang program untuk menyelesaikan masalah ini.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Tentu
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Oke, ini berarti bahwa ADB di System32 tidak dapat menemukan file tautan dinamis adbwinapi.dll, tetapi jelas bahwa, secara kebetulan, saya melihat direktori syswow64, dan kemudian apa arti direktori ini dan apa artinya? OK, salin tiga file yang disalin ke direktori System32 dan kemudian salin ke direktori ini Syswow64, dan selesaikan.
Pertanyaan 2: Perangkat Offline
Menjalankan ADB Shell di jendela perintah CMD menghasilkan perangkat kesalahan secara offline. Saya pikir ada yang salah dengan instalasi ADB saya. Saya memiliki banyak Baidu. Saya mencoba ADB Kill Server, ADB Remount dan perintah lainnya, tetapi saya menemukan bahwa kodenya /sdcard /. Saya melihat bahwa ini harus menjadi kartu SD eksternal. Apakah jalannya salah? (Saya menggunakan Vivo X9, dan ponsel ini tidak memiliki opsi kartu SD eksternal). Setelah berganti ke ponsel yang lebih tua (Vivo Y27), saya dapat menjalankan ADB Shell, tetapi /SDCard bukan jalur kartu SD eksternal, tetapi jalur disk U dari ponsel.
Itu berarti itu seharusnya tidak menjadi masalah jalur kode. Saya diberitahu bahwa alat ADB terlalu tua dan versi ADB memiliki versi 1.0.26. Nah, saya terlalu malas untuk menemukan versi baru ADB. Saya men -debugnya dengan Vivo Y27 lama dan bisa disinari.
Izinkan saya mencantumkan apa yang telah saya pelajari:
1. Saya tahu ada ADB, dan saya juga tahu bahwa menggunakan shell ADB bisa mendapatkan sesi bash telepon. Anda dapat mengambil tangkapan layar, dan menggunakan ADB Pull bisa mendapatkan file dari telepon. Jika ada lebih banyak perintah di situs web resmi, saya tidak dapat mengingatnya bahkan jika saya membacanya terlalu banyak.
2. Ketahuilah bahwa Java menggunakan runtime.getRuntime (). Exec () di kode asli untuk memanggil perintah sistem di windows:
proses = runtime.getRuntime (). exec (command); System.out.println ("Command Exec Start:" + Command); Process.waitfor (); Process.getInputStream (); BufferedReader bufferedReader = BufferedReader baru (inputStreamReader baru (process.getErrorStream ())); String line = bufferedReader.readline (); 3. Pahami bahwa dalam kode, menganalisis gambar dengan menghitung nilai warna RGB dari tangkapan layar, dll., Int pixel = bufferedImage.getrgb (x, y);
Semua kode:
paket com.lw.test; impor java.awt.image.bufferedimage; impor java.io.bufferedReader; impor java.io.file; impor java.io.ioException; impor java.io.inputStreamReader; impor java.util.arrays; impor java.util.concurrent.timeunit; impor javax.imageio.imageio; /** * Referensi Zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "eksternal nofollow" target = "_blank"> https://zhuanlan.zhihu.com/p/p/p/pehor * *aTps://zhuanlan.zhihu.com/p/p/p/p/spps: */ kelas publik Jumpjumphelper {private static final string image_name = "current.png"; Private Static Final String Store_dir = "D:/Jump_Screencapture"; // Kuantitas Private Static Int ImageLengthLengthPength = 5; // ukuran gambar private private static final long [] imagelength = new Long [imagelengthlength]; final pribadi rgbinfo rgbinfo = rgbinfo baru (); Path String Akhir Pribadi = "/SDCard/Tencent/CustomerPic/"; Private Final String [] adb_screen_capture_cmds = {"adb shell screencap -p"+path+image_name, "adb pull"+path+"current.png"+store_dir}; // Koordinat Y di bagian bawah area tampilan skor game di tangkapan layar, 300 adalah nilai 1920x1080. Memodifikasi final private int gamescorebottomy = 300 sesuai dengan situasi aktual; // Koefisien waktu pers dapat disesuaikan dengan tepat sesuai dengan situasi tertentu; private final double pressTimeCoEfficient = 2.05; // Koordinat titik awal pers juga merupakan koordinat titik awal dari game berikutnya swipex final swipex = 280; private final int swipey = 600; // Ketinggian pangkalan potongan catur adalah private final final farlbaseBoardheight = 20; // Lebar potongan catur diambil dari tangkapan layar dan menyesuaikan int final pribadi sendiri halmabodywidth = 74; // Koordinat titik tengah dari dua springboard di tangkapan layar game terutama digunakan untuk menghitung sudut. Proporsi XY dapat dihitung berdasarkan tangkapan layar yang sebenarnya. Private final int boardx1 = 813; private final int boardy1 = 1122; private final int boardx2 = 310; private final int boardy2 = 813; / ** * Dapatkan checker dan koordinat pusat dari batu loncatan berikutnya * * @return * @author leeho * @throws ioException * @update 31 Desember 2017 pukul 12:18:22 PM */ int private [] getHalmaandboardValue (file Currentimage) lemparan ioException {Buffermage {file BufferedSception {File Buffered (File CurrontImage) (File BuffedeMage (File BuffedeMage (File BuffedeMage (File BufferMage (File Buffed (file) Int width = bufferedImage.getWidth (); int tinggi = bufferedImage.getHeight (); System.out.println ("Lebar:" + Lebar + ", Tinggi:" + Tinggi); int halmaxsum = 0; int halmaxcount = 0; int halmaymax = 0; int boardx = 0; int boardy = 0; // Transfer titik piksel dari tangkapan layar dari atas ke bawah, dan gunakan warna potongan catur sebagai dasar untuk pengenalan posisi. Akhirnya, nilai rata -rata semua piksel pada baris terendah dari warna potongan catur diambil, yaitu, menghitung koordinat potongan catur untuk (int y = gamescorebottomy; y <tinggi; y ++) {untuk (int x = 0; x <lebar; x ++) {prosesrgbinfo (bufferedimage, x, y); int rvalue = this.rgbinfo.getRvalue (); int gValue = this.rgbinfo.getGvalue (); int bvalue = this.rgbinfo.getBvalue (); // Identifikasi posisi potongan catur sesuai dengan warna RGB, if (rvalue> 50 && rvalue <60 && gvalue> 53 && gvalue <63 && bvalue> 95 && bvalue <110) {halmaxsum += x; halmaxcount ++; // y Nilai koordinat dari baris bawah bagian catur halmaymax = y> halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxcount! = 0) {// x Nilai koordinat dari baris bawah bagian catur int halmax = halmaxsum /halmaxcount; // Pindahkan setengah dari sasis piece catur tinggi ke atas halmay = halmaymax - halfbaseboardheight; // Mulai dari gamescorebottomy untuk (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 (); // Selama nilai boardx yang dihitung lebih besar dari 0, itu berarti bahwa pusat koordinat x nilai loncatan berikutnya telah diperoleh. if (boardx> 0) {break; } int boardxsum = 0; int boardxcount = 0; untuk (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 (); // Latih kasing di mana kepala potongan catur lebih tinggi dari loncatan berikutnya IF (math.abs (x - halmax) <halmabodywidth) {lanjutkan; } // Pindai dari atas ke bawah ke posisi simpul batu loncatan berikutnya. Loncatan berikutnya mungkin lingkaran atau kotak. Ambil beberapa poin dan temukan rata -rata IF ((Math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastpixelg) + math.abs (pixelb - lastpixelb))> 10) {boardxsum + = x; BoardXCount ++; }} if (boardxsum> 0) {boardx = boardxsum / boardxcount; }} // Dari sudut yang sebenarnya, temukan koordinat dekat dengan pusat papan berikutnya. 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]; // hasil koordinat x [0] = halmax; // hasil koordinat y [1] = halmay; // hasil koordinat x [2] = boardx; // hasil koordinat y [3] = boardy; hasil pengembalian; }} return null; } / ** * Jalankan perintah * * @param command * @author leeho * @update 31 Desember 2017 jam 12:13:39 pm * / private void executeCommand (perintah string) {proses proses = null; coba {proses = runtime.getRuntime (). exec (command); System.out.println ("Command Exec Start:" + Command); Process.waitfor (); Process.getInputStream (); BufferedReader bufferedReader = BufferedReader baru (inputStreamReader baru (process.getErrorStream ())); String line = bufferedReader.readline (); if (line! = null) {System.out.println (line); } bufferedReader = BufferedReader baru (inputStreamReader baru (process.getInputStream ())); String line02 = bufferedreader.readline (); if (line02! = null) {System.out.println (line02); } System.out.println ("Exec Command End:" + Command); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {if (proses! = null) {process.destroy (); }}} / ** * ADB Mendapat layar Android * * @author leeho * @update 31 Desember 2017 12:11:42 PM * / Private Void ExecuteAdbCaptureCommands () {untuk (perintah string: adb_screen_capture_cmds) {executecommand (perintah); }} / ** * Jump * * @param jarak * @author leeho * @update 31 Desember 2017 jam 12:23:19 PM * / Private void dojump (jarak ganda) {System.out.println ("jarak:" + jarak); // Hitung waktu tekan, minimum 200ms int pressTime = (int) math.max (jarak * pressTimecoefisien, 200); System.out.println ("PressTime:" + PressTime); // Jalankan Perintah Operasi Tekan Command = String.Format ("ADB Shell Input Swipe %S %S %S %S %S", Swipex, Swipey, Swipex, Swipey, PressTime); System.out.println (perintah); ExecuteCommand (Command); } / ** * Game lain * * @author leeho * @update 31 Desember 2017 jam 12:47:06 pm * / private void replaygame () {command string = string.format ("input shell adb tap %s %s", swipex, swipey); ExecuteCommand (Command); } /** * 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 (); // command string = "adb shell screencap -p" + jumpjumphelper.path + image_name; //// Command = "Perangkat ADB"; // jumpjumphelper.executecommand (command); // // if (true) {return;} coba {file storedir = file baru (store_dir); if (! storedir.exists ()) {boolean flag = storedir.mkdir (); if (! flag) {system.err.println ("Buat direktori penyimpanan gambar gagal"); kembali; }} // Jumlah eksekusi int executeCount = 0; for (;;) {// Jalankan perintah ADB untuk mendapatkan Android Screenshot Jumpjumphelper.ExecuteAdbCaptureCommands (); File currentImage = file baru (store_dir, image_name); if (! currentImage.exists ()) {System.out.println ("Gambar tidak ada"); melanjutkan; } panjang panjang = currentImage.length (); imagelength [executeCount % imagelengthlength] = panjang; // Periksa apakah Anda perlu memulai kembali Jumpjumphelper.checkdoreplay (); ExecuteCount ++; System.out.println ("Currentth" + ExecuteCount + "Execution!"); // Dapatkan koordinat tengah pemeriksa dan inter plat dasar [] hasil = jumpjumphelper.gethalmAdboardxyValue (currentImage); if (result == null) {System.out.println ("Hasil dari metode gethalmAdboardxyValue adalah null!"); melanjutkan; } int halmax = hasil [0]; int halmay = hasil [1]; int boardx = hasil [2]; int boardy = hasil [3]; System.out.println ("halmax:" + halmax + ", halmay:" + halmay + ", boardx:" + boardx + ", boardy:" + boardy); // Hitung jarak lompatan ganda jumpdistance = jumpjumphelper.computeJumpdistance (Halmax, Halmay, Boardx, Boardy); jumpjumphelper.dojump (lompatan); // tinggal selama 2,5 detik setiap kali timeunit.milliseconds.sleep (2500); }} catch (Exception e) {e.printstacktrace (); }} / ** * Periksa apakah Anda perlu restart * * @author leeho * @update 31 Desember 2017 1:39:18 pm * / private void checkDoreplay () {if (imagelength [0]> 0 && imagelength [0] == ImageLength [1] && Imagelength [1] == Panjangnya [0] == Imagelength [1] && Imagelength [1] == Panjang [0] == Imagelength [1] && Imagelength [1] = ImageLength [3] == ImageLength [4]) {// Ini berarti bahwa ukuran gambar telah sama selama 5 kali berturut -turut. Anda dapat mengetahui bahwa layar saat ini berada di putaran array lain. Fill (imagelength, 0); // Simulasi dan klik tombol untuk memulai game lagi replaygame (); } } /** * Get the RGB value of the specified coordinates* * @param bufferedImage * @param x * @param y * @author LeeHo * @update 2017-02-31 12:12:43 pm */ private void processRGBInfo(BufferedImage bufferedImage, int x, int y) { this.rgbInfo.reset(); int pixel = bufferedImage.getrgb (x, y); // Konversi ke digit RGB this.rgbinfo.setrvalue ((Pixel & 0xff0000) >> 16); this.rgbinfo.setGvalue ((pixel & 0xff000) >> 8); this.rgbinfo.setBvalue ((pixel & 0xff)); } kelas rgbinfo {private int rvalue; private int gvalue; private int bvalue; publik 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; }}}Tentu saja, hasilnya akan dibersihkan setelah beberapa saat, tetapi sebagai seorang programmer, itu masih bagus. Dari kerentanan pengiriman pos awal, komputer diminta untuk mengambil paket dan memodifikasi data sebagai agen. Sekarang kode mensimulasikan klik (meskipun tidak akan berlaku.)
Untuk konten lebih lanjut, Anda dapat merujuk pada topik khusus "Jump on WeChat" untuk dipelajari.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.