1つのポーカーボットの物語

ポーカーボットを書く可能性はもはや疑いの余地はありません(Hackerマガジンには一連の記事もあります)が、2008年にはすべてがそれほど明白ではなく、見つけることができるのは一般的なアイデアのみを説明する1つの英語の記事でした私たちのプロジェクトに慣れることはありませんでした。 しかし今でも、成功したストーリーを共有する人はほとんどいません。

この記事では、実際のポーカールームで実際にテストされ、負けずにプレーすることを学んだボットの開発における経験について説明します。 ボットを作成しようとしている人は、記事で興味深いことや人生を楽にする方法を見つけるでしょう。 誰が気にします-猫へようこそ。



すべての始まり



ボットを書くというアイデアは私の友人が訪問しました。友人はそれを私と私の寮の隣人と共有しました。実際、友人自身も寮にいました。

役割は次のように分けられました。

•ロジック開発者(アイデアの著者)

•パーサー開発者(隣人)

•目と手の開発者

リミットホールデム用のボットを作成することが決定されました(このアイデアの作者は、この特定の種類のゲームをプレイしてお金を稼いでいました)

そのような構成で、そのような役割で、私たちは戦いに移りました。 その結果、3〜4か月で開発の中断が3回繰り返されました。詳細を忘れずに思い出してみます。



反復1



なんという時間だった。 3人の緑の学生が考え始めました。 ツールが必要でしたが、最初は次の選択肢がありました。

•C ++-ゲームのロジック

•VB.Net-その他

しかし、数時間の開発の後、C#を学ぶ必要があると判断し、BASICの代わりにC#を使用し始めました。

残念ながら、C ++ DLLの頭脳については何も語ることができず、誰も思い出せない(誰も覚えていない)ので、著者でさえ混乱し、時にはそれを疑問に思った絶対的な地獄があったことを覚えている何かが誤って機能する/機能しない。

テスト用に選んだポーカールームには優れたチャットがあり、そこから何が起こっているかを分析するために情報を取得することが決定されました。 この分析は私の隣人によって取り上げられました。

私は彼に時間通りにチャットをする方法を学ぶ必要がありました、それは時間通りに来るときを理解するために残りました。

したがって、対処する必要がある最初の問題は次のとおりです。

•すべてのウィンドウから必要なシステムを見つける方法は?

•歩く時だと理解する方法は?

•歩く方法は?

•チャットを取得する方法は?

以下で問題を解決する方法について詳しく説明します(その順序で解決したのではないかという感覚があります)。



歩く時間だということを理解するには?


その時、WinApiについて何か聞いたことがありますが、それはどんな動物で、どのように訓練するのか-私は知りませんでした。 すぐに、この謎のハンドルを使用して、ウィンドウについて多くのことを学び、多くのことを行うことができることを知りました。また、ウィンドウを適切に監視できることも学びました。 Spy ++で武装した私は、窓に十字架を向けることで、ハンドルのまだ単純な認識の世界に突入しました)))

喫煙マヌルネコは、デスクトップ上のドットの色と、マウスがクリックしたことをシステムに伝えることができるものを尋ねることができることを私に知らせました。

問題の解決策が明らかになりました。

1.ボタンが表示されたものを見つけることができる色のポイントを探しています(つまり、歩く時間です)

2.ウィンドウの座標を取得し、

3.決定するポイントの座標と合計する

4.常にウィンドウをアクティブにし、ポイントの色を確認します

5.色が必要になったら-歩く時間です



チャットを取得する方法は?


Spy ++の使用方法を既に知っているため、ハンドルを見つけるのは簡単でした。 再び喫煙した後、Ctrl + A、Ctrl + Cをウィンドウに送信する方法を理解しました。 次に、C#を使用して、バッファーの内容を受け取りました。 チャットは



歩き方


歩く時間であると理解する方法を決定しながら、歩く方法が明らかになりました。 ボタンの座標を計算し、ポイントにカーソルを置き、マウスの左ボタンをシステムに送信します。 彼らはそうでした。



すべてのウィンドウから必要なシステムを見つける方法は?


この問題は最も困難であることが判明しました-C#/ C ++の先生(Chernosvitov A.V.に感謝)に目を向けるまで長い間解決できず、彼はEnumWindowsProc関数などを思い出しました。 Spy ++を使用して、ウィンドウの機能を探しましたが、最終的にタイトルはそのような機能であることが判明しました。ちなみに、ウィンドウハンドルからも取得できます。その後、EnumChildWindowsProc(すべての子ウィンドウの列挙)を使用してチャットが見つかりました。



反復結果1


最初の反復の後、リミットホールデムをプレイし、歩き方を知り、歩き方を知ったボットを得ました。 彼にはいくつかの論理がありました。 彼は一人でしかプレイできず、テスト対象のコンピューターを完全にブロックしました(各アクションの前にウィンドウに常に切り替えていたため)。



反復2



数か月後、プロセスを高速化するために、もう一度書くことにしました。コンピューターを1つの部屋にまとめて、そこで作業することにしました。

この反復中に実行されました:

•1つの言語への移行-完全にC#に移行しました。

•anlimトーナメントへの移行

•ネジ止めされた多くのテーブル

•システムフックを使用して、歩く時間かどうかを判断しました

•チャット受信の改善

•移動メカニズムの改善



anlimトーナメントへの移行


ロジックはC#で書き直され、開始テーブルはpokerstrategy.comからトーナメントをプレイするために使用されたため、合理的でわかりやすいロジックを作成できました。 また、ロジックコンフィギュレータを作成する試みもありました(誰もが独自のロジックを作成できるようにボットを販売したかったのですが)が、それはユートピアであると判断し、アイデアの開発を中止しました。



多くのテーブルがねじ込まれている


新しいトランスペアレントロジックとともに、複数のテーブルでプレイする機能を追加しました。 そのような機会の実現は曲がってしまった-順番に、各テーブルは前景にあり、移動する必要があるかどうか色を確認します-歩く時が来たら、次に行きます。 しかし、そのような計画は機能し、勝利でした。 しかし今では、ボットはコンピューターを完全かつ厳密にブロックしました。



システムフックを使用して、歩く時間かどうかを判断しました


この時点で、私はすでにWindowsシステムフックを掘り下げるのに十分な強さでした。 C#はウィンドウに着信するメッセージのシステムフックをハングアップしないため、CodeProject(http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx)のプロジェクトを使用しました。このプロジェクトは、DLLと、このDLLを実行するC#ロジックで構成されます。彼女から情報を受け取る。 フックは、コースを決定するためにウィンドウを頻繁に切り替えることなく、メッセージの正確な順序をキャッチすることを可能にしました。その後、その後に進む必要があり、さらにフックはシステムを遅くし、結果としてフックを拒否しました。



チャット受信の改善


次の眠れない夜の間に、私はSpy ++でチャットに入ってくるコマンドを見て、特定のコマンドがすべての選択とコピーに対応しているのを見ました。 これらのコマンドのコードが記録され、チャットのコピーが新しいコマンドを使用するように書き直され、その後コピーがWinApiコマンドを使用して完全に実行されました。



改善された移動メカニズム


ウィンドウにメッセージを送信し、マウスでクリックしたことがわかりました。これにより、クリックウィンドウにメッセージを直接送信するように循環を書き換えることができました。 これで、カーソルが画面の周りをひくことがなくなりました。 コンピューターは徐々にボットからホストに戻りました=)



反復2の結果


このイテレーションの後、多くのテーブルでトーナメントロジックと透過的なロジックを実行するボットを取得しました(ちなみに、PokerStrategy.comで提供されているテーブルは、それを完全にたどり、もう考えない場合は失われます)。 ボットは、ホストコンピュータで何らかの形で動作する小さなチャンスをすでに残している可能性があります。



反復3



私たちのうちの2人は3回目の反復に到達し、私の隣人はプロジェクトから脱落し、コードの彼の部分をゼロからコピーしました(特に大幅に開発する必要があるため、他の人のコードを維持することは困難でした)。 3回目の反復で、以下を達成しました。

•コースの時間を決定するための新しいメカニズムの使用

•新しいチャットエンジンの使用

•新しいロジックを使用する



コースの時間を決定するための新しいメカニズムの使用


ポイントカラーはデスクトップだけでなく、ウィンドウでも明確に決定できると以前は思いもしなかったのはまだ疑問です。 これを実現し、コースの定義を新しい方法で書き直しました。 今では、歩く時間であることを理解するためにウィンドウを常に最前面に押し出す必要はありません。 このようなメカニズムは安定して動作し、ゲームテーブルをトレイに最小化する場合にのみ1つのケースでクラッシュします。



新しいチャットエンジンを使用する


ポーカールームのチャットには、InetnetExplolerClassクラスなどがありました。 この反復では、このようなオブジェクトからテキストを抽出する方法と、機能するVB.Netコードを見つけました。 コードはC#で書き直され、チャットの受信はバッファーにコピーされず、より安定しました。



新しいロジックを使用する


トーナメントでは、赤道とICMモデルの計算が必要であることが明らかになり、それを取得しようとし始めました。 私のパートナーが書いた赤道は毎秒5,000ゲームをカウントできますが、PokerStrategy.comのEquiliatorは同じ構成で1,500,000を持っているかもしれません-それは失敗であり、あなたはそれについて何かをしなければなりませんでした。

夜、PokerStrategy.comソフトウェアファイルフォルダー(Equiliator、ICMトレーナー)に移動すると、それらが.Netで記述されていることがわかりました。 これにより私は非常に幸せになり、次の2日間はこのソフトウェアをデバッグで実行するために費やしましたが、最終的にはこの会社のライブラリの使用方法を完全に監視し、それらの使用方法を学習しました。

その結果、移動前のボットは勝つチャンスを考慮し、トーナメントの極端な段階では純粋なICMを使用し、特定の利点をもたらしました。



反復3の結果


その結果、多くのテーブルでトーナメントのマイクロリミットでゼロまたは非常に簡単にプレイできるボットを手に入れました(彼は簡単にプレイできました)。



まとめ



次のステップは、プレイヤーのボット統計にねじ込むことで、ゲームの改善につながります。

残念ながら、現時点では、開発は長く続いています。 数時間に一度発生する可能性のある多くの小さな妨害を残しており、そのようなことをデバッグすることは非常に困難です。



ボットを作成したい場合-私たちが見つけた解決策により、ボットをより速く作成できることを願っています。



All Articles