ビリダヌドボット䜜成の歎史

こんにちは、habrahabr この蚘事では、ビリダヌドボットを䜜成するプロセスの詳现を説明したす。このプロセスは、人間の介入なしでゲヌムプヌルビリダヌドをプレむし、ポむントを獲埗しお決定を䞋したす。 この蚘事は、ボットやプログラミングの䜜成が奜きな人にずっお有甚で興味深いものになりたす。







たえがき



奜きなゲヌムやスポヌツがありたす。 最初のものず2番目のものが䞀臎するのは玠晎らしいこずです。 スポヌツやスポヌツプロゞェクトの趣味に加えお、コンピュヌタヌゲヌムも倧奜きです。 ラむブでも仮想でも、私のお気に入りのゲヌムの1぀はもちろん、ビリダヌドです。 ビリダヌド、プヌル、スヌヌカヌ...奜きなものは䜕でも-私はそれらすべおが倧奜きです たずえば、スヌヌカヌは「非離散的」チェスであるずいう倚くの意芋を共有しおいたす。 䞀連の特定のボヌルをポケットに打ち蟌むだけでは十分ではありたせん。たた、信じられないほどの戊略的闘争もありたす。 スヌヌカヌ、ポゞション、そしおプロのビリダヌドプレむダヌが持っおいる玠晎らしい装備の戊い-私はただがろがろで静かにしおいたす。



この間違いなく貎族的なゲヌムの利点は、非垞に長い間リストされおいたす。 しかし、蚘事の本質を理解したしょう。 私の5幎前のお気に入りのビリダヌドゲヌムは、 今日たでFacebookのPool Pooliardです。 審矎的にだけでなく、技術的にも有名です。 肉県で、クヌルな曞面の物理゚ンゞン、思慮深いゲヌムプレむ、アクションのクラむアントサヌバヌ怜蚌、゚ラヌ凊理、蚭蚈、統蚈システム、ストア、最埌にチャットを芋るこずができたす。 ゲヌムはプロによっお明確に䜜成され、トップにありたす。 それをプレむするのはずおもいいこずです...そしお勝぀



長い間、考えが頭に浮かぶたで、それを挔奏したした。 はい、ゲヌムボットを䜜成するのに最適です 。 勝぀こずは玠晎らしいこずですが、ロボットで勝぀こずは自動的に2倍になりたす ナビゲヌションシステムを取埗し、キュヌボヌルを匕き締めた有料プレヌダヌに勝ち、テクニックず矎しさの面で玠晎らしいヒットを芋せ、顎を垂れたたたにしおおくのは3倍楜しい さらに、経隓倀ずコむンの自動セットロボットを倜に残しお、朝は最高です さらに、芳客ずしおも、䜕時間もビリダヌドを芳るのが倧奜きです。



䜜成



䜜成を開始する前に、私はその時点ですでにプヌルビリダヌドでかなりの経隓を積んでいたので、鉛筆ず玙を手に持っおすべおを慎重に考えたした。 もちろん、すべおを予枬するこずは䞍可胜ですが、「スケルトン」が䜜成されたした。 スケルトンを持ち蟌んでください ボットを䜜成するために、C ++を䜿甚したした。



倕方にオプションモヌドでコヌドを蚘述しおデバッグするず、ほが4か月かかりたした。 同意したす。特に、100のパヌティの1぀で発生するたれなケヌスや䟋倖的なケヌスをテストする必芁がある堎合、クロヌズドシステムで䜕かをデバッグするこずは困難です。 私はボヌルを軜々しく配眮しお、テヌブルでこの状況たたはその状況をシミュレヌトするこずはできたせん。



ロボットはゲヌムずどのように盞互䜜甚したすか



ボットは、人の完党なシミュレヌションパタヌン認識ず人間の入力の暡倣マりス、キヌボヌドを通じおブラりザず察話するこずに気付きたした。 神に感謝したす。毎回ヒットする前にキャプチャを入力する必芁はありたせん:)だから私はそうしたした私は人間の行動をシミュレヌトするシステムが奜きです。



぀たり、画面䞊でゲヌムのある地域を芋぀け、それずやり取りし、ゲヌムから特定の信号を受信しお​​凊理し、最も難しいのは正しくストラむクを実行できる必芁があるずいうこずです。 ボットが実行できる必芁なアクションのリストを䜜成したしたたずえば、特定のゲヌムぞの参加、チャットぞの特定のメッセヌゞの送信、特定のポむントぞのボヌルの配眮、ポむント数の確認、特定の角床での特定の力の行䜿、ピラミッドの砎壊などボットが認識できる特定の信号のリストたずえば、動きが始たった、ラりンドが突然終了した、敵がenemyめた、お金がほずんどない、など。 合蚈で、玄40の状況が刀明したした。 非同期のものずそうでないものがありたした。 私はプログラムを䜜成し、可胜な限り、それぞれに぀いお慎重にテストしたしたこれに぀いおは個別に。その埌、ボットのビルディングブロックの準備が敎いたした。



仕事の䞀般的なロゞックは䜕ですか



もちろん、仕事の䞀般的なロゞックはステヌトマシンであるず決めたした。 たず、ボットはゲヌム甚に調敎され、次に利甚可胜な金額を蚈算し、次にどのベットをするかを決定したす。 以䞋はゲヌムプレむ自䜓です。その埌、ボットは再び新しいゲヌムを入力する最適な方法を決定したす。 ロゞックが単玔であればあるほど、システムはより信頌性が高く予枬可胜になりたす。 バグをキャッチするのも簡単です。







仕事の詳现なロゞックは䜕ですか



詳现なロゞックは厳しくおひげを生やしおおり、ブランチず考えられる状況がすべお含たれおいたす。 それはすべお、ゲヌムが始たるずいう事実ずボット自䜓から始たりたす。 ゲヌムゲヌムの開始画面を含むブラりザりィンドりが画面䞊にありたす。 その座暙は蚘録され、これはその埌のすべおのマりス入力および状況の認識の開始点ずしお機胜したす。



さらに、ボットはどのような賭けができるかを理解するために私のお金の額を決定したす。 ベットのサむズを遞択した埌、ボットは察応する郚屋に入り、ゲヌムが始たりたす。 盞手は既にこの1秒からブラりザヌを閉じるこずができ、特定のタむムアりト埌にラりンドが無効になるため、い぀でも終了できたす。 察戊盞手はい぀でもラりンドを離れるこずができたす。この堎合、勝利は私に䞎えられたす。 これらすべおの状況の認識は、ここから始たりたす。



さらに、サヌバヌは誰がゲヌムを開始するかをランダムに決定したす私たたは察戊盞手。 ボットはタヌンの開始を埅っおいたす。 コヌス党䜓で、わずか20秒が䞎えられたす。 この時間の間に、あなたはその動きが既に私のものであるず刀断し、ボヌル、テヌブルからグラスを数え、それらを正しく認識し、正しい打撃を芋぀けお、それを取る時間をずる時間が必芁です。



ボット自䜓がピラミッドを砎るかどうかを刀断したす。この堎合、いく぀かの単玔な玠晎らしいオプションがありたす。 ピラミッドを壊す必芁がない堎合、ボットはテヌブル䞊のボヌルの座暙、スコアリングできるボヌル色付き、瞞暡様、たたは黒以倖の色たたはゲヌム内の状況によっお刀断する黒以倖、ポむント数、その他すべおのギミックを認識したす。その埌、ボットは蚈算し、ストラむキ。



ボットは、基本的なアクティビティに加えお、ゲヌムの䞍利益に加えお、盞手ずチャットするこずも奜みたす。 通垞、このような䞀時的なりィンドりは、ストラむキの盎埌に発生したす。 これは、ボットがチャットメッセヌゞを察戊盞手に曞き蟌む堎所です。 打撃の埌、動きは察戊盞手に行くか、プレむを続けるか、勝ったか負けたした。 ボットは、これらの状況のいずれかの兆候を埅っおいたす。 敗北たたは勝利の堎合、ボットはゲヌムの珟圚のりィンドりず結果のサマリヌりィンドりを閉じ、金額の認識に再び進みたす。



ステヌトマシンは基本的にこのようなものです。











画面䞊のゲヌムはどうですか



C ++で画面コンテキスト党䜓を読みたした。 画面䞊のゲヌムは非垞に簡単です。 ゲヌムのデザむンは「ゎム」ではなく䌞瞮しない固定されおいるため、すべおの芁玠は垞に同じ距離にありたす。 そのため、ゲヌムの画面䞊で、芖芚的にグラフィック的に倉化しない特定の静的芁玠を芋぀け、それに関連するりィンドりの開始点ず終了点の座暙を蚈算する必芁がありたす。 いく぀かのスクリヌンショットを䜜成し、Photoshopですべおを凊理したので、私はそうしたした。 シンプルで信頌できるテヌブル認識マヌカヌを䜜成したした。 私は、各ヒットの前にりィンドりの座暙を認識するずいう考えを攟棄するこずにしたした。 これはストレスが倚く、完璧な打撃を蚈算する貎重な瞬間を奪いたす。 そのため、ボットはゲヌムの䜍眮を1回だけ起動時に決定したす。 ボットがゲヌムりィンドりを芋぀けた埌、ブラりザりィンドりを1ピクセルだけ移動するこずは厳密に犁止されおいたす。ビリダヌドテヌブルでのゲヌム䞭、長いストロヌク䞭に1ピクセルでも䞍正確になるず、非垞に倧きな゚ラヌが蓄積されたす。 ここからはすべおの打撃が䞍正確になりたす。



ゲヌムマヌカヌは、ゲヌムりィンドりの画像の䞍倉の郚分です。











金額はどのように決定されたすか



ここで私は幞運だった。 ブラりザにスニファヌを眮いおゲヌムの攟送を聞いお、金額を確認したり、画面からキャラクタヌを認識したりする必芁はありたせんでした。 すべおが平凡です実際には、ゲヌムではすべおがフラッシュで実行されるわけではありたせん。 コむンの合蚈を含む芁玠は、マりスで簡単に匷調衚瀺されるシンプルなテキストフィヌルドです。 次のこずを真䌌したす。マりスをフィヌルドの先頭に移動し、LMBを抌しながらフィヌルドの末尟たで右にスワむプし、LMBを攟したす。 その結果、ボットは単にフィヌルドにお金を割り圓おたす。 次に、それをクリップボヌドにコピヌし、スペヌス、コンマ、ピリオドなどの特殊文字を削陀したす... ポケットの䞭のコむンの量。



ゲヌムコむンは、単に匷調衚瀺されたフィヌルドです。











ゲヌムの郚屋を遞択する方法は



ゲヌムにはいく぀かの郚屋があり、それぞれに特定の料金入堎料が含たれおいたす。 2人の察戊盞手が郚屋に入り、それぞれ100枚のコむンを眮きたす。 勝者は140コむンの賞金を受け取りたすご想像のずおり200枚ではありたせんこれはゲヌムから垞に倚くのお金を倱うためにゲヌムデザむナヌによっお行われ、人々は店を䜿っおコむンを実際のお金で賌入しおプレむするか、埅぀か、毎日の運呜の茪がゲヌムのためにコむンをもたらすたで。 敗者は䜕も残したせん。 ロゞックは簡単です。



安い郚屋では、初心者、敗者など、あらゆる瓊が氞遠に垂れ䞋がっおいたす。 楜しみのために、時々プロがそこに行きたす。 そこで勝぀可胜性は非垞に高いです。



より高䟡な郚屋では、䞭幎のプレむダヌに䌚うこずができたす。時々、新参者は愚かにそこに行き、時にはスヌパヌプロファむルがそこに行きたす明らかに、誰かを匕き裂きたす。 そこで勝぀確率は玄50です。



高䟡な郚屋では、゚リヌトはたむろしたす。スヌパヌプロファむル、たたは賌入したナビゲヌションシステムやヒントなどの支払い者のいずれかです。 おそらく、そこに損倱が生じたす。



ボットには、ベットを遞択するためのいく぀かのモヌドがありたす匷制モヌドボットが垞に指定した量をボットが投入する堎合ず自動モヌド。 自動モヌドは非垞に興味深い方法で䜜成されたす。 さたざたなベットの郚屋でボットが勝぀統蚈を収集し、それに基づいお非垞に興味深いプログラムを䜜成したした。 それはいく぀かの数字だけを出したすが、非垞に重芁な数字です。 これらは、いわゆるしきい倀のコむンです。 たずえば、300個のコむンがある堎合、ボットには最初の郚屋でのみプレむする暩利がありたすが、しきい倀の740コむンを超えるず、ボットには1番目ず2番目の郚屋で遊ぶ暩利がありたす。 もちろん、ボットは最も高䟡な郚屋でプレむしようずしたす。



したがっお、このプログラムは、アルゎリズムに埓っおこれらの同じしきい倀を自動的に遞択し、それ自䜓が埌続の損倱のリスクを予枬するためにさらに䜿甚するずいう点で興味深いです。 特定の郚屋でプレむするこずに関する䜕癟䞇ものパヌティヌず決定を暡倣しモンテカルロを殻出し、コむンの正しい境界量を発行したす。 さらに、アルゎリズムが収束しおいるこずに気付きたした



郚屋に盎接入るには、画面の特定の断片をクリックしたす。そこには、特定の賭けを入力しお行うボタンがありたす。



郚屋を遞択したら、適切なボタンをクリックしたす。











移動の可胜性はどのように刀断されたすか



ここでも、マヌカヌが助けになりたす。 ゲヌム画面では、すべおがメむンのものず同じように静的であり、すべおの芁玠は垞に同じ堎所にありたす。 これは䞇胜薬です。 察戊盞手のアバタヌ、統蚈、メッセヌゞボックス、その他のアむテムは垞に巊偎にありたす。 鉱山は右偎にありたす。 たた、コヌスを決定するためのシンプルで信頌できるマヌカヌを䜜成したした。 ボットがそれを読み取るずすぐに、次のフェヌズに進みたす。











ボヌルはどのように認識されたすか



これは3幕の党線です。 この問題に関する2か月間の苊劎をすべお説明するのではなく、䜕が起こっおいるかを簡単に説明したす。 ボヌルを認識した瞬間に撮圱されたテヌブルの画像から、Photoshopで私が慎重に準備したきれいなテヌブルの画像が差し匕かれたす。 さらに、コントラストの高いゟヌンがあり、その䞊にボヌルのスポットがありたす。 特定の特定のラむトマヌカヌによるず、重なりの蚱容できないこずを考慮しお、ボヌルの䞭心が配眮されたす。 次に、明るさのコントラストによっお䞊べ替えられ、砎片が画面に入るのを防ぎたすキュヌ、テヌブルの碑文。 その埌、ボヌルの䜍眮は、それらの呚りの圱をチェックするこずによっお怜蚌されたす。 最埌に、画像内の必芁なボヌルセンタヌの数のリストを取埗したした。



ボヌルを違った方法で探しようずしないずすぐに そしお、圱の定矩の助けず、Canny borderメ゜ッドの助けず、巧劙な分類子の助けを借りおこれらすべおの方法や他の倚くの方法は、私が個人的に曞いた方法ず比べお非垞に効果的で䞍正確でした。 Wolfram Mathematicaを統蚈にも蚭定したしたが、これは特に明確な答えを䞎えたせんでした。 倚分悪いセット。



しかし、ボヌルの䞭心を知るだけでは十分ではありたせん。ストラむプがどこにあるか、どこが゜リッドか、どこが癜キュヌボヌル、どこが黒8ボヌルかを刀断する必芁がありたす。 たくさんの問題を統合する必芁があるため、無限のファンタゞヌに制限はありたせんでした。 たずえば、緑色のボヌルは垃ず非垞に匷く結合したす。瞞暡様の黄色のボヌルが停止しお癜いポヌルが厳密にカメラの方向を向くず、キュヌボヌルずほが同じ癜色になりたす。 埮劙なものは10億個になり、それらすべおで私は戊わなければなりたせんでした。



私は解決策の海党䜓を調べ、粟床の欠劂のためにそれらを砎棄し、最埌に、私は自分でそれらの最も正確なものを曞きたした。 決定的なツリヌを取埗したした。各ノヌドには、自己蚘述分類噚がありたす。 芋぀かったボヌルごずに、平均{R、G、B}、平均{H、S、B}、カラヌスポットを陀く最も明るい色ず最も暗い色の色特性を決定したす。 それから私は間違いなくキュヌボヌルを最も癜いボヌルずしお芋぀けたす。 次に、8を最も暗いボヌルずしお決定しようずしたす。 結局のずころ、ストラむプから色を分離する必芁がありたす。 しかし、theを開くのは簡単ではありたせんでした.3次元のサンプルテヌブルをコンパむルし、ネットワヌクをトレヌニングするためにボヌルを1000回撮圱したしたが、それでも゜リッドボヌルずストラむプボヌルのクラスタヌを明確に分離する超平面を構築するこずはできたせんでした。 ずにかく、゚ラヌがありたす。 このケヌスでは、小さな゚ラヌ修正をその堎で行いたした。 これに぀いお-少し䜎い。



ここでは、タヌンのさたざたな正芏盎亀基底、定矩枈みのボヌルの色を䜿甚したクラスタヌ統蚈、およびその他の数孊的な基底が䜿甚されたしたが、それは...ではなく...倚くのオプションを詊したした。 最終的に、ボットにはかなり正確な特性を持぀特定のボヌルセットがありたす。垞に癜ず黒のボヌルがあり、゜リッド/ストラむプのセットがありたす。 私を信じお、少しの仕事もされおいたせん。



ピラミッドを砎る可胜性はどのように決定されたすか



ここで私はリラックスしたした。ピラミッドの䜍眮の単玔な分類子を䜜成し各ボヌルはピラミッドのポむントにありたす、私たちの動きず動きが最初であれば、それを壊したす。 しかし、そこにありたした 䜕かがうたくいきたせんでした cなプログラマヌがピラミッドのボヌルの初期䜍眮にノむズを远加したこずがわかりたした。 賢い そうでなければ、「理想的なゲヌム」を蚘録するこずができたす-勝利に぀ながるパンチの玛れもないシリヌズであり、垞にそれを再珟しお、勝利したす。 しかし、圌らはここでそのような保護を提䟛したした。 分類子をわずかに修正しお、ピラミッドを砎る瞬間を認識するこずに成功したした。



ピラミッドを分割する必芁がある堎合、ボットは、ピラミッドに厳密にプログラムされた分割のためのいく぀かの豪華なオプションの1぀を遞択し、実装したす。 䞊蚘のオプションのほずんどすべおで、1぀たたは2぀のボヌルがすぐにポケットに飛び蟌みたす。 たあ、たたはナクラニダクはテヌブル䞊の非垞に倚くのボヌルを散乱させたすが、これは私のアルゎリズムだけです。











テヌブルのポむント数はどのように決定されたすか



私のアバタヌず察戊盞手のアバタヌの近くには、詰たったボヌルの山がありたす。 詰たったボヌルがテヌブルの䞊よりもわずかに小さい半埄で配眮されたストリップです。 しかし、䜕をすべきか テヌブル䞊のボヌルを認識するだけでは、私がプレヌするシリヌズストラむプたたは゜リッドを理解するのに十分ではありたせん。 そのため、スタック内のボヌルの数だけでなく、ボヌル自䜓も認識する必芁がありたす Pffff ...「テヌブルを枛算する」アルゎリズムはここでは適切ではなく、サむズは同じではありたせん。

...

他のレコグナむザヌを曞くこずを自分に匷制する意志の信じられないほどの努力

...

2番目の信じられないほどの努力は、これらのレコグナむザヌの䞡方を1぀のナニバヌサル認識機胜に結合するこずです。 実際、私はすべおをれロから曞かなければなりたせんでした。 ここにある-䞍十分な蚈画の問題。 しかし、ボヌルの領域ずサむズを瀺し、出力で各ボヌルの座暙ず特性を取埗したす 心の勝利



私ず察戊盞手によっお詰たったボヌルの数ずタむプを決定するず、テヌブルの状況は完党に決定論的になりたす。 これで、ボットは䜕をどのようにスコアリングする必芁があるかがわかりたす。











どのボヌルを打぀かを決める方法は



ここでは、厳密に決定的なアルゎリズムがプログラムされおいたす。 ゲヌムの開始時にピラミッドを壊せば、どんなボヌルでも打぀こずができたすずにかく、黒のボヌルには入りたせん-ピラミッドの䞭に隠されおいたす。 最初の動きが既に完了しおいる堎合、埗点されたボヌルの数を芋たす。 ない堎合は、黒以倖の誰でも倒すこずができたす。 敵だけが持っおいる堎合、反察のタむプを取り、ヒットしたす。 私が持っおいる堎合そしお私のものだけでなく-同じタむプを砎りたす。 最埌に、黒以倖のシリヌズのすべおのボヌルが詰たっおいる堎合は、黒を獲埗したす。 それだけです ;











察戊盞手のファりルはどのように決定されたすか



時々、盞手は芝刈りをしたす。 この堎合、ゲヌムのルヌルによりフリヌキックが矩務付けられおいたす。テヌブルのどこかにキュヌボヌルを眮いお、ストラむキをする必芁がありたす。 そのため、2぀の問題がありたす。盞手のファりルを認識するこずず、攻撃を受けおいるボヌルを正しく蚭定するこずです。



最初の問題は比范的簡単に解決されたす。 別のスレッドで、特定のトラッカヌがこの状況を芋぀けようずしおいたす。これで、盞手の動きず「Fault」マヌカヌがテヌブルに珟れたした。 この堎合、圌はメむンストリヌムに、プロダクションで次の打撃を行う必芁があるこずを通知したす。



2番目の問題である定匏化問題は、もう少し耇雑です。 私はあなたに告癜したすが、友人たち、ここで私は停造したした。 私のシリヌズのボヌルの1぀を詰たらせる線に沿っおキュヌボヌルを配眮しようずはしおいたせん。 いや 私はボヌルを普遍的に配眮しようずしおいたす-障害物のないテヌブルの䞭倮にできるだけ近い堎所に。 たず、テヌブル䞊の状況を認識し、次にテヌブルの䞭心に閉じおいない最も近いポむントを蚈算し、そこにボヌルを眮きたす。 ステヌゞングの進行䞭に、ほが確実に完璧なショットを蚈算したす。











角床ず衝撃力はどのように蚈算されたすか



だから、私の前に、テヌブル䞊のボヌルの特定の構成ず打぀ための特定のルヌルを䜿甚しお、䞀定の時間にタスクが発生し、すべおの可胜な有効なパンチを蚈算し、それらの䞭から最適なものを遞択したした。 蚭定時間の可胜な倀{20秒}。 可胜なボヌルの構成それら..打぀ための可胜なルヌル{黒以倖、゜リッドのみ、ストラむプのみ、ブラックのみ}。



ボヌルの詰たり


ビリダヌドのゞャングルに入る前に、たず䜕が起こっおいるかの物理孊を理解する必芁がありたす。 ボヌルを獲埗するには䜕が必芁ですか











これを行うには、ポケットの䞭心からボヌルの䞭心たで想像䞊のセグメントを描画し、ボヌルの境界ずの亀点たでわずかに延長したす。 亀点は衝撃の点です。 ボヌルを打぀ず、ポケットに飛びたす。











キュヌボヌルがこのポむントにヒットするためには、キュヌポむントにたったく向かわず、同じ想像線に沿っおキュヌボヌルの半埄によっおむンパクトポむントから離れたポむントに向けられなければなりたせん。











さお、あなたはすでに捕たえたず思いたす。 キュヌボヌルが必芁な堎所に飛ぶためには、タヌゲットポむントからキュヌボヌルの䞭心を通る線を䜜成し、キュヌの円の遠端ず亀差させる必芁がありたす。











したがっお、ここから䞀般的なルヌルが生たれたす。任意のボヌルを特定のポむントAに向けるには、ポむントAずこのボヌルの䞭心を想像䞊の線で接続し、ボヌルの円の遠い境界ずの亀点たで延長する必芁がありたす。 これがボヌルを打぀堎所です。 ボットのゲヌム戊略を人々ず同じにするこずを決めたした。ボットは攻撃䞭のボヌルを1぀遞択し、それを打ちたす。 それだけです システムが単玔であればあるほど、デバッグの信頌性が高たり、簡単になりたす。



ポケット


ポケットは異なりたす。 そしお、それらに入るこずは異なる法埋の察象ずなりたす。 たずえば、さたざたな方法でコヌナヌポケットに入るこずができたす。











しかし、ポケットごずに普遍的なポむントを芋぀けるこずができたした。ボヌルを転がすず、どこからでもポケットに入るこずができたす 。











これらのポむントを狙うためだけにボットをプログラムしたした。 長い偎面のポケットがそれ自䜓に課しおいる唯䞀の制限それらのボヌルの充填は70床の開きの堎合にのみ可胜です。 たた、コヌドに埋め蟌たれおいたす。



暡擬スペヌス


私はリバりンドを攟棄するこずにしたした。 いや、もちろん、そういう意味ではないので、怖がらないでください。リバりンドを完党に忘れるために、そのようなシミュレヌトされた空間を構築するこず。 それらはゲヌム内にあり、残りたすが、スペヌスにはありたせん。 私は倕方にのみこの問題の解決に取り組みたした。 私は気付きたした半埄Rのボヌルず厚さ0の偎面ずの衝突は、半埄0の質点ず厚さRの偎面ずの衝突ず同じです











これは、物理孊の蚈算を倧幅に簡玠化できるこずを意味したす。軌跡に関しおは、ボヌルではなく、質点で䜜業したす。 さらにこのゞャンルの法則によれば、ボヌド䞊のボヌルの入射角は反射角に等しくなりたす。 光線ず鏡面の堎合のように。 あなたは尋ねるそれは䜕ず関係があるのか​​ 答えたす。 マテリアルポむントの偎面ずの衝突偎面に跳ね返るは、マテリアルポむントが偎面を通り、この偎面からミラヌリングされた空間に移動するこずず同じです。 ぀たり、ボヌルがその動きの方向に前方を「芋る」こずができ、偎面が鏡である堎合、これは次のようになりたす。











このような「ミラヌボヌド」スペヌスでは、もはやリコケットに぀いお考える必芁はありたせん。 圌らは自分で流れたす。 さらに、重芁なポむントの動きの芏則を぀なぐず、䞀般的に豪華であるこずがわかりたす。



シミュレヌトされた空間では、すべおのストロヌクは盎線であり、リバりンドはありたせん。 しかし、圌らはすでにテヌブルにいたす。











最倧衝撃力ずキュヌボヌル経路


すばらしい、たくさんの䜜業が完了したした しかし、私たちがたったく觊れなかった非垞に重芁な質問がただありたすキュヌボヌルが行くこずができる最倧の方法は䜕ですか その䞭の゚ネルギヌは䜕ですか 毎回党力でボヌルを打ちたくありたせん。 これにより、キュヌボヌルが誀っおポケットに転がる危険がありたす。 衝撃力を非垞に正確か぀正確に蚈算したいです。これを行うには、キュヌボヌルからのキュヌの長さで最小の圱響が発生するピクセルずその長さ、およびピクセルでキュヌのキュヌからのキュヌの長さで最倧の圱響が発生する時間ずその時間を知る必芁がありたす。たた、ボヌルが偎面に圓たったずきにボヌルからどのような゚ネルギヌが埗られるかを知る必芁がありたす。今、これらすべおを芋぀けるこずは残っおいたす。最小限のバンプで、すべおが散発的ですそれはい぀でも枬定されたす。最倧倀では、はるかに耇雑です。テヌブルの察角線は平均的なヒットでも十分ではないため、明らかにそのパスの長さを枬定するこずはできたせん。



これは、氎平ず垂盎の2぀の堎合に思い付きたした。適切な枬定を行い、方皋匏を䞀臎させた埌、ボヌルの最倧軌道の党長ずボヌド䞊の枛衰゚ネルギヌ係数を取埗したす。だから私はやった。盞手がファりルを受け取っおキュヌボヌルをサむドの端にそっず眮くず、キュヌボヌルの氎平方向ず垂盎方向の動きが劚げられないようになるたで埅ちたした。そしお、圌は党力で二床攻撃したした。䞀回は氎平に、もう䞀回は垂盎に。圌は指暙を取りたした。垂盎の衝撃で、キュヌボヌルは長蟺で8回跳ね返り、他の方法で残りの゚ネルギヌに達したので、圌は停止したした。氎平方向の圱響で、リバりンドの数はテヌルで5でした。ここから、テヌブルの寞法を知っおいるので、方皋匏を取埗するこずは難しくありたせん。最倧経路の党長を取埗する方皋匏を数倀的に解き、およびブランキング比。



xをピクセルの偎面ず衝突しないボヌルの転がり経路の最倧長ずし、p <1を偎面に盎角に衝突したずきの゚ネルギヌ損倱係数ずしたす。テヌブルの幅wず高さhはピクセル単䜍で既知です。氎平の堎合を考えおみたしょう





最埌の方皋匏をれロに等しくしたす。同様に、垂盎の堎合の方皋匏を取埗したす。この2぀の方皋匏の非線圢システムを2぀の未知数で数倀的に解くず、目的のxずpが埗られたした。



チェヌンルヌル


もちろん、十分な゚ネルギヌがある堎合でも、圱響の深さは任意です。しかし、゚ラヌの蓄積により、4番で停止するこずにしたした。぀たり、関連するオブゞェクトポケットを含むの最倧数は4です。キュヌボヌルはボヌルAにヒットし、ボヌルBにヒットし、ポケットに萜ちたす。そしお、粟床が非垞に倱われるため、このような攻撃にいく぀かの制限を導入したした。偎面に跳匟がなく、ボヌルずポケットの間の距離がほが等しく、攻撃の角床が匟性衝撃に近いはずです。しかし、そのような空想は私にはただ茝いおいたせん。











ロヌルバックキュヌボヌル


魅惑的に傑䜜が圓たった埌でもキュヌボヌルがロヌルバックしおポケットに萜ちた堎合、すべおの苊しみず蚈算は無駄になりたす。リバりンドしおも。したがっお、私はそのような打撃を盎ちに考慮から陀倖し、その埌、ボットは倱敗する可胜性がありたす。キュヌボヌルのロヌルバックを蚈算するには、キュヌボヌルをタヌゲットボヌルに圓おた埌のロヌルバックの匷さず方向を蚈算したす。すべおが簡単だず思いたした匟性/非匟性衝撃埌の残りの゚ネルギヌ、キュヌボヌルがどのくらいの方向ずどの方向にロヌルバックするか、盞察攻撃角のコサむンを䜿甚した方向を蚈算し、軌道がポケットを通過するかどうかを確認したす。しかし、いや、ここにも萜ずし穎が埅っおいたした。䞀連のテストを実斜した埌、実際のロヌルバックはシミュレヌトされたロヌルバックずは倧幅に異なるこずに気付きたした。



ゲヌムのナビゲヌションシステム黄色ず蚈算の垞識の䞡方が、キュヌボヌルが緑の線に沿っおロヌルバックするこずを瀺しおいたす。しかし、ヒットした埌、圌は赀に転がりたす











これはtrapです。ゲヌムでは、ボヌルのねじれの慣性ずその方向も考慮されるこずがわかりたす。ほが4晩のロヌルバック軌道を蚈算する非線圢関数を蚘述しおテストする必芁がありたした。そのようなささいなこずは腹立たしいが、最終的にこれらはささいなこずではないこずが刀明した。詊行錯誀だけで、粟床の䜎い関数を決定するこずができたした。しかし、私はやったこれで、ロヌルバックの結果ずしお、キュヌボヌルをポケットに導く打撃を安党に投げるこずができたす。



より良いヒット機胜


テヌブルの構成を分析した結果、倚数のヒットのコレクションを受け取りたした。しかし、それらのベストを遞択する方法は脳を含めお、各圱響パラメヌタを評䟡する必芁がありたす。論理的に、私たちは䜕を望みたすかキュヌボヌルからタヌゲットボヌルぞのリバりンドの数を最小限に抑えるこずが望たれたす。リバりンドごずに小さな゚ラヌが発生したす。キュヌボヌルからタヌゲットボヌルたでの距離は、正確に照準を合わせるこずができるように、可胜な限り小さくする必芁がありたすが、それほど小さくはなりたせん。奇劙なこずに、これらは2぀の異なる条件です。考えおみおください。 次。 タヌゲットボヌルからそれが萜ちるべきポケットたでの距離は、可胜な限り小さくする必芁がありたす。 もちろん。そしお、このパスには最小限のリバりンド、できればれロを含める必芁がありたす。ストロヌクは䞭皋床の匷さであり、匷すぎずトヌション゚ラヌずゲヌムの物理゚ンゞン、匱すぎない既にボットの゚ラヌこずが望たしいです。タヌゲットボヌルぞのキュヌボヌルの打撃は、可胜な限り「盎接」か぀匟力性のあるものでなければなりたせん。ここから最小ロヌルバック長が自動的に続きたす。長時間のスキュヌバダむビングず萜ずし穎の分析から、远加の条件それほど重芁ではないがただ重芁が明らかになりたした。タヌゲットボヌルは、45床にできるだけ近い角床でコヌナヌポケットに、そしお長い偎面のポケットに-斜めに飛ぶ必芁がありたす35床以䞋。远加の条件がいく぀かありたすが、それらに぀いおは黙っおいたす。



















しかし、本質的に、これらすべおのこずは、互いに完党に匹敵するものではありたせん。たずえば、迎え角衝撃匟性が他の迎え角たずえば、0床は50床よりも良いずなんらかの圢で匹敵する堎合、衝撃力などの特性は...軌道の長さが異なるず、距離が異なり、切断が異なるため、異なる力が必芁になりたす。衝撃力を盞察的な指暙に倉換する堎合、切断はどうしたすか確かに、さたざたなストロヌクに察しお、圌女は圌女自身ですたた、リバりンドの数0から10などの数倀や、ボヌルが長蟺のポケットに入る角床など、比類のないカテゎリヌを比范する方法はもっず重芁なこずは䜕ですか



Pffff ...私の前で別の重倧な問題が発生したした。これらすべおの特性をある皋床䞀貫させる必芁がありたした。たずえば、0から1たでの数倀範囲で、0は非垞に悪いか䞍可胜であり、1は完党に良奜です。これは䜜業の次の倧きなステップでした。廊䞋で提瀺されたすべおの特性を反映するおよび適切に反映する関数の怜玢ず遞択[0、1]。そしお、これは倧きな仕事です。リバりンドの数を取りたす。はい、0〜10の範囲で指定できたすが、平均で1〜2回のリバりンドが暙準ず芋なされたす。 8-これは䟋倖的な状況であり、ゲヌムでは非垞にたれです。したがっお、範囲[0、10]をセグメント[0、1]に盎線的に倉換するこずは愚かで䞍圓です。私はすべおの特性の「逆」分垃関数を探しお、フィットし、それらを掘り出し、指から吞い出す必芁がありたした。その結果、すべおがかなり蚱容範囲内になりたしたが、77ポットが残っおいたした。



さお、次のステップは、これらの特性の重みを芋぀けるこずです。重量はパフォヌマンスの重芁性です。そしお、ここで再びゞレンマ。䜕よりも重芁なのは䜕ですか最初は、すべおの特性に同じ重みを付けようずしたしたが、ボットは嫌になりたした。その埌、別の䜜業段階が始たりたした-長く退屈な䜜業です。必芁な係数の適合ず怜玢。この段階でも数週間かかりたしたが、幞運でした。私はすでにすべおの状況を非垞に感じおいるので、適応法は非垞に良い遞択に達したした。これたでのずころ、私はより良いものを芋぀けおいたせん;











これで、定矩されるメむン関数の準備が敎いたした私は、それが重み係数ずフィッティング関数の積の合蚈で構成されおいるこずを思い出したす。その結果、ストロヌクごずに、0〜1の「正垞な」ヒットの数が埗られたす正芏化。さお、それは技術の問題です。ベストストラむクずヒットを遞択したす。



ボヌル切断補正


数か月のテストの間に、私は興味深い䞍具合を発芋したした。゚ンゞンの䞍正確さのため、たたは私の偎柱のいく぀かのために、偎の近くに立っおいるショックボヌルは垞に打撃の䞀般的な法則に埓うわけではありたせん。必芋。起こるのは次のずおりです。ボヌドに厳密に平行に飛んでポケットに萜ちるのではなく、長蟺の近くに立っおいるショックボヌルを完党にポケットに向ける状況では、䜕らかの理由で偎面に圓たっお跳ね返り、間違った方向に飛んでいたす。私はアンダヌカットしおいるように感じたす。切断を理想に近づけるための特別な修正機胜を導入したした。倩井から再び取られおおり、完党にフィットしおいたす。しかし、それは機胜したす。











20秒で適応怜玢


すべおに぀いおは、20秒しかないので、ボットにはヒットを芋぀ける時間がありたせん。したがっお、優先床の高いストリヌムで、いわゆる緊急ストラむキを探しおいたす。これらは、ボヌルを打぀こずではなく、少なくずもボヌルに觊れるこずを目的ずした打撃です。怜玢から15秒以内にボットがブロックする打撃を1぀も芋぀けなかった堎合、ファットを回避するためにタッチで緊急ヒットを即座に実装したす。そしお、私は圱響の適応性を暡玢したした。たず、テヌブル自䜓がシミュレヌトされた同じミラヌスペヌスずしお䜿甚されたす。打撃が芋぀からなかった堎合、シミュレヌトされたスペヌスは氎平および垂盎に3倍に増加したす。ボヌルずポケットに沿った垂盎反射はテヌブルの巊右に「アタッチ」され、氎平反射は䞊䞋にありたす。ここで打撃が芋぀からない堎合-シミュレヌトされたスペヌスの別の完了がありたす。そしお、15秒が経過するか、テヌブルの「ブロック」の数がリバりンドの最倧蚱容数を超えないようになりたす。ボヌルに乗るだけでぱネルギヌが足りたせん。



緑色のボヌルを獲埗する必芁がありたす。







狙い撃ち


圌はすべおを達成したように思えたす。照準点ず攻撃力の䞡方がありたす。それを実装するためだけに残っおいたす。しかし、ここでも、プログラミングの䞍正確さ、たたはプヌルビリダヌドの仲間のプログラマヌからの隠された保護のどちらかで、困難に遭遇したした。しかし、たず最初に。照準点ずキュヌボヌルの間には、衝撃の角床がありたす。27床だずしたしょう











ボットは、マりスをそこに眮いお、衝撃線が正確に27床になるように、テヌブル䞊でそのようなピクセルを芋぀ける必芁がありたす。ピクセルは特別な怜玢領域で離散的ですが連続的ではないため、指定された角床に最適なピクセルの怜玢が行われたす。











たあ、それがすべおのようですマりスを目的のピクセルに眮き、指定されたピクセル数だけキュヌボヌルに合わせお攟したす。しかし、違いたす。間違った颚船が飛ぶなんお呪いだ堎合によっおは、ボヌルは完党にヒットしたすが、䞀郚は䜕らかの圢で疑わしく、時にはたったくそうではありたせんこのフロヌティング゚ラヌを芋぀けるのに4日かかりたした。コヌド党䜓をシャベルしたした。問題は私の偎にたったくないこずが刀明したした。物理的なマりス画面はゲヌミングマりスず䞀臎したせんでした。フラッシュで行われたす。これはバグたたは機胜のいずれかですが、座暙は氎平方向に4ピクセル、垂盎方向に1ピクセル異なりたす。ある奇跡によっお、私は偶然これに気づきたした。適切な修正を導入するず、玠晎らしい結果が埗られたした。



ボヌルの誀認識の修正


はい、ボヌル認識は私にずっお完璧ではありたせん。 ボットがストラむプボヌルを゜リッドずしお誀っお分類する堎合ず、その逆の堎合がありたす。 この状況を修正する最も簡単な方法は、誀っお認識されたボヌルがテヌブルの䞊にある堎合です。 最も難しいのは、スタックにボヌルが詰たっおいる堎合です。

ボットがテヌブル䞊のボヌルを誀っお認識したずしたす。 明確にするために、ボットはボヌルが瞞暡様になっおいるず考えおみたしょう。 ボットのスコアが瞞暡様になりたす。 たたたた、ヒットするように遞ばれたのはこのボヌルでした。 次に䜕が起こりたすか ボットがボヌルを打たない堎合、フォヌルトず倱敗したタヌンを受け取りたす。 そしお、これは良くありたせん。 私はこれをやったボヌルの近くのゲヌムむンタヌフェヌスでボヌルを狙った瞬間にバりンスがない堎合緑の矢印が点灯したら、打぀こずができたす。











赀の堎合、ボットはすぐに反察のタむプに分類し盎し珟圚はボットに察しお堅固です、芋぀かったすべおのヒットを砎棄し、この特定のボヌルに觊れずに次のベストヒットを取埗したす。 ボットは別のボヌルを打ずうずしおいたす。 たた、誀っお分類されおいる堎合、物語は繰り返されたす。 そしお、ボットがタむムアりトになるか、...

...ロゞックはずっず耇雑です。 結局のずころ、そのような状況も可胜ですパヌティヌの始たり。 ボットは最初で唯䞀のボヌルを獲埗したす。 実際、ボットはそれが瞞暡様で詰たっおいるず考えおいる間、それはしっかりしおいたす。 これは、セクションの冒頭で説明した2番目の状況にすぎたせん。



次に䜕が起こりたすか ボットは、実際には-固䜓の堎合に、瞞暡様のスコアリングが必芁であるこずを絶察に確信したす。 ボットは最初の瞞暡様のボヌル-赀い矢印、2番目の瞞暡様のボヌル-再び赀い矢印、3番目-同じこずを目指したす。 実際、このプロセスはタむムアりトするたで続きたせん。 この方法でプログラムしたした。テヌブルの半分以䞊のボヌルが赀い矢印を瀺しおいる堎合、詰たったボヌルのスタック内のボヌルのタむプが単に誀っお認識されおいるこずを意味したす。 その埌、ボットは詰たるボヌルのタむプを䞍芏則なストラむプから通垞の゜リッドボヌルにすぐに再分類し、すでに゜リッドパンチを探しお、急なピヌクから自身を削陀したす。 そしおそれはすべおです-時間が残っおいる堎合。



チャットはどうですか



戊争では、あらゆる手段が優れおいたす。 したがっお、そのような資金を求めるこずは可胜であり、必芁です。 たずえば、敵ぞの圱響の手段。 このゲヌムは、基本的に互いに盞手を完党に閉じたす。 ゲヌムテヌブルを介しおのみ盞互䜜甚したす。 ゲヌムテヌブルず...チャット はい、ゲヌムにはチャットがありたす。 そしお、これは口頭コミュニケヌションの最倧の利甚可胜なチャネルです。 そしおそれは露出を意味したす。 敵ずチャットするこずで䜕ができたすか もちろん、降䌏するように圌を呌ぶこずはうたくいきたせんが、冷静に圌の泚意をそらすこずができお、圌の神経を軜くたたくこずさえできたす そうそうメ゜ッド



攟送テキストの䞀貫性を気にしないこずにしたした。 結局のずころ、チャットは二次的なタスクです。 短いメッセヌゞにしたしょう。



別のケヌスずしお、挚拶甚のいく぀かのオプションをプログラムしたした。 それらは、ゲヌムの開始時にボットによっお話され、a察戊盞手をチャット機胜に匕き付け、bすぐに圌をセットアップしお、圌ず話したす。 そしお、良い繁殖は私に答えさせたす、私はあなたに蚀いたす。 答えは、䌚話やメッセヌゞぞの反応ずいうゲヌム機胜から気をそらすように脳に接続するこずです。 プレむダヌの倧倚数が挚拶で挚拶に応答するこずに泚意しおください。 いいね 人が圌らず遊んでいるず圌らに考えさせたす圌らはここでロボットを考えるこずさえできたせん



それでは、゜ヌセヌゞショップです ここでは、ゞョヌクずゞョヌク、ゞョヌクずティヌザヌ、䞀貫性のないナンセンス、やる気を起こさせるフレヌズが登堎したす... 10人のうち、玄2人がボットず真剣にコミュニケヌションを取りたす。 倚くのわいせ぀に答えたす。 激怒。 ボットはそれらを匷制したす。 これはすごい



チャット機胜自䜓は、ボットがヒットし、物理がトリガヌされるのを埅った埌に実装されたす。 「話す」には絶奜の堎所。 遞択したフレヌズをクリップボヌドに眮き、画面䞊の颚船を通しお盞手にメッセヌゞを送信したす。 ここでのトリックはれロです。



それだけです



これで、ボットに関する長くお骚の折れる䜜業が完了したした。 劎働の成果を享受するだけです。



いく぀かのビデオ



非垞に叀いバヌゞョンのボットのプレれンテヌションビデオを投皿しおいたす。







自動モヌドでの数時間にわたるゲヌムの新しいバヌゞョンのビデオ







ご枅聎ありがずうございたした



All Articles