AutoIt Bot mit PixelSearch und PixelGetColor

Als kleine Vorbereitung den Artikel von gestern über PixelSearch lesen, wenn ihr den noch nicht kennt.

Zusätzlich zu PixelSearch spielt PixelGetColor eine sehr wichtige Rolle beim Automatisieren von komplexeren Aufgaben. Wie der Name der Funktion schon deutlich macht wird die Farbe eines Pixels abgefragt. Das Prinzip ist also recht simpel:

PixelGetColor(x, y)

liefert den dezimalen Farbwert des Pixels mit den Koordinaten x und y. Da wir bei PixelSearch und auch sonst aber öfter mit den hexadezimalen Farbwerten arbeiten bietet es sich an PixelGetColor immer mit der Funktion Hex zu kombinieren:

Hex(PixelGetColor(x, y),6)

Hex wandelt den übergebenen Wert um, 6 gibt die Länge des hexadezimalen Rückgabewerts an (bis zu 8).
Das Ergebnis von

Hex(PixelGetColor(x, y),6)

auf einem bestimmten Pixel losgelassen ist eine simple Zeichenkette wie „A3BB4C“ und kann daher auch ganz einfach so abgefragt werden:

If Hex(PixelGetColor($x, $y),6)="A3FFBC" Then
   do something
EndIf

Ansonsten kommt nicht viel dazu, es wird nur etwas konkreter.
Und zwar geht es um dieses geniale Flash Game hier: Curveball.
Vielleicht kennen es einige von euch ja. Die Grafik des Spiels ist ebenso bahnbrechend wie die Spielidee. Ein Wunder, dass es noch kostenlos ist!
Aber Spaß beiseite, das Spiel eignet sich suuper zum üben dieser Funktionen.

Der Hauptteil des Bots ohne Kommentare sieht in etwa so aus:

MsgBox(0,"Ecke oben links","Führe die Maus über die Ecke des Flash-Games oben links, du hast " & ($waittime/1000) & " Sekunden.")
Sleep($waittime)
$ol = MouseGetPos()
$center = PixelSearch($ol[0],$ol[1],$ol[0]+472,$ol[1]+315, 0xFFFFFF)
while True
	If Hex(PixelGetColor($center[0]+170,$center[1]+110),6)="FFFFFF" Then
		MouseClick("left",$center[0]+170,$center[1]+110,1,1)
	EndIf
	If Hex(PixelGetColor($center[0]+170,$center[1]+110),6)="EFFFEC" Then
		MouseClick("left",$center[0]+170,$center[1]+110,1,1)
	EndIf
	$Ballposition = PixelSearch($ol[0],$ol[1],$ol[0]+472,$ol[1]+315, 0xF0FFED, 2, 1)
	If Not @error Then
		MouseMove( $Ballposition[0], $Ballposition[1], 1)
	EndIf
WEnd

Simpel aber äußerst effektiv. Wie im letzten Post gestern schon geschrieben; das ganze PixelSearch-relative Variablen-PixelGetColor-Gedöns zu schreiben kostet erstaunlich viel Zeit. Es sieht so simpel aus aber bei jedem Spiel muss man theoretisch komplett von vorn anfangen. Überlegen, ob man Pixel sucht, relative Koordinaten abfragt und ganz viel Kleinkram. Aber ist das Werk vollbracht ist es natürlich viel mächtiger als wenn der User jedes Mal am Anfang alle Koordinaten übergeben muss.

Interessiert, wie es aussieht? Dann Spielseite geöffnet und mein Script gezogen:
Download section
CurveBot.exe
oder
CurveBot.au3 (mit all meinen Tests, Kommentaren etc, die nötig waren, bis ich den Bot funktionstüchtig fertig hatte)

Ich hoffe ihr konntet was lernen!

7 Kommentare

  1. Genau, ab Level 10 kann selbst der Bot nicht schnell genug dem Ball folgen. Da gewinnt der Computer. Warum? Recht simpel: der Computer muss dem Ball nicht folgen, wie der Bot. Er weiß, wo der Ball landen wird, wo er ihn zurückschlagen wird. Dieses Wissen ist allerdings von anfang an gehandycapt (oder wie das geschrieben wird, is halb eins…). Mit jedem Level wird das Handycap verringert, so dass der Computer ohne viel Bewegung sich einfach zu dem Ort bewegt, wo der Ball landen wird. Der Bot kann das nicht berechnen und sobald der Ball zu schnell wird wars das.
    Also unbesiegbar kann der Bot leider nicht werden 😉

    Aber das Prinzip sollte klar sein. Du kannst ja probieren den Code so aufzubessern, dass der Bot unbesiegbar wird. Die Flugbahn vorausberechnen oder so 😉

  2. Bssl spät, aber hoffe trotzdem das jemand helfen kann,
    möchte gerne ein bot haben der auf farbe regariert.

    also spiele halt ein mmorpg und da gibt es eine angelfunktion und ich möchte das er immer perfect angelt,

    da taucht ein balken auf das sich schnell blau füllt, und dann wieder zurück, und dieser farbbot oder wie man es nennt soll genau dann leertaste drücken sobald es diesen perfecten voll punkt erreicht hat, meine erklärung ist ziemlich undeutlich aber hoffe das man es trotzdem versteht. am besten wie dieser farbcolor aimbot für cs:s wo man sich die posi aussuchen darf und den farbcode und das der dann leertaste drückt, problem beim css farbcodeaimbot es ist detected in diesem mmorpg es schmeißt mich direkt aus dem spiel raus.

    also so gesehen möchte ich nur position auf dem bildschirm + farbcode bestimmen und welche taste verwendet werden soll.

    ich hoffe das dieser cs:s coloraimbot nur detected ist weil da bestimmt viel reinprogrammiert wurde wie z.b der aimbot ect.

  3. Hallo Sino,
    lass mich raten – Black Desert Online? 😉
    Davon abgesehen: ein Bot, der auf Farben in bestimmten Bereichen des Bildschirms reagiert, ist mit AutoIt wirklich leicht zu bauen.

    Grundsätzlich nutzt du die Funktion PixelSearch(), welches in einem bestimmten Suchbereich einer einer bestimmten Farbe bzw. einer Variation davon sucht.
    Beispiel:
    PixelSearch(100, 110, 220, 200, 0xFF0000, 2)
    sucht in dem Bereich von dem Punkt oben-links [100, 110] bis zum Punkt unten rechts [220, 200] (Pixelangaben x und y, also ein Rechteck) nach der Farbe Rot und 2 Abstufungen davon. Entweder bekommst du ein Array von Koordinaten zurück, wenn die Farbe gefunden wurde, oder einen Fehler.
    Anhand der Angabe der Koordinaten kannst du auch die Suchrichtung beeinflussen – steht alles in dem Hilfeartikel.
    Mit IsArray() kannst du die Rückgabe empfangen und mit einem if() ganz einfach testen.

    Praxisbeispiel: Detection & Reaction:

    If IsArray(PixelSearch(234, 112, 316, 165, 0xBAA13D, 2)) Then
       ConsoleWrite("####### Location: Map Overview" & @CRLF)
       ; go to arena
       MouseClick("left",$ol[0]+235, $ol[1]+165,1)
    EndIf
    

    Es gibt jedoch gewisse Grenzen, wo die Informationsverarbeitung nicht effektiv genug ist. Wenn du im Millisekundenbereich reagieren musst, solltest du den Suchbereich möglichst klein halten.

    Ich habe vor einiger Zeit einen Bot für das Flashgame Swords and Souls geschrieben, der stark auf diese Farbsuche aufbaute. Ich werde den Mal in eine Form bringen, dass man ihn veröffentlichen kann, und dann hier in einem kurzen Artikel posten. Dann kannst du dir ja ein paar Zeilen ansehen.

  4. Hallo ich habe eine frage zu pixelsearch…

    Ich habe ein viereck jede ecke hat ja eine position und  in meinem fall jede ecke eine andere farbe… wenn jetzt nach und nach jede ecke aufleuchtet und genau die farbe gezeigt wird die ich brauche erst dann soll er an x, y ein tastendruck machen könnt ihr mir helfen?

    das was ich geschrieben habe da geht er nicht alle positionen ab sondern nur wenn an einer der 4 stellen es übereinstimmt -_-

    #include <array.au3>
    HotKeySet(„{F1}“,“start“)
    HotKeySet(„{ESC}“,“ende“)
    While (1)

    Sleep(100)
    WEnd
    Func start()
    While (1)
    $pix1 = PixelSearch(888,556,898,603,0x2BaB3F,5) ;grün
    if IsArray ($pix1)=True Then

    MouseMove ( $pix1 [0], $pix1 [1], 1)
    EndIf
    $pix2 = PixelSearch(846,560,865,604,0x2BaB3F,5) ;grüner balken davor
    if IsArray ($pix2)=True Then
    MouseMove ( $pix2 [0], $pix2 [1], 1)
    EndIf
    $pix3 = PixelSearch(905,457,922,489,0x2BaB3F,5) ;kleiner grüner balken
    if IsArray ($pix3)=True Then

    MouseMove ( $pix3 [0], $pix3 [1], 1)
    EndIf
    $pix4 = PixelSearch(880,394,902,403,0x2BaB3F,5) ;RSI unter 30%
    if IsArray ($pix4)=True Then
    MouseMove ( $pix4 [0], $pix4 [1], 1)
    endif
    $pix5 = PixelSearch(905,153,921,299,0x2BaB3F,5) ;Traid
    if IsArray ($pix5)=True Then
    MouseMove ( $pix5 [0], $pix5 [1], 1)
    MouseMove ( 1306,508 )
    MouseClick („left“)
    Sleep(10000)
    EndIf
    WEnd
    EndFunc

    Func ende()
    Exit
    EndFunc

Schreibe einen Kommentar