40

ボットはどのように機能しますか? キーが押された、またはマウスがクリックされたことをビデオ ゲームに伝えますか?

そうでない場合、プログラムに別のプログラムにキーが押されたことを伝える方法はありますか? ゲームに勝つためのプログラムを作りたいです。したがって、リソースや例は大歓迎です。

更新: 1 つの方法はキーストロークをエミュレートすることですが、これを行う方法は何ですか (任意の言語で)?

4

11 に答える 11

53

私はこれまでに (Pogo ゲームから Yohoho Puzzle Pirates まで) たくさんのボットを作成してきました。ウィンドウの場合、通常、Win32 イベントを送信してマウスの動きをシミュレートするか、マウスが実際にクリックされたときにウィンドウ間で送信される実際には低レベルのメッセージを偽装します。その多くは、プログラムがどのように反応するかに大きく依存します (座標付きのメッセージを受け入れるか、Java の場合はマウスの座標をすぐに読み取る)。「自動化」の部分は通常、画面を読み取り、状態を判断するためのヒューリスティックまたはアルゴリズムを作成することを伴いますが、パケット スニッフィング (貧弱なポーカーの実装では多くの情報がそこにある) と同じくらい優れていることもあれば、メモリ位置を直接読み取ることと同じくらいハックなこともあります。かなり大きな「フィールド」であり、かなり収益性が高く、参入するのが難しくないため、文書化が不十分です。

入力の送信

C/C++ (Windows)

キーについては、CodeProject を試してください。

http://www.codeproject.com/KB/cpp/sendkeys_cpp_Article.aspx

そしてメッセージ:

http://www.codeproject.com/KB/threads/sendmsg.aspx

あなたの最善の策は、Win32 API を使用してメッセージを送信する方法を学び、Spy++ またはその派生物を使用して、KeyPresses とマウスの動きがウィンドウに送信される方法を「リバース エンジニアリング」することです。

ジャワ

Java には、次のことができる驚くほど移植性の高い Robot クラスがあります。

  1. 画面からピクセルを読み取ります。
  2. マウスを制御します。
  3. キーを送信します。

迅速かつ簡単に探しているなら、私はそれを試してみます。

基本ロジック

これについては、インターネット上の別の場所で詳細に説明されていますが、ほとんどのボットは単純なステート マシン プログラム フローに従います。画面 (またはパケット、またはメモリ) を読み取り、読み取り値と過去のデータに基づいて現在の "状態" を見つけ、計算を行い、結果をプログラムに送り返します。

画面を読むのは難しいかもしれませんが、多くの場合、プログラムがどのような状態にあるかを知るためのウィンドウに関連する「幸運な」ピクセルがいくつかあることを考慮すると、読みやすくなります。これらのピクセルの検索は自動化できます。

于 2009-06-23T13:18:00.087 に答える
6

ボットにはいくつかの種類があります。CSで遊んでいた頃の記憶より(大昔)

一部のボットは、アプリケーション自体のライブラリを使用して環境 (マップ、プレーヤーの場所など) を検査します。ボットはライブラリを使用して動きを制御します。ゲームに移動方法などを伝えるためにマウスメッセージを呼び出すボットの実装がたくさんあるとは思いません...

一部のボットは、アプリケーション レベルのプロトコルをエミュレートします (マルチプレイヤーの場合)。つまり、ゲームを実行する必要さえありません。ボットは仮想ゲームで実行できます。

他の 1 人の投稿者が示唆していたことに反論します。ゲーム ボットを作成することは、実際にゲームをプレイするよりも価値のある作業であり、それらがどのように機能するかについて興味を持っていることは良い兆候です。:)

于 2009-06-23T13:12:37.337 に答える
4

一部のプログラム (MMORPG であなたのためにグラインドするプログラムなど) は、単にキーストロークをエミュレートしているだけです。これを行うツールがAutoItです。

実際にゲーム自体をプレイするボットに関しては、私は実際には何もしていませんが、ある種の事前定義された一連のアクション、おそらくヒューリスティックを使用すると想定していますが、そうではありません.

于 2009-06-23T13:13:22.327 に答える
4

このコンセプトの最大の欠点は、入力ではなく、ゲームの出力です。ボットはランダムにキーを押すだけではなく、何が「起こっている」かを知る必要があります。非常にトリッキーな問題を解決するためにボットを残すこのデータをクエリできるゲームはほとんどありません - 毎秒 60 フレームの 2D ビジュアル データを仮想空間に変換します。

実際、ボット プレイヤーを許可するだけでなく、ボット プレイヤーを奨励するゲームもあります。Open RTSはその 1 つですが、 GUN-TACTYXcrobotsのような単純なものもあり、出発点として適しています。

于 2009-06-23T13:21:45.603 に答える
2

あなたが説明したようなボットは、キーの押下とマウスの動き/クリックを単にエミュレートするため、ゲームは人間がプレイしているか別のプログラムをプレイしているかを判断できません。ゲームとのインターフェースはまったく必要ありません。

于 2009-06-23T13:13:08.960 に答える
2

ボットは、ゲーム (サーバー) のクライアントとして機能します。その後、ユーザーが手動で送信するのと同じように、適切なデータを送信できます。ボット(クライアント)は、サーバーからのデータを分析します(「誰かが左から攻撃しようとしています」)など。その後、クライアントは最適な動きを計算し、適切なデータをサーバーに送信して実行できるようにする必要があります。

これがすべてのゲームで機能するかどうかはわかりません。

于 2009-06-23T13:15:07.583 に答える
2

それはゲームに大きく依存します。たとえば、インターネット エクスプローラーの activeX を使用して動きを自動化する Travian (オンライン ゲーム) のボットを作成しました。私は C# でアプリケーションを作成しましたが、実行に約 30 分かかりました。ActiveX のメソッドを呼び出して、テキスト フィールドへの入力やボタンのクリックなどを実行するのは簡単です。たとえば、ログインには次を使用しました:

var inputs = web.Document.GetElementsByTagName("input").
                        Cast<HtmlElement>();
var nume = inputs.First(h => h.GetAttribute("type") == "text");
var pass = inputs.First(h => h.GetAttribute("type") == "password");
var login = inputs.First(h => h.GetAttribute("type") == "image");
var form = web.Document.GetElementsByTagName("form")[0];

nume.SetAttribute("value", "user");
pass.SetAttribute("value", "pass");
login.InvokeMember("Click");

デスクトップベースのゲームでは、より複雑になります。Windowsでは、あるアプリケーションが別のアプリケーションにメッセージを送信できるので、それを使用してゲームにメッセージを送信できると思います(ただし、入力にdirectXを使用するゲームでこれが機能するかどうかはわかりません)

于 2009-06-23T13:24:29.543 に答える
2

「プログラムを制御する」と言うときは、プログラムがどのように制御されるかを考えてください。ほとんどの場合、キーボード/マウス入力を受け入れます。

キーボード/マウス入力をシミュレートするプログラムを作成する場合は、そこに行きます。

これに対する当然の帰結は、プログラムが入力ボックスを介して渡された引数を受け入れる場合、入力ボックスを介して送信されたかのように引数を送信するプログラムを作成することです。

これがすべてのボットの仕組みです。それがあなたに光を当てることを願っています!

編集: これはボットの大部分がどのように機能するかです:-)

于 2009-06-23T13:31:39.327 に答える