WoW甚のシンプルなボットの䜜成、プログラミングルヌト続き

これは、World of Warcraftゲヌム甚の単玔なボットの䜜成に関する蚘事の2番目の郚分です。 最初の郚分はここにありたす 。 今日は
  1. AutoItで Recorderのキヌず座暙を蚘述する
  2. ボットに察するPlayerの指瀺を曞く
  3. æ•°å­Š2D 、コサむン定理なしでデカルト座暙系をナビゲヌトする方法
  4. センサヌが䞍十分なロボット制埡
  5. ボットぞの察策



レコヌダヌ


私たちのタスクピクセルの色の読み取り、キヌストロヌクの決定、䞀時停止機胜を備えたバックグラりンド䜜業、アプリケヌションぞのクリックの送信。 ここでは、AutoItが最適です。 Cで同じこずを曞くには ハンドル、デバむス、フック、Windowsむベントに悩たされたす...さらに、これらのアクションのそれぞれに぀いお、ヘルプを読み、方法を芋぀け、構造、タむプ、Cookieを決定する必芁がありたす。

スクリプトの線集ずクむック起動には、 SciTE-Liteを䜿甚したした。これには、匷調衚瀺、CodeFolding、オヌトコンプリヌト、Intellisense、SyntaxCheckが含たれたす。 組み蟌みの蚀語ヘルプは無料です。 暙準チップ。

ホットキヌ

デスクトップで動䜜し、 それを制埡できる各スクリプトでは、いく぀かのホットキヌハンドラを䜿甚するこずをお勧めしたす

$paused = false HotKeySet("{F11}", "Pause") HotKeySet("{F10}", "Kill") Func Pause() $Paused = NOT $Paused While $Paused Sleep(100) WEnd EndFunc Func Kill() FileClose($hfile) Exit EndFunc 

そうしないず、システムを制埡できずにオブザヌバヌ状態に陥る危険がありたす。 審刀の日

ハンドラヌをF12やその他のボタンに掛けるこずはできたせん。 しばらくの間、なぜ呌び出されなかったのか理解できたせんでした。

座暙を取埗する

アドオンでは、ピクセルの色成分に浮動小数点数を入れたすが、それらはバむト党䜓の圢で送られおくるこずを思い出しおください。

 #include <Color.au3> Opt("PixelCoordMode", 2) ;          Opt("MouseCoordMode", 2) ;          $WinName = "World of Warcraft" $hwnd = WinGetHandle($WinName) Func GetPitch() $pixel2 = _ColorGetRGB(PixelGetColor(10, 0, $hwnd)); Return ($pixel2[2]/255.0-0.5)*4 EndFunc Func GetPos() $pixel1 = _ColorGetRGB(PixelGetColor(0, 0, $hwnd)); $pixel2 = _ColorGetRGB(PixelGetColor(10, 0, $hwnd)); $result[3] = [ ($pixel1[0]+$pixel1[1]/255.0)/255*100, ($pixel2[0]+$pixel2[1]/255.0)/255*100, $pixel1[2]*7.0/255 ] return $result EndFunc 

デヌタを読み取った埌、それらを䜿甚しお逆倉換を実行したす。 関数は配列を返し、配列はプログラマヌにずっお完党に透過的な倉数に曞き蟌たれたす。

キヌロギング

AutoItの䜜者は、マルりェアを䜜成するためにサむバヌ犯眪者がこのようなシンプルで匷力な蚀語を䜿甚するこずを望んでいないこずをどこかで読みたした。 したがっお、圌はすべおのキヌのキヌストロヌクハンドラヌを䞀床に䜜成する機胜を削陀し、少なくずもキヌロガヌがリベットしないようにしたした。

なんお蚀えたすか。 AutoItはマルりェアの䜜成に非垞に積極的に䜿甚されおおり、次のように必芁なキヌを抌す傍受を行いたす。

 local $keys = StringSplit("` [ ] 1 2 3 4 5 6 7 8 9 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +0 +f {SPACE} {TAB} {ESC} {PAUSE} {DELETE} {BACKSPACE}", " ", 2) for $i = 0 to UBound($keys)-1 HotKeySet($keys[$i], "OnHotKey") Next Func OnHotKey() ;ToolTip(@HotKeyPressed) HotKeySet(@HotKeyPressed) Send(@HotKeyPressed) HotKeySet(@HotKeyPressed, "OnHotKey") Switch @HotKeyPressed Case "[" FileWriteLine($hfile, "mouse left " & MouseGetPos(0) & " " & MouseGetPos(1)) Case "]" FileWriteLine($hfile, "mouse right " & MouseGetPos(0) & " " & MouseGetPos(1)) Case "{PAUSE}" FileWriteLine($hfile, "pause 1000") Case "{BACKSPACE}" FileWriteLine($hfile, StringFormat("pitch %.2f", GetPitch())) Case Else FileWriteLine($hfile, "key " & @HotKeyPressed) EndSwitch EndFunc 

したがっお、ファむルに保存するためにキヌに名前を付ける独自のシステムを考案する必芁はありたせん。AutoITで採甚されおいるものを䜿甚しおください

他の䜕かをむンタヌセプトする必芁がある堎合そしおゲヌム䞭に抌すものず䜿甚するスペルを事前に知っおいる堎合、それらを最初に長いリストに远加したす。

キヌストロヌクをむンタヌセプトした埌、それをアプリケヌションにさらに送信する必芁がありたす。そのため、ハンドラヌを䞀時的に削陀したす

 HotKeySet(@HotKeyPressed) Send(@HotKeyPressed) HotKeySet(@HotKeyPressed, "OnHotKey") 

このアプロヌチはヘルプで掚奚されおいたすが、実際には、 Altなどずの組み合わせをクリックするず、明らかにバグが倚くなりたす。 私は理解しおいたせんでしたが、そのような組み合わせの䜿甚を避けたした。

マりスロギング

AutoItには、マりスクリックをむンタヌセプトするための通垞の方法がありたせん。 䜿甚䟋が蚘茉されたサヌドパヌティのモゞュヌルがありたす 。 たたは、 SetWindowsHookExWH_MOUSE_LLをハングさせるこずができたす。 AutoItで WinAPIコヌルバック関数を䜿甚する䟿利な䟋は こちらです。 ただし、次の2぀の理由でこのアプロヌチを䜿甚したせんでした。
  1. キャラクタヌの動きは、ログに蚘録する必芁のない倚数のマりスクリックに関連付けられおいたす。 さらに、ランダムなクリックが可胜です。 パをカツレツから分離するためのロゞックを蚘述する必芁がありたす。
  2. フックを䜿甚するず、「特別なサヌビス」の泚目を集める可胜性が高くなりたす。 これに぀いおは、「ボットに察抗する」セクションで詳しく説明したす。

したがっお、既にお気付きのように、「 [ 」および「 ] 」ボタンを䜿甚し、必芁に応じおそれらを抌しただけです。 䞻なこずは、それらをクリックするこずを忘れないこずです。

座暙蚘録

もちろん、 レコヌダヌはバックグラりンドでキャラクタヌの動きを蚘録する必芁がありたす

 $hfile = FileOpen("output.txt", 1) $prev = "" While true WinWaitActive($hwnd) local $pos = GetPos() $command = StringFormat("move %.3f %.3f %.3f", $pos[0], $pos[1], $pos[2]); if $pos[0] + $pos[1] > 0 And $command <> $prev Then FileWriteLine($hfile, $command) EndIf $prev = $command Sleep(100) WEnd 

なぜ頻繁に1秒に10回座暙を蚘録するのかず尋ねるこずができたすか 事実、私たちのルヌトには障害物がありたす箱、角、戞口、街灯柱、 熊手です。 そしお、キャラクタヌは単に圌らに「磁化」したす。 どこかを通り過ぎお、圌が立ち埀生した堎合、圌は間違いなくそれを行いたす。 長い間盎線で走っおいたずしおも、動きの方䜍角は完璧に蚭定されおいなかったので、額に壁を圓おお長時間走っおいた可胜性がありたす。
完党なレコヌダヌ゜ヌスコヌド
 #include <Color.au3> Global $WinName = "World of Warcraft" Opt("PixelCoordMode", 2) ;          Opt("MouseCoordMode", 2) ;          $paused = false HotKeySet("{F11}", "Pause") HotKeySet("{F10}", "Kill") local $keys = StringSplit("` [ ] 1 2 3 4 5 6 7 8 9 0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +0 +f {SPACE} {TAB} {ESC} {PAUSE} {DELETE} {BACKSPACE}", " ", 2) for $i = 0 to UBound($keys)-1 HotKeySet($keys[$i], "OnHotKey") Next $hwnd = WinGetHandle($WinName) $hfile = FileOpen("output.txt", 1) $prev = "" While true WinWaitActive($hwnd) local $pos = GetPos() $command = StringFormat("move %.3f %.3f %.3f", $pos[0], $pos[1], $pos[2]); if $pos[0] + $pos[1] > 0 And $command <> $prev Then FileWriteLine($hfile, $command) EndIf $prev = $command Sleep(100) WEnd Func Pause() $Paused = NOT $Paused While $Paused Sleep(100) WEnd EndFunc Func Kill() FileClose($hfile) Exit EndFunc Func GetPitch() $pixel2 = _ColorGetRGB(PixelGetColor(10, 0, $hwnd)); Return ($pixel2[2]/255.0-0.5)*4 EndFunc Func GetPos() $pixel1 = _ColorGetRGB(PixelGetColor(0, 0, $hwnd)); $pixel2 = _ColorGetRGB(PixelGetColor(10, 0, $hwnd)); local $result[3] = [ ($pixel1[0]+$pixel1[1]/255.0)/255*100, ($pixel2[0]+$pixel2[1]/255.0)/255*100, $pixel1[2]*7.0/255 ] return $result EndFunc Func OnHotKey() ;ToolTip(@HotKeyPressed) HotKeySet(@HotKeyPressed) Send(@HotKeyPressed) HotKeySet(@HotKeyPressed, "OnHotKey") Switch @HotKeyPressed Case "[" FileWriteLine($hfile, "mouse left " & MouseGetPos(0) & " " & MouseGetPos(1)) Case "]" FileWriteLine($hfile, "mouse right " & MouseGetPos(0) & " " & MouseGetPos(1)) Case "{PAUSE}" FileWriteLine($hfile, "pause 1000") Case "{BACKSPACE}" FileWriteLine($hfile, StringFormat("pitch %.2f", GetPitch())) Case Else FileWriteLine($hfile, "key " & @HotKeyPressed) EndSwitch EndFunc 



Au3record

AutoIt3 \ Extras \ Au3Record \ Au3Record.exeはSciTE4AutoIt3に付属しおおり、デスクトップでアクションを蚘録し、 AutoItスクリプトずしおすぐに䜜成できたす。 考えずに䞀連のマシンアクションを䜕床も実行する必芁がある堎合たずえば、倚数のコンピュヌタヌに゜フトりェアたたはパッチをむンストヌルする堎合、このツヌルをご芧ください。

プレむダヌ


前の章で説明したRecorderの䜜業の結果は、次の圢匏のコマンドセットであるこずに泚意しおください。

 マりス巊1892 1021
䞀時停止10000
ピッチ-0.89
マりス右942 498
䞀時停止10000
移動83.72 50.03 0.604
キヌ `
䞀時停止1000
キヌ{SPACE}
ピッチ-0.1
移動83.777 50.207 1.235
移動83.777 50.207 2.114
移動83.777 50.207 2.827
移動83.777 50.207 2.855
移動83.754 50.327 2.855 

䞀芋、それらを「倱う」こずは難しいこずではないようですが、このプロセスを詳しく芋おみたしょう。

パンずチルト

ボタンを抌しお回転および傟斜させるず、玄30床の粟床が埗られたすが、これはタスクでは受け入れられたせん。 したがっお、このために2番目の機䌚を䜿甚したす右ボタンを抌したたたマりスを移動したす。 アルゎリズムは次のずおりです。
  1. マりスの右ボタンを抌したたたにする
  2. ゲヌム自䜓は、画面の䞭倮にカヌ゜ルを眮き、そこに保持したす。 これにより、ナヌザヌは、画面の端にカヌ゜ルを眮いお最埌に䌑たないようになりたす。
  3. カヌ゜ルを特定のピクセル数だけ巊右に移動したす
  4. キャラクタヌの方向は巊たたは右にシフトしたす。 さらに、カヌ゜ルを速く動かすほど、キャラクタヌは速く回転したす

珟圚ず必須の2぀の角床がある堎合、どの方向がより収益性が高いかを刀断するのはどのように簡単ですか

正の堎合は、角床の違いを右に芋るこずができたす。 ただし、珟圚の角床は30床、必芁な角床は330床です。 違いはマむナスですが、私たちは気にしたせん。 たた、角床は負の倀にするこずができたす。 これらすべおの条件を曞き出す必芁がないように、単に角床の差のサむンを䜿甚しお、そのサむンのみを調べたす。

$ wantおよび$ current倉数にはx、y、azimuthが含たれたす

 Func Turn($want) while true $current = GetPos() $sin = sin($current[2] - $want[2]) ;ToolTip(StringFormat("(%.2f,%.2f,%.2f) to (%.2f,%.2f,%.2f)", $current[0], $current[1], $sin, $want[0], $want[1], $want[2])) if abs($sin) < 0.05 then return MouseMove(MouseGetPos(0)+50*$sin, MouseGetPos(1), 1) wend EndFunc 

サむンにより、回転速床を調敎するこずもできたす。 角床が小さいほど、カヌ゜ルはより正確に動き、より正確に回転したす。 逆もたた然りで、倧きな角床ではより速く回転したい。

氎平線ぞの傟きを倉曎する機胜は完党に類䌌しおおり、カヌ゜ルを垂盎に移動する必芁があるだけです。

䞊蚘のコヌド䟋では、䞍正なボットの動䜜に぀ながる可胜性のある論理゚ラヌがありたす。 私は奜奇心の匷い読者にそれを自分で芋぀けるように勧めたす。

ムヌブメント

次の芁件がトラフィックに適甚されたす
  1. 䜍眮決め粟床が䜎い。 あなたが望む堎所に正確に到達するこずはできたせん
  2. 方向転換せずに移動する必芁がありたす。 利甚可胜な動きのうち、前方ぞの走行、埌方ぞの埌退、および暪行のみがありたす旋回せずに暪向きの動き
  3. 動きは、停止たたはけいれんなしで連続的でなければなりたせん
  4. できるだけ少ないリタヌンず方向の倉曎。 キャラクタヌが少し走っおから埌退し、再び走った堎合など、モニタヌを芋るのは䞍快です


前方か埌方か

数孊が奜きではない、たたは高校を長い間卒業しおいない堎合は、理解を損なうこずなくこのセクションをスキップできたす。 しかし、ここでは特に耇雑なこずはありたせん。 キャラクタヌをa x 、a y の䞊に立っお、角床を芋おみたしょう そしお、圌はb x 、b y に入る必芁がありたす、圌は前方たたは埌方に走りたすか たず、タスクをわずかに蚀い換えたす。キャラクタヌを0、0に立っお、 、しかしd x 、d y で圌を必芁ずしたす。

問題を真正面から解決する堎合、ベクトル間の角床の䜙匊を蚈算する必芁がありたす。 正の堎合、角床は鋭く、前方に進みたす。 負の堎合-愚か、あなたは埌退する必芁がありたす。 コサむンはコサむン定理によっお蚈算できたす

ただし、このためには、各ベクトルの長さを蚈算し、根を抜出する必芁があり、非垞に面倒です。

スカラヌ積公匏もありたす

ご存知のように、デカルト座暙系では次の匏で蚈算できたす

したがっお、スカラヌ積を蚈算しおその笊号を調べた埌、前方に実行するか埌方に実行するかを決定できたす。 そしお、私たちの堎合、次の匏で蚈算したす 。 さらに、この同じスカラヌ積は、 幟䜕孊的定矩 あるベクトルの別のベクトルぞの投圱に2番目のベクトルの長さを掛けたものに応じお正確にどれだけ前進たたは埌退する必芁があるかを瀺しおいたす。
画像

巊か右か

同様に、ビュヌベクトル間の角床のサむン そしおタヌゲットぞの方向d x 、d y はどちらの偎に行くかを決定したす。 正の堎合、目暙は右手にあり、その逆も同様です。 ここで、 ベクトル積は、より正確には、匏によっおデカルト座暙で蚈算された擬䌌スカラヌ積に圹立ちたす。

繰り返したすが、この数倀の倧きさによっお、必芁なサむドステップの数が決たりたす。

実装

掚論をプログラムしたす

 Func ScalarMult($a, $b, $x, $y) return $a*$x + $b*$y EndFunc Func VectorMult($a, $b, $x, $y) return $a*$y - $b*$x EndFunc Func GetDirection($x, $y, $wx, $wy, $angle) $dx = $x - $wx $dy = $y - $wy local $result[2] = [ ScalarMult(-sin($angle), -cos($angle), $dx, $dy), VectorMult(-sin($angle), -cos($angle), $dx, $dy) ] Return $result EndFunc 

プログラム内でサむンずコサむンが入れ替わり、反察の笊号でずられおいるこずを混同しないでください。 WoWでは、方䜍角は北から反時蚈回りにカりントされたす。 これらの詳现は、実際のプログラムで単玔に「詊す」こずができたす。 そしお、それが逆になった堎合、暙識で遊んでください。

GetDirection関数は、次の2぀の倀の配列を返したすどれだけ前進/埌退するか、どれだけ暪に移動するか。

これはひねりです

䞀郚の読者は次のように叫ぶかもしれたせん。「なぜ、これらの正匊-䜙匊による乗算は、座暙系の通垞の回転にすぎない、

説明した
画像
なぜ私たちの頭をだたすか。」

確かに、しかし、マトリックスがそのようなものである理由を説明するこずは私にずっおより難しいでしょう。

やめお

これで実行ボタンを抌す準備ができたした

 Func Move($want) while true StartMoving() local $pos = GetPos() local $dir = GetDirection($pos[0], $pos[1], $want[0], $want[1], $pos[2]) ;ToolTip(StringFormat("(%.2f,%.2f,%.2f) to (%.2f,%.2f, %.2f): (%.2f,%.2f)", $pos[0], $pos[1], $pos[2], $want[0], $want[1], $want[2], $dir[0], $dir[1])) if abs($dir[0]) < 0.1 And abs($dir[1]) < 0.1 then ExitLoop if abs($dir[0]) >= abs($dir[1]) Then Send("{a up}{d up}") if $dir[0] <=0 Then Send("{w down}{s up}") ; forward Else Send("{s down}{w up}") ; backward EndIf Else Send("{s up}") if $dir[1] < 0 Then Send("{d down}{a up}") ; right Else Send("{a down}{d up}") ; left EndIf EndIf wend Send("{s up}{a up}{d up}") EndFunc 

私たちは最も遠くに行く方向に進んでおり、私たちがほずんどそこにいるずきにパスを終了するこずに泚意しおください。 これにより、キャラクタヌがちら぀きたせん。 転送ボタンは、宛先に到達しおもリリヌスされたせん。 したがっお、必芁な角床で比范的迅速に旋回する必芁がありたす。

コマンドファむルの再生を担圓するコヌドは、興味深いものではありたせん。必芁に応じお、自分で慣れるこずができたす。
プレヌダヌの完党な゜ヌスコヌド
 #include <Color.au3> Global $WinName = "World of Warcraft" Opt("PixelCoordMode", 2) ;          Opt("MouseCoordMode", 2) ;          $paused = false $moving = false HotKeySet("{F11}", "Pause") HotKeySet("{F10}", "Kill") ;WinActivate($WinName) $hwnd = WinGetHandle($WinName) WinWaitActive($hwnd) PlayFile("outdoor.txt", 0) PlayFile("indoor.txt", 0) PlayFile("outdoor.txt", 0) PlayFile("indoor.txt", 0) PlayFile("outdoor.txt", 0) PlayFile("indoor.txt", 0) PlayFile("outdoor.txt", 0) PlayFile("indoor.txt", 0) PlayFile("outdoor.txt", 0) PlayFile("indoor.txt", 0) Func PlayLine($line) local $command = StringSplit($line, " ", 2) ;ToolTip(StringFormat("%s %s %s", $command[0], $command[1], $command[2])) Switch $command[0] Case "move" local $want[3] = [ number($command[1]), number($command[2]), number($command[3]) ] Move($want) Turn($want) Case "pause" StopMoving() Sleep($command[1]) Case "key" If $command[1] = "{SPACE}" Then Send("{SPACE down}") Sleep(300) Send("{SPACE up}") Else StopMoving() if UBound($command) > 2 Then Send($command[1] & " " & $command[2]) Else Send($command[1]) EndIf Sleep(1500) EndIf Case "mouse" StopMoving() MouseClick($command[1], $command[2], $command[3]) Sleep(500) Case "pitch" SetPitch($command[1]) EndSwitch EndFunc Func PlayFile($filename, $skip = 0) $hfile = FileOpen($filename, 0) For $i = 1 to $skip $line = FileReadLine($hfile) Next while True $line = FileReadLine($hfile) if @error = -1 Then ExitLoop PlayLine($line) wend FileClose($hfile) StopMoving() EndFunc Func Sign($x) if ($x < 0) then return -1 else return 1 EndIf EndFunc Func ScalarMult($a, $b, $x, $y) return $a*$x + $b*$y EndFunc Func VectorMult($a, $b, $x, $y) return $a*$y - $b*$x EndFunc Func StartMoving() if $moving then return $moving = true; WinWaitActive($hwnd) MouseMove(@DesktopWidth/2, @DesktopHeight/2, 0) MouseDown("right") Sleep(300) EndFunc Func StopMoving() $moving = false Send("{w up}{s up}{a up}{d up}") MouseUp("right") Sleep(300) EndFunc Func GetPitch() StartMoving() $pixel2 = _ColorGetRGB(PixelGetColor(10, 0, $hwnd)); Return ($pixel2[2]/255.0-0.5)*4 EndFunc Func GetPos() StartMoving() $pixel1 = _ColorGetRGB(PixelGetColor(0, 0, $hwnd)); $pixel2 = _ColorGetRGB(PixelGetColor(10, 0, $hwnd)); local $result[3] = [ ($pixel1[0]+$pixel1[1]/255.0)/255*100, ($pixel2[0]+$pixel2[1]/255.0)/255*100, $pixel1[2]*7.0/255 ] return $result EndFunc Func GetDirection($x, $y, $wx, $wy, $angle) $dx = $x - $wx $dy = $y - $wy local $result[2] = [ ScalarMult(-sin($angle), -cos($angle), $dx, $dy), VectorMult(-sin($angle), -cos($angle), $dx, $dy) ] Return $result EndFunc Func Move($want) while true local $pos = GetPos() local $dir = GetDirection($pos[0], $pos[1], $want[0], $want[1], $pos[2]) ToolTip(StringFormat("(%.2f,%.2f,%.2f) to (%.2f,%.2f, %.2f): (%.2f,%.2f)", $pos[0], $pos[1], $pos[2], $want[0], $want[1], $want[2], $dir[0], $dir[1])) if abs($dir[0]) < 0.1 And abs($dir[1]) < 0.1 then ExitLoop if abs($dir[0]) >= abs($dir[1]) Then Send("{a up}{d up}") if $dir[0] <=0 Then Send("{w down}{s up}") ; forward Else Send("{s down}{w up}") ; backward EndIf Else Send("{s up}") if $dir[1] < 0 Then Send("{d down}{a up}") ; right Else Send("{a down}{d up}") ; left EndIf EndIf wend Send("{s up}{a up}{d up}") EndFunc Func Turn($want) while true local $current = GetPos() $sin = sin($current[2] - $want[2]) ;ToolTip(StringFormat("(%.2f,%.2f,%.2f) to (%.2f,%.2f,%.2f)", $current[0], $current[1], $sin, $want[0], $want[1], $want[2])) if abs($sin) < 0.05 then return MouseMove(MouseGetPos(0)+50*$sin, MouseGetPos(1), 1) wend EndFunc Func SetPitch($want) while true $current = GetPitch() $sin = sin($current - $want) ;ToolTip(StringFormat("pitch %.2f to %.2f: %.2f", $current, $want, $sin)) if abs($sin) < 0.05 then return MouseMove(MouseGetPos(0), MouseGetPos(1)+50*$sin, 1) wend EndFunc Func Pause() $paused = not $paused if $paused then StopMoving() While $Paused Sleep(1000) WEnd EndFunc Func Kill() StopMoving() Exit EndFunc 


管理roボット



それがすべおのようです。 ルヌトに沿っお実行し、座暙、キヌストロヌク、クリックを曞き留め、再生を有効にしたす。 しかし、そこにありたした。 これが最も難しい郚分の始たりです。

Mobはダンゞョンに䜏んでいたす。Mobはキャラクタヌの生掻に脅嚁を䞎えたせんが、気絶させ、「沈黙」を投げ、殺したいずきに脇に逃げ、思い぀いた瞬間に容赊なく駆け぀けたす。完党に異なる暎埒をタヌゲットに持ち蟌みたす。 タヌゲットが背䞭の埌ろを走る堎合もあれば、䞀撃で死ぬ堎合もありたすが、3回生きるはずです。 䞀般に、それらの混oticずした振る舞いは私たちのルヌトにランダム性の顕著な芁玠を導入し、その結果、キャラクタヌは最初に誰かを殺すこずができなかったずいう理由だけで、ルヌトの最埌のロックされたドアにいる可胜性がありたす。

はい、ゲヌム内のマクロを䜜成しお目的のMobをタヌゲットにし、それによっおいく぀かの問題を取り陀くこずができたしたが、ボットを可胜な限り汎甚的にしたかったのです。

栌子ドア。 開くにはそれらをクリックする必芁がありたす。 そしお、それらは栌子であるため、誀っお穎に優しくクリックするこずができたす。 そしおキャラクタヌは、さらに走ろうずしお額をドアにぶ぀けたす。

したがっお、ルヌトを蚘録したら、ノヌトブックで開いおデバッグしたす。 あなたはキャラクタヌを芳察し、問題や起こりうる問題の堎合、ルヌトに「束葉杖を運転」したす忠実床のために远加の呪文を挿入し突然暎埒が生き残りたす、歩きたいずいう願望に関係なく、暎埒が正確に芋えお到達するポむントに到達したす。 あなたはルヌトを倉えるので、あなたは確かにこの䞍運な箱に぀たずかないこずはありたせん。 10レヌス埌、そこで突然すべおのクモを殺した方が、埌の10分の1で突然の呪文でリベンゞできるようになるよりも良いずいう結論に達したした。 しかし、キャラクタヌがすでに自分で走っおいるずきは、自分の足で走るのではなく、ただ芋たいだけです。

ロヌバヌを起動したり、ロボット掃陀機をプログラムしたり、真っ暗闇の䞭でアパヌトを歩き回ったり、ロボットにサッカヌを教えるこずの気持ちを実感したした。 䜙裕を持っおすべおを確実に行う必芁がありたす。 火星では、穎がいたるずころにあり、突出した岩や掞窟もありたす。 アパヌトでは、どこでもワむダヌずスリッパがロボット掃陀機に盎面したす。たた、遊びたい猫もいたす。 真っ暗闇では、角、怅子の足、さらには床に萜ちたナむフもありたす。 タッチするだけ

私は認めたす、私は最埌の郚分で述べられた最小限のプログラムだけを実行したした。 ボットはただ1の確率でタスクを完了しない堎合がありたす。 ですから、あなたは倜に圌をコントロヌルするこずなく離れるこずができたせん、圌は立ち埀生したす。

ボットに察抗する



MMORPGゲヌムから遠く離れた人々は、「なぜボットに煩わされるのですか 結局のずころ、自動化はどこでも歓迎されおいたす。 党員が同じを支払う堎合、機䌚は等しくなければなりたせん。 それ以倖の堎合、䟵害された郚分は気分を害し、再生を停止したす。 たずえば、ゲヌムでマクロを䜿甚できる堎合、プログラマヌはそれらを理解するべきではありたせん。 したがっお、ゲヌム開発者は、ラむセンス契玄ずモニタヌのレベルでの自動化の䜿甚を犁止しおいたす。

私はよくBlizzard これはWoWの開発者の監芖が䞍十分であり、ボットはどこにでもあるずいう感嘆に䌚いたした。 たず、私はそうは思わない。圌らのシェアは誇匵されおいるず思う。 そしお次に、開発者の兵噚庫にあるものに぀いお議論したしょう。 ボットを認識するだけでなく、裏付けずなる事実をどのように持぀か。 実際、疑惑に基づいお、プレヌダヌを犁止するこずは無瀌です。

, - ( ) . , «» , : , , ( ), , — . , , , , «».

Blizzard Warden . :
  1. - , -
  2. , ,

, - Wine . Blizzard .

, , :
  1. , ,
  2. -

ban-wave .
AutoIt , , «» . Blizzard , , .

おわりに


:
  1. ,

, , . 20 ( 5 ). , , . . , , , - .

, , . がんばっお。

Source: https://habr.com/ru/post/J189874/


All Articles