รหัสการใช้งาน Java ที่เฉพาะเจาะจงที่ได้รับความช่วยเหลือจาก WeChat Jump สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
1. อ้างถึง Zhihu เพื่อสอนวิธีใช้ Python เพื่อเล่น WeChat เนื่องจากฉันเคยเป็นงูหลามครึ่งตัวฉันวางแผนที่จะใช้ Python กับคะแนนคะแนนมาก่อน แต่ฉันไม่มีทางเลือกนอกจากต้องติดตั้งสภาพแวดล้อม Python และโมดูลต่าง ๆ หายไปและรายงานข้อผิดพลาด ดังนั้นฉันจึงนำมาใช้ใหม่โดยใช้ Java
2. การกำหนดค่าสภาพแวดล้อมและคำแนะนำที่เกี่ยวข้อง:
1) ระบบ Windows ฉันเป็น win10
2) ติดตั้ง ava environment, JDK7 หรือสูงกว่า
3) โทรศัพท์ Android หนึ่งสายสายเคเบิลข้อมูลหนึ่งสาย
4) ติดตั้งไดรเวอร์ ADB สำหรับคอมพิวเตอร์เชื่อมต่อกับโทรศัพท์ Android และเปิดโหมดการดีบัก USB ในเวลาเดียวกัน
5) เปิดเกมกระโดดของโปรแกรม WeChat Mini โปรแกรม Java เริ่มทำงานและอ่านรหัสเฉพาะด้านล่าง
6) ฉันใช้โทรศัพท์ Meilan Note2 Android โดยมีความละเอียดหน้าจอ 1920x1080 รุ่นที่แตกต่างกันของโทรศัพท์มือถืออาจจำเป็นต้องปรับพารามิเตอร์ที่เกี่ยวข้อง โปรดดูความคิดเห็นของรหัสสำหรับรายละเอียด
7) เพิ่มฟังก์ชั่นของการรีสตาร์ทเกมโดยอัตโนมัติหลังจากล้มเหลวในการทำคะแนนคะแนน
8) เป็นเพียงความบันเทิงอย่าจริงจัง ว่ากันว่าเจ้าหน้าที่ WeChat ให้ความสนใจกับมัน หากคะแนนสูงเกินไปอาจถูกล้างออก ฮ่าฮ่า
3. หากไม่มีความกังวลใจเพิ่มเติมโปรดเพิ่มรหัส:
แพ็คเกจ com.yihusitian.gamehelper; นำเข้า java.awt.image.bufferedimage; นำเข้า java.io.bufferedreader; นำเข้า Java.io.File; นำเข้า java.io.ioException; นำเข้า Java.io.InputStreamReader; นำเข้า Java.util.Arrays; นำเข้า java.util.concurrent.timeUnit; นำเข้า Javax.imageio.imageio; /** * อ้างอิง zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "nofollow ภายนอก" rel = "external nofoll * @author leeho */ คลาสสาธารณะ jumpjumphelper {สตริงสุดท้ายคงที่ image_name = "current.png"; สตริงสุดท้ายคงที่ส่วนตัว store_dir = "d:/jump_screencapture"; // ปริมาณส่วนตัวคงสุดท้าย ImageLengthLength = 5; // ขนาดของการจัดเก็บภาพส่วนตัวคงที่สุดท้าย [] imageLength = ใหม่ยาว [imageLengthLength]; ส่วนตัว RGBINFO RGBINFO = ใหม่ RGBINFO (); สตริงสุดท้ายส่วนตัว [] ADB_SCREEN_CAPTURE_CMDS = {"ADB Shell Screencap -p /sdcard /" + image_name, "Adb Pull /sdcard/current.png" + store_dir}; // พิกัด Y ที่ด้านล่างของพื้นที่แสดงคะแนนเกมในภาพหน้าจอ 300 คือค่า 1920x1080 ปรับเปลี่ยน GamescoreBottomy INT สุดท้ายส่วนตัว = 300 ตามสถานการณ์จริง // ค่าสัมประสิทธิ์เวลากดสามารถปรับได้อย่างเหมาะสมตามสถานการณ์เฉพาะ Private Final Double PressTimecoefficient = 1.35; // จุดเริ่มต้นพิกัดของการกดเป็นจุดเริ่มต้นของเกมถัดไปของเกมถัดไป int swipex = 550; INT SWIPEY สุดท้ายส่วนตัว = 1580; // ความสูงพื้นฐานของชิ้นหมากรุกเป็นส่วนตัวสุดท้าย int halfbaseboardheight = 20; // ความกว้างของชิ้นหมากรุกนำมาจากภาพหน้าจอและปรับ INT สุดท้ายของตัวเองด้วยตัวเอง Halmabodywidth = 74; // พิกัดจุดกึ่งกลางของสปริงบอร์ดทั้งสองในสกรีนช็อตเกมส่วนใหญ่จะใช้ในการคำนวณมุม สัดส่วนของ XY สามารถคำนวณได้ตามภาพหน้าจอจริง INT สุดท้ายส่วนตัว boardx1 = 813; INT สุดท้ายส่วนตัว Boardy1 = 1122; INT สุดท้ายส่วนตัว BOINDX2 = 310; INT สุดท้ายส่วนตัว Boardy2 = 813; / ** * รับหมากฮอสและพิกัดกลางของสปริงบอร์ดถัดไป * * @return * @author leeho * @throws ioexception * @update 31 ธันวาคม 2017 เวลา 12:18:22 น. */ ส่วนตัว ความกว้าง int = bufferedImage.getWidth (); ความสูง int = bufferedImage.getheight (); System.out.println ("ความกว้าง:" + width + ", ความสูง:" + ความสูง); int halmaxsum = 0; int halmaxCount = 0; int halmaymax = 0; int boardx = 0; int boardy = 0; // ถ่ายโอนคะแนนพิกเซลจากภาพหน้าจอจากบนลงล่างและใช้สีของชิ้นหมากรุกเป็นพื้นฐานสำหรับการจดจำตำแหน่ง ในที่สุดค่าเฉลี่ยของพิกเซลทั้งหมดในแถวต่ำสุดของสีชิ้นหมากรุกจะถูกนำออกมานั่นคือคำนวณพิกัดของชิ้นหมากรุกสำหรับ (int y = gamescorebottomy; y <ความสูง; y ++) {สำหรับ (int x = 0; x <width; x ++) {processrgbinfo int rvalue = this.rgbinfo.getRvalue (); int gvalue = this.rgbinfo.getGvalue (); int bvalue = this.rgbinfo.getBvalue (); // ระบุตำแหน่งของชิ้นหมากรุกตามสีของ RGB ถ้า (rvalue> 50 && rvalue <60 && gvalue> 53 && gvalue <63 && bvalue> 95 && bvalue <110) {halmaxsum += x; Halmaxcount ++; // y ค่าพิกัดของแถวล่างของชิ้นหมากรุก halmaymax = y> halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxcount! = 0) {// x ค่าพิกัดของแถวล่างของชิ้นหมากรุก int int halmax = halmaxsum /halmaxcount; // ย้ายครึ่งหนึ่งของแชสซีชิ้นหมากรุกสูงขึ้น int halmay = halmaymax - halfbaseboardheight; // เริ่มจาก gamescoreBottomy สำหรับ (int y = gamescoreBottomy; y <ความสูง; y ++) {processrgbinfo (bufferedimage, 0, y); int lastpixelr = this.rgbinfo.getRvalue (); int lastpixelg = this.rgbinfo.getGvalue (); int lastpixelb = this.rgbinfo.getBvalue (); // ตราบใดที่ค่า boardx ที่คำนวณได้มากกว่า 0 นั่นหมายความว่าค่าพิกัดศูนย์ X ของสปริงบอร์ดถัดไปได้รับ if (boardx> 0) {break; } int boardxsum = 0; int boardxCount = 0; สำหรับ (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 (); // ฝึกอบรมกรณีที่หัวของชิ้นหมากรุกสูงกว่ากระดานกระโดดถัดไปถ้า (math.abs (x - halmax) <halmabodywidth) {ดำเนินการต่อ; } // สแกนจากบนลงล่างไปยังตำแหน่งจุดสุดยอดของสปริงกระดานถัดไป กระดานกระโดดน้ำถัดไปอาจเป็นวงกลมหรือกล่อง ใช้หลายคะแนนและค้นหาค่าเฉลี่ย if ((math.abs (Pixelr - lastpixelr) + Math.Abs (Pixelg - LastPixelg) + Math.Abs (Pixelb - LastPixelb))> 10) {boardxsum + = x; BoardxCount ++; }} if (boardxsum> 0) {boardx = boardxsum / boardxcount; }} // จากมุมจริงค้นหาพิกัดใกล้กับศูนย์กลางของบอร์ดถัดไป 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]; // ผลการพิกัด X [0] = Halmax; // ผลพิกัด y [1] = Halmay; // ผลการประสานงาน x [2] = boardx; // ผลพิกัด y [3] = boardy; ผลการกลับมา; }} return null; } / ** * เรียกใช้คำสั่ง * * @param คำสั่ง * @author leeho * @update 31 ธันวาคม 2017 เวลา 12:13:39 น ลอง {process = runtime.getRuntime (). exec (คำสั่ง); System.out.println ("คำสั่งเริ่มต้น:" + คำสั่ง); process.waitfor (); bufferedReader bufferedReader = ใหม่ bufferedReader (ใหม่ inputStreamReader (process.getErrorStream ())); สตริงบรรทัด = bufferedReader.readline (); if (line! = null) {system.out.println (บรรทัด); } system.out.println ("คำสั่ง exec end:" + คำสั่ง); } catch (exception e) {e.printstacktrace (); } ในที่สุด {ถ้า (กระบวนการ! = null) {process.destroy (); }}} / ** * ADB ได้รับภาพหน้าจอ Android * * @author leeho * @update 31 ธันวาคม 2017 เวลา 12:11:42 PM * / โมฆะส่วนตัว ExecuteadBcaptureCommands () {สำหรับ (สตริงคำสั่ง: ADB_SCREEN_CAPTURE_CMDS) }} / ** * กระโดด * * @param ระยะทาง * @author leeho * @update 31 ธันวาคม 2017 เวลา 12:23:19 น. * / โมฆะส่วนตัว Dojump (ระยะทางสองเท่า) {System.out.println ("ระยะทาง:" + ระยะทาง); // คำนวณเวลากด, ขั้นต่ำ 200ms int press = (int) math.max (ระยะทาง * presstimecoefficient, 200); System.out.println ("Presstime:" + PressTime); // ดำเนินการกดสตริงการดำเนินการ = string.format ("ADB เชลล์อินพุต swipe %s %s %s %s %s", swipex, swipey, swipex, swipey, presstime); System.out.println (คำสั่ง); ExecuteCommand (คำสั่ง); } / ** * เกมอื่น * * @author leeho * @update 31 ธันวาคม 2017 เวลา 12:47:06 น. * / โมฆะส่วนตัว replayGame () {สตริง Command = String.format ("ADB เชลล์อินพุตแตะ %S %S", Swipex, Swipey); ExecuteCommand (คำสั่ง); } / ** * คำนวณระยะทางของการกระโดดนั่นคือระยะทางระหว่างสองจุด * * @param halmax * @param halmay * @param boardx * @param boardy * @return * @author leho * @update 31 ธันวาคม 2017 เวลา 12:27:30 น. Math.sqrt (Math.pow (Math.Abs (BoardX - Halmax), 2) + Math.pow (Math.Abs (Boardy - Halmay), 2)); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {ไฟล์ retoredir = ไฟล์ใหม่ (store_dir); ถ้า (! if (! flag) {system.err.println ("สร้างไดเรกทอรีการจัดเก็บภาพล้มเหลว"); กลับ; }} jumpjumphelper jumpjumphelper = ใหม่ jumpjumphelper (); // จำนวนการดำเนินการ int executeCount = 0; สำหรับ (;;) {// เรียกใช้คำสั่ง ADB เพื่อรับ Android Screenshot jumpjumphelper.executeadbcaptureCommands (); ไฟล์ currentImage = ไฟล์ใหม่ (store_dir, image_name); if (! currentImage.exists ()) {system.out.println ("รูปภาพไม่มีอยู่"); ดำเนินการต่อ; } ความยาวยาว = currentImage.length (); imageLength [executeCount % imageLength ความยาว] = ความยาว; // ตรวจสอบว่าคุณจำเป็นต้องเปิด jumpjumphelper.checkdoreplay () ใหม่หรือไม่; ExecuteCount ++; System.out.println ("CurrentThrow" + ExecuteCount + "Execution!"); // รับพิกัดตรงกลางของหมากรุกและแผ่นฐาน int [] ผลลัพธ์ = jumpjumphelper.gethalmaandboardxyvalue (currentImage); if (result == null) {system.out.println ("ผลลัพธ์ของวิธีการ gethalmaandboardxyvalue เป็นโมฆะ!"); ดำเนินการต่อ; } int halmax = ผลลัพธ์ [0]; int halmay = ผลลัพธ์ [1]; int boardx = ผลลัพธ์ [2]; int boardy = ผลลัพธ์ [3]; System.out.println ("Halmax:" + Halmax + ", Halmay:" + Halmay + ", boardx:" + boardx + ", boardy:" + boardy); // คำนวณระยะทางของการกระโดดสองครั้ง jumpdistance = jumpjumphelper.computejumpdistance (Halmax, Halmay, BoardX, Boardy); jumpjumphelper.dojump (jumpdistance); // อยู่ที่ 2.5 วินาทีในแต่ละเวลา TimeUnit.milliseconds.sleep (2,500); }} catch (exception e) {e.printstacktrace (); }} / ** * ตรวจสอบว่าคุณจำเป็นต้องรีสตาร์ท * * @author leeho * @update 31 ธันวาคม 2017 1:39:18 PM * / โมฆะส่วนตัว checkDorePlay () {ถ้า (imageLength [0]> 0 && imageLength [0] == imageLength [1] && imageLength [2] imageLength [3] && imageLength [3] == imageLength [4]) {// ซึ่งหมายความว่าขนาดภาพนั้นเหมือนกันสำหรับ 5 ครั้งติดต่อกัน คุณสามารถรู้ได้ว่าหน้าจอปัจจุบันอยู่ในอาร์เรย์เกมอื่นเติม (imageLength, 0); // จำลองและคลิกปุ่มเพื่อเริ่มเกม replaygame (); }} / ** * รับค่า rgb ของพิกัดที่ระบุ * * @param bufferedimage * @param x * @param y * @author leeho * @update 31 ธันวาคม 2017 เวลา 12:12:43 pm * / private processrgbinfo int pixel = bufferedimage.getRgb (x, y); // แปลงเป็นหมายเลข RGB this.rgbinfo.setrvalue ((Pixel & 0xff0000) >> 16); this.rgbinfo.setGvalue ((Pixel & 0xff00) >> 8); this.rgbinfo.setBvalue ((Pixel & 0xff)); } คลาส rgbinfo {private int rvalue; ส่วนตัว int gvalue; ส่วนตัว int bvalue; สาธารณะ int getRvalue () {return rvalue; } โมฆะสาธารณะ setrvalue (int rvalue) {rvalue = rvalue; } public int getGvalue () {return gvalue; } โมฆะสาธารณะ setGvalue (int gvalue) {gvalue = gvalue; } public int getBvalue () {return bvalue; } โมฆะสาธารณะ setBvalue (int bvalue) {bvalue = bvalue; } โมฆะสาธารณะรีเซ็ต () {this.rvalue = 0; this.gvalue = 0; this.bvalue = 0; -สำหรับเนื้อหาเพิ่มเติมคุณสามารถอ้างถึงหัวข้อพิเศษ "Jump on WeChat" เพื่อเรียนรู้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น