لقد قمت بنشر نتائج القفز في دائرة أصدقائي لفترة طويلة. اليوم رأيت بطريق الخطأ مقطع فيديو لزميل استخدم الكود لعمل الدرجات. ذهبت إلى بايدو ورأيت الرمز (كان الرمز في النهاية). بعد العديد من التحولات والمنعطفات ، ركضت أخيرًا بنجاح وسجلت قليلاً.
أولاً ، دعنا نتحدث بإيجاز عن الخطوات:
1. رمز نقاط تنزيل Baidu
2. تثبيت ADB
3. ابحث عن هاتف للاتصال بالكمبيوتر باستخدام وضع تصحيح USB
4. ابدأ برنامج WeChat Mini
5. قم بتشغيل الكود في Eclipse (هنا نحتاج إلى تصحيح المعلمات وتعديلها باستمرار وفقًا لحجم شاشة الهاتف المحمول)
والنتيجة هي أن شاشة هاتفك ستضغط تلقائيًا وترك قطعة الشطرنج تقفز.
دعونا نتحدث عن السؤال:
1. قم بتثبيت مجموعة مشكلة ADB:
تنزيل عنوان أداة ADB
في مدير الأجهزة هنا ، إذا لم يتم تثبيته على أجهزة أخرى ، فإن ADB هو علامة تعجب. بعد التثبيت ، كما هو موضح في الشكل ، سيظهر جهاز Android الخط.
إذا قمت بتثبيته ، انقر بزر الماوس الأيمن في عمود ADB لتحديد الخصائص ، ونقر فوق الواجهة التالية ، انقر فوق تحديث برنامج التشغيل ، وحدد Browse Computer وتحديد البرامج (أي الخيار الثاني). في هذا الوقت ، سيظهر خيار برنامج تشغيل Browse على الكمبيوتر ، وتحديد موقع حزمة التثبيت ، ثم سيتم إصدار كل شيء للتثبيت.
السؤال هو:
بعد التثبيت ، يمكنك استخدام ADB ضمن نافذة أمر CMD ، ولكن تشغيل الكود في Eclipse ليس له أي تأثير على الإطلاق (لا يبلغ البرنامج عن خطأ ، ولا توجد لقطات شاشة على الهاتف) ، ثم توضح وحدة التحكم Eclipse أن الصورة غير موجودة.
في هذا الوقت ، تحتاج إلى نسخ مكتبات الرابط الديناميكيين التي قمت بتثبيتها في الدليلين التاليين: (إذا لم تتمكن من العثور عليها ، ابحث على مستوى العالم على محرك الأقراص)
adb.exe
adbwinapi.dll
adbwinusbapi.dll
C:/Windows/System32
C:/Windows/Syswow64
في هذا الوقت ، يجب وضعه تحت syswow64. أنا Win7 64 بت ، لذلك هناك هذا الدليل (يقول أشخاص آخرون على الإنترنت أن Win32 لا يحتاج إلى وضع هذا ، لم أجربه).
إذا لم يتم وضع دليل Syswow64 ، فلا يزال للعملية Eclipse أي تأثير في هذا الوقت: ولكن إذا قمت بتشغيل ADB shell screencap -p /sdcard/tencent/customerpic/current.png أمر في CMD ، فستجد أنه سيكون هناك صورة الحالية.
اكتشفت أنني كنت أستخدم CD إلى System32 وتحت دليل التثبيت (C:/Program Files (x86)/Thunder Network/Thunder/Program) ، لقد نجحت في تشغيل الأمر أعلاه في البرنامج ، وأبلغت عن خطأ في System32:
------------------------------------------------------------------------------------------------------------------------------------
لا يمكن بدء هذا البرنامج لأن adbwinapi.dll مفقود من الكمبيوتر. حاول إعادة تثبيت البرنامج لحل هذه المشكلة.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
بالتأكيد
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
حسنًا ، هذا يعني أن ADB في System32 لا يمكنه العثور على ملف الارتباط الديناميكي Adbwinapi.dll ، لكن من الواضح أنه ، عن طريق الصدفة ، رأيت الدليل Syswow64 ، وماذا يعني هذا الدليل وماذا يعني؟ حسنًا ، انسخ الملفات الثلاثة التي تم نسخها إلى دليل System32 ثم نسخها إلى هذا الدليل Syswow64 ، وإنجازه.
السؤال 2: الجهاز غير متصل
أدى تشغيل ADB shell في نافذة أمر cmd إلى جهاز خطأ في وضع عدم الاتصال. اعتقدت أن هناك خطأ ما في تثبيت ADB الخاص بي. كان لدي الكثير من بايدو. لقد جربت ADB Kill Server و ADB Remount وغيرها من الأوامر ، لكنني وجدت أن الكود كان /sdcard /. رأيت أن هذا يجب أن يكون بطاقة SD خارجية. هل الطريق خاطئ؟ (لقد استخدمت Vivo X9 ، وهذا الهاتف لا يحتوي على خيار بطاقة SD خارجي). بعد التغيير إلى هاتف أقدم (Vivo Y27) ، يمكنني تشغيل ADB Shell ، لكن /sdcard ليس مسارًا خارجيًا لبطاقة SD ، ولكن مسار قرص U للهاتف.
هذا يعني أنه لا ينبغي أن يكون مشكلة مسار الكود. قيل لي إن أداة ADB قديمة جدًا وأن إصدار ADB يحتوي على الإصدار 1.0.26. حسنًا ، أنا كسول جدًا للعثور على الإصدار الجديد من ADB. لقد قمت بتصحيحها مع Vivo Y27 القديم ويمكن وميضه.
اسمحوا لي أن أدرج ما تعلمته:
1. أعلم أن هناك ADB ، وأنا أعلم أيضًا أن استخدام قذيفة ADB يمكن أن يحصل على جلسة باش للهاتف. يمكنك التقاط لقطات شاشة ، ويمكن استخدام ADB Pull الحصول على ملفات من الهاتف. إذا كان هناك المزيد من الأوامر على الموقع الرسمي ، فلا يمكنني تذكرها حتى لو قرأتها أكثر من اللازم.
2. اعلم أن Java تستخدم وقت التشغيل.
Process = Runtime.getRuntime (). exec (command) ؛ System.out.println ("exec command start:" + command) ؛ process.WAITFOR () ؛ process.getInputStream () ؛ BufferedReader BufferedReader = جديد BufferedReader (New InputStreamReader (Process.geterRorStream ())) ؛ خط السلسلة = bufferedReader.ReadLine () ؛ 3. فهم أنه في الكود ، قم بتحليل صورة عن طريق حساب قيمة لون RGB لقطة الشاشة ، وما إلى ذلك ، int pixel = bufferedImage.getRgb (x ، y) ؛
جميع الرموز:
حزمة com.lw.test ؛ استيراد 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 */ الفئة العامة jumpjumphelper {private static final string image_name = "current.png" ؛ Static Final String store_dir = "d:/jump_screencapture" ؛ // Quantity Private Static Final ImmeLengthLength = 5 ؛ // حجم الصورة الخاصة الطويلة الثابتة الطويلة [] نهائي خاص rgbinfo rgbinfo = جديد rgbinfo () ؛ PRIGY Final String path = "/sdcard/tencent/customerpic/" ؛ سلسلة نهائية خاصة [] adb_screen_capture_cmds = {"adb shell screencap -p" path+phick_name ، "ADB سحب"+path+"current.png"+store_dir} ؛ // تنسيق Y في أسفل منطقة عرض نقاط اللعبة في لقطة الشاشة ، 300 هي قيمة 1920 × 1080. تعديل Final Final Int GamesCorebottomy = 300 وفقًا للوضع الفعلي ؛ // يمكن تعديل معامل وقت الصحافة بشكل مناسب وفقًا للوضع المحدد ؛ Private Double PressTimeCoeeffice = 2.05 ؛ . نهائي خاص int swipey = 600 ؛ // ارتفاع قاعدة قطعة الشطرنج هو النهائي الخاص int halfbaseboardheight = 20 ؛ // يتم أخذ عرض قطعة الشطرنج من لقطة الشاشة وضبط النهائي الخاص من قبل نفسك Halmabodywidth = 74 ؛ // تُستخدم إحداثيات نقطة الوسط من اللوحة النابضة في لقطة الشاشة بشكل أساسي لحساب الزاوية. يمكن حساب نسبة XY بناءً على لقطة الشاشة الفعلية. Final Final BoardX1 = 813 ؛ نهائي خاص int boidy1 = 1122 ؛ Private Final BoardX2 = 310 ؛ نهائي خاص int boidy2 = 813 ؛ / ** * احصل على الداما والإحداثيات المركزية للبطولة التالية * * return * author leeho * throws ioException * update 31 ديسمبر 2017 في الساعة 12:18:22 PM */ private int [] gethalmaandboardboardxyvalue (file currentimage) throws ioexception {bufferediMage. عرض int = bufferedImage.getWidth () ؛ ارتفاع int = bufferedimage.getheight () ؛ System.out.println ("العرض:" + width + "، الارتفاع:" + الارتفاع) ؛ int halmaxsum = 0 ؛ int halmaxcount = 0 ؛ int halmaymax = 0 ؛ int boardx = 0 ؛ int حدود = 0 ؛ // نقل نقاط البيكسل من لقطة الشاشة من أعلى إلى أسفل ، واستخدم لون قطعة الشطرنج كأساس للتعرف على الموضع. أخيرًا ، يتم إخراج متوسط القيمة لجميع وحدات البكسل على أدنى صف من لون قطعة الشطرنج ، أي حساب إحداثيات قطعة الشطرنج لـ (int y = gamescoreBottomy ؛ y <height ؛ y ++) {for (int x = 0 ؛ x <width ؛ x ++) {processRgbinfo (pufferedimage ، x ، y) ؛ 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 halmax = halmaxsum /halmaxcount ؛ // حرك نصف ارتفاع هيكل الشطرنج في int halmay = halmaymax - halfbaseboardheight ؛ // ابدأ من gamescorebottomy لـ (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 () ؛ // طالما أن قيمة اللوحة المحسوبة أكبر من 0 ، فهذا يعني أنه تم الحصول على قيمة X Center Costinate 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) {متابعة ؛ }. قد يكون النقل التالي دائرة أو صندوقًا. خذ نقاط متعددة وابحث عن المتوسط إذا (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] = حدود ؛ نتيجة العودة }} الإرجاع null ؛ } / ** * قم بتنفيذ الأمر * * param command * Author leeho * update 31 ديسمبر 2017 في الساعة 12:13:39 PM * / private void executeCommand (string command) {Process Process = null ؛ حاول {process = runtime.getRuntime (). exec (command) ؛ System.out.println ("exec command start:" + command) ؛ process.WAITFOR () ؛ process.getInputStream () ؛ BufferedReader BufferedReader = جديد BufferedReader (New InputStreamReader (Process.geterRorStream ())) ؛ خط السلسلة = bufferedReader.ReadLine () ؛ if (line! = null) {system.out.println (line) ؛ } bufferedReader = جديد bufferedReader (new inputStreamReader (process.getInputStream ())) ؛ خط سلسلة 02 = bufferedReader.ReadLine () ؛ if (line02! = null) {system.out.println (line02) ؛ } system.out.println ("exec command End:" + command) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {if (process! = null) {process.destroy () ؛ }}} / ** * ADB يحصل على لقطات شاشة Android * * Author leeho * update 31 ديسمبر ، 2017 12:11:42 PM * / private void executeAdbCaptUreCommands () {for (string command: ADB_SCREN_CAPTICTER_CMDS) {executecmand (command) ؛ }} / ** * Jump * * param المسافة * Author Leeho * update 31 ديسمبر 2017 في 12:23:19 PM * / private void dojump (مسافة مزدوجة) {system.out.println ("المسافة:" + المسافة) ؛ ] System.out.println ("pressTime:" + pressTime) ؛ // قم بتنفيذ الأمر PRESS OPERSE string = string.format ("adb shell إدخال Swipe ٪ s ٪ s ٪ s ٪ s" ، swipex ، swipey ، swipex ، swipey ، presstime) ؛ system.out.println (command) ؛ التنفيذي (Command) ؛ } / ** * لعبة أخرى * * Author Leeho * update 31 ديسمبر 2017 في 12:47:06 PM * / private void replaygame () {string command = string.format ( التنفيذي (Command) ؛ } / ** * احسب مسافة القفزة ، أي المسافة بين نقطتين * * param halmax * param halmay * param boardx * param boardy * @return * uthor leeho * update 31 ، 2017 في 12:27:30 مساءً Math.Sqrt (Math.Pow (Math.ABS (Boardx - Halmax) ، 2) + Math.Pow (Math.abs (Boardy - Halmay) ، 2)) ؛ } Main static void Main (String [] args) {JumpJumphelper JumpJumphelper = new JumpJumphelper () ؛ // string command = "adb shell screencap -p" + JumpJumphelper.path + image_name ؛ ////command = "أجهزة ADB" ؛ // jumpjumphelper.executecommand (command) ؛ // // if (true) {return ؛} حاول {file storedir = file new (store_dir) ؛ if (! storedir.exists ()) {boolean flag = storedir.mkdir () ؛ if (! flag) {system.err.println ("فشل إنشاء دليل تخزين الصور") ؛ يعود؛ }} // عدد عمليات الإعدام int executeCount = 0 ؛ لـ (؛؛) {// تنفيذ أمر ADB للحصول على شاشة Android jumpjumphelper.executeadbcaptureCommands () ؛ ملف currentImage = ملف جديد (store_dir ، image_name) ؛ if (! currentimage.exists ()) {system.out.println ("الصورة غير موجودة") ؛ يكمل؛ } طول طويل = currentimage.length () ؛ LeachEllength [executeCount ٪ ImageLengthLength] = الطول ؛ // تحقق مما إذا كنت بحاجة إلى إعادة تشغيل jumpjumphelper.checkdoreplay () ؛ executeCount ++ ؛ System.out.println ("CurrentTh" + ExecuteCount + "التنفيذ!") ؛ // احصل على إحداثيات مركزية من الداما واللوحة الأساسية int [] النتيجة = jumpjumphelper.gethalmaandboardxyvalue (currentImage) ؛ if (result == null) {system.out.println ("نتيجة الطريقة gethalmaandboardxyvalue فارغة!") ؛ يكمل؛ } int halmax = result [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 ثانية في كل مرة timunit.milliseconds.sleep (2500) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }} / ** * تحقق مما إذا كنت بحاجة إلى إعادة تشغيل * * Author leeho * update 31 ديسمبر ، 2017 1:39:18 pm * / private void checkdoreplay () {if (simeLength [0]> 0 && ickeLength [0] == limeLength [1] ImageLength [3] == ImageLength [4]) {// هذا يعني أن حجم الصورة كان هو نفسه لمدة 5 مرات متتالية. يمكنك معرفة أن الشاشة الحالية موجودة في جولة أخرى من المصفوفات. // محاكاة وانقر فوق الزر لبدء اللعبة مرة أخرى ReplayGame () ؛ }} / ** * احصل على قيمة rgb للإحداثيات المحددة * * param bufferedImage * param x * param y * author leeho * update 2017-02-31 12:12:43 pm * / private void processrgbinfo (bufferedimageageage ، int int pixel = bufferedImage.getrgb (x ، y) ؛ // تحويل إلى RGB Digit this.rgbinfo.setrvalue ((Pixel & 0xFF0000) >> 16) ؛ this.rgbinfo.setgvalue ((pixel & 0xff000) >> 8) ؛ this.rgbinfo.setbvalue ((pixel & 0xff)) ؛ } class rgbinfo {private int rvalue ؛ خاص int gvalue ؛ خاص 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 ؛ }}}بالطبع ، سيتم مسح النتائج بعد فترة من الوقت ، ولكن كمبرمجة ، لا تزال جيدة. من قابلية التقديم الأولية بعد تقديمها ، طُلب من الكمبيوتر الحصول على الحزم وتعديل البيانات كعامل. الآن يحاكي الرمز النقرات (على الرغم من أنه لن يصبح ساري المفعول.)
لمزيد من المحتوى ، يمكنك الرجوع إلى الموضوع الخاص "Jump on WeChat" للتعلم.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.