私は長い間、私のジャンプ結果を私の友人の輪に投稿してきました。今日、私は誤ってスコアを作るためにコードを使用した同僚のビデオを見ました。私はバイドゥに行き、コードを見ました(コードは最後にありました)。いくつかのひねりとターンの後、私はついに正常に走り、少し得点しました。
まず、手順について簡単に説明しましょう。
1。Baiduダウンロードスコアコード
2。ADBをインストールします
3.USBデバッグモードを使用してコンピューターに接続する電話を見つける
4. Wechat Miniプログラムを開始します
5. Eclipseでコードを実行します(ここでは、携帯電話の画面のサイズに応じてパラメーターを絶えずデバッグおよび変更する必要があります)
その結果、携帯電話の画面が自動的に押してチェスのピースをジャンプさせます。
質問について話しましょう:
1。ADB問題セットをインストールしてください:
ADBツールアドレスをダウンロードします
ここのデバイスマネージャーでは、他のデバイスにインストールされていない場合、ADBは感嘆符です。図に示すように、インストール後、ラインAndroidデバイスが表示されます。
インストールする場合は、ADB列を右クリックしてプロパティを選択し、次のインターフェイスがポップアップ表示されます。[ドライバーの更新]をクリックし、[コンピューターを参照]を選択し、プログラムを選択します(つまり、2番目のオプション)。現時点では、コンピューター上のブラウジドライバーオプションがポップアップし、インストールパッケージの場所を選択すると、すべてがリリースされ、インストールされます。
問題は次のとおりです。
インストール後、CMDコマンドウィンドウの下でADBを使用できますが、Eclipseでコードを実行することはまったく効果がありません(プログラムはエラーを報告せず、電話にスクリーンショットはありません)。その後、Eclipseコンソールは写真が存在しないことを示します。
現時点では、次の2つのディレクトリにインストールした2つの動的リンクライブラリをコピーする必要があります。(それらが見つからない場合は、Cドライブでグローバルに検索します)
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で実行すると、電話で現在の.png写真があることがわかります。
私はCDをSystem32に使用していて、インストールディレクトリ(C:/プログラムファイル(x86)/Thunder Network/Thunder/Program)を使用していることがわかりました。上記のコマンドをプログラムで正常に実行し、System32でエラーを報告しました。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -
ADBWINAPI.DLLがコンピューターから欠落しているため、このプログラムは開始できません。この問題を解決するために、プログラムを再インストールしてみてください。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
もちろん
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OK、これはSystem32のADBがADBWINAPI.DLL Dynamic Linkファイルを見つけることができないことを意味しますが、偶然にはディレクトリSyswow64を見たことは明らかです。そして、このディレクトリとはどういう意味ですか? OK、System32ディレクトリにコピーされた3つのファイルをコピーしてから、このディレクトリsyswow64にコピーして実行します。
質問2:オフラインのデバイス
CMDコマンドウィンドウでADBシェルを実行すると、エラーデバイスがオフラインになりました。 ADBのインストールに何か問題があると思いました。バイドゥがたくさんありました。 ADB Kill Server、ADB Remount、その他のコマンドを試しましたが、コードは /sdcard /であることがわかりました。これは外部SDカードであるべきだと思いました。道は間違っていますか? (私はVivo X9を使用しましたが、この電話には外部SDカードオプションがありません)。古い電話(vivo Y27)に変更した後、ADBシェルを実行できますが、 /sdcardは外部SDカードパスではなく、電話のUディスクパスです。
つまり、コードパスの問題ではないことを意味します。 ADBツールは古く、ADBバージョンにはバージョン1.0.26があると言われました。まあ、私はADBの新しいバージョンを見つけるのが面倒です。古いVivo Y27でデバッグしましたが、フラッシュできます。
私が学んだことをリストさせてください:
1. ADBがあることは知っています。ADBシェルを使用すると、電話のバッシュセッションが得られることも知っています。スクリーンショットを撮ることができ、ADB Pullを使用すると、電話からファイルを取得できます。公式ウェブサイトにもっとコマンドがある場合、読みすぎても覚えていません。
2。Javaがruntime.getRuntime()。exec()を使用して、元のコードでexec()を使用して、Windowsでシステムコマンドを呼び出すことを知ってください。
process = runtime.getRuntime()。exec(command); system.out.println( "exec command start:" + command); process.waitfor(); process.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new inputStreamReader(process.getErrorStream())); string line = bufferedreader.readline();
3.コードでは、スクリーンショットなどのRGB色の値を計算して画像を分析することを理解してください。
すべてのコード:
パッケージ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" rel = "external nofollow"ターゲット= "_blank"> https://zhuanlan.zhihu.com/p/3244473 < */ public class jumpjumphelper {private static final string image_name = "current.png"; private static final string store_dir = "d:/jump_screencapture"; //数量private private static final int imageLengthLength = 5; //画像のサイズprivate static final long [] imageLength = new long [imageLengthLength];プライベート最終rgbinfo rgbinfo = new rgbinfo();プライベートファイナルストリングパス= "/sdcard/tencent/customerpic/";プライベート最終文字列[] ADB_SCREEN_CAPTURE_CMDS = {"ADB SHELL SCREENCAP -P"+PATH+IMAGE_NAME、 "ADB PULL"+PATH+"CURRENT.PNG"+STORE_DIR}; //ゲームスコアディスプレイ領域の下部にあるy座標スクリーンショットのディスプレイ領域、300は1920x1080の値です。実際の状況に応じて、プライベートファイナルint gamescorebottomy = 300を変更します。 //プレスタイム係数は、特定の状況に従って適切に調整できます。プライベートファイナルダブルPressTimeCoefficient = 2.05; //プレスの開始ポイント座標は、次のゲームのプライベートファイナルint swipex = 280の出発点座標でもあります。プライベートファイナルint swipey = 600; //チェスピースのベースの高さはプライベートファイナルINT HALFBASEBOARDHEIGHT = 20です。 //チェスピースの幅はスクリーンショットから取得され、自分でプライベートファイナルイントを調整しますhalmabodywidth = 74; //ゲームスクリーンショットの2つのスプリングボードのミッドポイント座標は、主に角度の計算に使用されます。 XYの割合は、実際のスクリーンショットに基づいて計算できます。プライベートファイナルInt boardx1 = 813;プライベート最終int boardy1 = 1122;プライベートファイナルInt boardx2 = 310;プライベートファイナルイントボード2 = 813; / ** *次のスプリングボードのチェッカーとセンター座標を取得 * * @return * @author leeho * @throws ioexception * @update 2017年12月31日12:18:22 pm */ private int [] gethalmaandboardxyvalue(file currentimage)Throws ioException int width = bufferedimage.getWidth(); int height = bufferedimage.getheigh(); System.out.println( "width:" + width + "、height:" + height); int halmaxsum = 0; int halmaxcount = 0; int halmaymax = 0; int boardx = 0; int boardy = 0; //スクリーンショットからピクセルポイントを上から下に転送し、位置認識の基礎としてチェスピースの色を使用します。最後に、チェスピースの色の最低行のすべてのピクセルの平均値が取り出されます。つまり、チェスピースの座標を計算します(int y = gamescorebottomy; y <height; y ++){for(int x = 0; x <width; x ++){processrgbinfo(bufferedimage、x、y); int rvalue = this.rgbinfo.getrvalue(); int gValue = this.rgbinfo.getGValue(); int bvalue = this.rgbinfo.getBValue(); // RGBの色に応じてチェスピースの位置を識別します。 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(); //計算されたBoardX値が0より大きい限り、次のスプリングボードの中心調整x値が取得されたことを意味します。 if(boardx> 0){break; } int boardxsum = 0; int boardxcount = 0; for(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(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コマンド * @author leeho * @update 2017年12月31日12:13:39 pm * / private void executecommand(string command){process process = null; try {process = runtime.getRuntime()。exec(command); system.out.println( "exec command start:" + command); process.waitfor(); process.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new inputStreamReader(process.getErrorStream())); string line = bufferedreader.readline(); if(line!= null){system.out.println(line); } bufferedReader = new BufferedReader(new inputStreamReader(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(); }最後に{if(process!= null){process.destroy(); }}} / ** * ADBはAndroid Screenshots * * @author leeho * @update 2017年12月31日12:11:42 PM * / private void executeadbcapturecommands(){for(string:adb_screen_capture_cmds){execumommand(command); }} / ** *ジャンプ * * @param距離 * @author leeho * @update 2017年12月31日12:23:19 pm * / private void dojump(double.out.println( "距離:" +距離); //プレス時間を計算する、最小200ms int presstime =(int)math.max(distance * presstimecoefficient、200); system.out.println( "presstime:" + presstime); //プレス操作string string command = string.format( "adbシェル入力スワイプ%s%s%s%s"、swipex、swipey、swipex、swipey、presstime); System.out.println(command); executeCommand(コマンド); } / ** *別のゲーム * * @author leeho * @update 2017年12月31日12:47:06 pm * / private void replaygame(){string command = string.format( "adb shell input tap s%s"、swipex、swipey); executeCommand(コマンド); } / ** *ジャンプの距離、つまり2つのポイント間の距離を計算します。つまり、2つのポイント間の距離 * * * @param Halmay * @Param Boardx * @Param Boardy * @return * @author leeho * @update 2017年12月31日午後12時27分30分 * 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(command); // // if(true){return;} try {file storedir = new file(store_dir); if(!storedir.exists()){boolean flag = storedir.mkdir(); if(!flag){system.err.println( "画像ストレージディレクトリの作成に失敗した");戻る; }} //実行数inteceexecount = 0; for(;;){// ADBコマンドを実行してAndroidスクリーンショットjumpJumphelper.executeadbcapturecommands()を取得します;ファイルcurrentImage = new file(store_dir、image_name); if(!currentImage.exists()){system.out.println( "画像は存在しません");続く; } long length = currentImage.length(); ImageLength [executeCount%yumageLengthLength] = length; // jumpjumphelper.checkdoreplay()を再起動する必要があるかどうかを確認します。 executeCount ++; system.out.println( "currentth" + executecount + "execution!"); //チェッカーとベースプレートの中心座標を取得しますint [] result = jumpJumphelper.gethalmaandboardxyvalue(currentImage); if(result == null){system.out.println( "メソッドgethalmaandboardxyvalueの結果はnull!");続く; } int halmax = result [0]; int halmay = result [1]; int boardx = result [2]; int boardy = result [3]; System.out.println( "Halmax:" + halmax + "、halmay:" + halmay + "、boardx:" + boardx + "、boardy:" + boardy); //ジャンプの距離を計算しますDouble JumpDistance = JumpJumphelper.comPuteJumpDistance(halmax、halmay、boardx、boardy); JumpJumphelper.Dojump(JumpDistance); // timeUnit.milliseConds.sleep(2500)ごとに2.5秒間滞在します。 }} catch(例外e){e.printstacktrace(); }} / ** *再起動する必要があるかどうかを確認しますImageLength [3] == ImageLength [4]){//これは、5回連続で画像サイズが同じであることを意味します。現在の画面が別のラウンドの配列にあることを知ることができます。 //ボタンをシミュレートしてクリックしてゲームを開始し、再びrepraygame(); }} / ** *指定された座標のRGB値を取得 * * @param bufferedimage * @param x * @author leeho * @update 2017-02-31 12:12:43 PM * / private void processrgbinfo(bufferedimage bufferedimage、int x、int x、rgbint() 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; private int gValue; private 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をもっとサポートすることを願っています。