Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT] AutoIT'owanie - część I: Bot do pasjansa :D


Rekomendowane odpowiedzi

Opublikowano

AutoIT'owanie - część I: Bot do... pasjansa!?

Czyli moja seria tutków o AutoIcie :)

 

Witam. Postanowiłem w międzyczasie napisać serię tutków o tym, jak napisać różne programy w tym cudnym języku :P

Na początek poruszę temat tego, o co ostatnio ludzie pytają - (niekoniecznie) Proste boty do gierek.

Podczas czytania tego tuta, natrafisz na kod w spoilerach. Jeśli chcesz się nauczyć więcej, nie zaglądaj tam (no, chyba że masz jakiś większy problem ze skryptem, i chcesz sobie obejrzeć, jak to powinno wyglądać), tylko napisz wszystko po swojemu, jedynie według moich wskazówek. Jeśli jednak chcesz polecieć na łatwiznę, otwórz może od razu wszystkie spoilery, a najlepiej przekopiuj sobie tylko końcowy kod, i sprawdź czy działa.

 

No dobra, zaczynamy.

 

I: Projektowanie programu

 

Przyda się od tego zacząć, nie :D? Bez ogólnego zarysu co ma robić program, raczej nie będziemy mogli go napisać.

Powiedzmy, że stworzymy bota do Pasjansa (pod Win XP, nie wiem czy tak samo będzie na Viście/7). Może nam się to wydać nieco trudne, aczkolwiek możliwe.

 

No dobra, ale co on może robić? Może nam po prostu układać karty. Tylko jest kwestia - jak?

Otóż jest w pasjansie taka opcja jak Przeciąganie konturu. Dzięki niej, podczas gry, kiedy przeciągniemy kartę na dobre pole, to wyświetli się w negatywie. Wykorzystamy ten numer do stworzenia bota.

 

Okej, właśnie zaprojektowaliśmy sposób działania bota, możemy to też nazwać algorytmem działania bota (algorytm to sposób w jaki program działa, więc określenie jest trafione).

 

Teraz pomyślmy czy nasz bot potrzebuje czegoś więcej. W sumie po co nam GUI, skoro bot ma wykonywać tylko jedną czynność (układanie kart), równie dobrze możemy nim sterować klawiszami. I tak też zrobimy.

 

No, wychodzi na to że zaprojektowaliśmy nasze bocisko :3. Ustaliliśmy zasadę jego działania, oraz sposób komunikacji z użytkownikiem. Przechodzimy do programowania.

 

II: Programowanie

 

Czas uruchomić SciTE, i zacząć tworzenie naszego dzieła. Zacznijmy od stworzenia folderu na nasz program, i zapisania pustego pliku, żeby uniknąć szukania miejsca na zapis później.

Zakładam że czytając ten tutek, przeczytałeś już tutoriale o programowaniu w AutoIT (niekoniecznie jeden, przecież są w internecie różne tutki), i ewentualnie napisałeś już kilka prostych skryptów.

 

Okej, od czego zacząć? Może zacznijmy od 'szablonu' programu, czyli głównej pętli i opcji wyjścia z programu.

Powinno to wyglądać mniej-więcej tak:

 

HotKeySet ("{End}", "Wyjscie")

Func Wyjscie()
Local $msgbox = MsgBox (32+4, "Wyjscie", "Na pewno chcesz wyjsć?")
If $msgbox = 6 Then Exit
EndFunc

While 1
Sleep (100)
WEnd

 

 

Myślę że nie trzeba nic tłumaczyć, ale jednak dla pewności to zrobię.

 

Na początku wstawiliśmy polecenie przypisania do klawisza End funkcji Wyjscie (czyli zrobienie z niego hotkeya). Potem zadeklarowaliśmy funkcję Wyjście, która wyświetli nam MsgBoxa z pytaniem o wyjście, i jeśli użytkownik kliknie 'Tak', wyłączy program. Na samym końcu (i pamiętajmy że najlepiej będzie jeśli zawsze będzie na samym końcu skryptu) wstawiliśmy pętlę która podtrzymuje nasz program przy życiu.

 

Okej, teraz musimy przemyśleć jak napisać to co zaplanowaliśmy. Program ma przeciągać karty i ustawiać je tam gdzie może je ustawić. I tutaj przychodzą nam z pomocą funkcje MouseDown oraz MouseUp.

Nie, nie możemy użyć funkcji MouseClickDrag...

 

Składnia (taka sama dla obu funkcji)

MouseDown ("klawisz")

 

No dobra, ale to nam tylko wykonuje akcję kliknięcia i przytrzymania klawisza na aktualnej pozycji. Musimy więc poruszyć myszką w nasze miejsce, w czym nam pomoże funkcja MouseMove

 

Składnia

MouseMove ( x, y [, szybkosc] )

 

Okej, wiemy już jak możemy przeciągać kartę w inne miejsce. Jest tylko jeden problem - potrzebujemy współrzędnych.

I tutaj z pomocą przychodzi nam nasza umiejętność programowania w AutoIcie. Wystarczy napisać prosty skrypt, który umożliwi nam zapisanie (np. do pliku) współrzędnych dowolnego punktu na ekranie.

 

Jeśli jednak jesteś leniwy i nie chce ci się kombinować, to łap gotowca:

 

` - Zapis aktualnej pozycji myszy do pliku

Esc - Wyjście z programu

Pozycja jest zapisywana w formacie X, Y

HotKeySet ("{`}", "zapiszpozycje")
HotKeySet ("{Esc}", "wyjscie")

$hLog = FileOpen (@ScriptDir&"\log_pozycjemyszy.txt", 10)

Func wyjscie()
Exit
EndFunc

Func zapiszpozycje()
FileWrite($hLog, MouseGetPos(0)&", "&MouseGetPos(1)&@CRLF)
EndFunc

While 1
ToolTip ("Aktualna pozycja myszy: "&MouseGetPos(0)&", "&MouseGetPos(1), 0, 0)
Sleep (100)
WEnd

 

 

Skoro napisaliśmy (lub nie :P) skrypt do zapisywania pozycji myszy, musimy odczytać pozycje naszych pasajnsowych kart (wszystkich, pól na asy też). Tak więc odpalamy program, i zapisujemy mniej-więcej pozycję naszych kart (pamiętajmy, że nie będziemy mogli ruszyć okienkiem pasjansa żeby wszystko działało! Potem napiszę jak to troszkę ominąć).

 

Skoro mamy nasze współrzędne (powinno ich być 13, nie zapomnijmy o miejscu, gdzie karta będzie się pojawiać po kliknięciu na zakrytą talie), możemy teraz sprawdzić czy nam wszystko działa, na przykład pisząc skrypt który nam przeleci myszką po każdych współrzędnych (funkcja MouseMove). Z napisaniem 12 linijek kodu z tą funkcją (albo nieco trudniejszego skryptu, który poruszy myszką po współrzędnych z pliku) nie powinieneś mieć problemu....

 

Dobra, dam wam ten 'trudniejszy' skrypt... Macie leniuchy:

 

Jeśli zmieniliście nazwę pliku z logiem z mojego poprzedniego skryptu, który zapisuje pozycje do myszy, albo macie swój log (pamiętaj, że każde współrzędne w formacie X, Y muszą być zapisane w oddzielnej linijce!), zmieńcie nazwę/pozycję pliku w zmiennej $logfile na swoją.

#include <File.au3>
$logfile = @ScriptDir&"\log_pozycjemyszy.txt"
$lines = _FileCountLines($logfile)
$i = 0
Sleep (1500)
While $i <= $lines
Execute("MouseMove("&FileReadLine($logfile, $i)&")")
$i += 1
Sleep (100)
WEnd
Exit

 

 

Okej, skoro wszystko działa (jak nie działa, to postaraj się to naprawić) to możemy się zabrać za pisanie funkcji która będzie nam przesuwała kartę nad wszystkimi polami. No to bierzemy się do roboty :)

 

Stwórzmy nową funkcję (dla czytelności kodu, wszystkie istotniejsze operacje będziemy zapisywać w funkcjach, jeśli mogę to w ten sposób powiedzieć :)) o nazwie PrzesunKarte

 

Func PrzesunKarte()

EndFunc

 

Okej, ale skoro tak, to gdzie będą współrzędne kart?

Odpowiedź jest prosta - Tablica!

Możemy przecież stworzyć tablicę dwuwymiarową, w której zapiszemy wszystkie koordy. Dlaczego dwuwymiarową, a nie jedno? Po prostu tak jest wygodniej, nie trzeba kombinować.

 

No dobra, w takim razie tworzymy tablicę (pamiętajmy, że musimy ją stworzyć, więc dobrze będzie jak wstawimy słówko Global), nazywamy ją $KoordyKart i zapisujemy do niej nasze koordy. Całość więc powinna wyglądać mniej-więcej tak:

 

HotKeySet ("{End}", "Wyjscie")

Global $KoordyKart[13][2] = [[113, 154],[198,143],[352, 151],[456, 167],[525, 158],[606, 158],[603, 276],[527, 269],[435, 268],[376, 271],[272, 267],[196, 264],[111, 265]]
Func Wyjscie()
Local $msgbox = MsgBox (32+4, "Wyjscie", "Na pewno chcesz wyjsć?")
If $msgbox = 6 Then Exit
EndFunc

Func PrzesunKarte()

EndFunc

While 1
Sleep (100)
WEnd

 

 

No, to bierzmy się za pisanie naszej funkcji, która będzie nam przeciągać kartę.

W tej funkcji najlepiej po prostu umieścić pętlę, która nam 'przeleci' przez wszystkie indeksy w tablicy, i poruszy myszką na koordy w aktualnych indeksach. Zaczynamy.

 

Najpierw, stwórzmy zmienną $i, która będzie nam potrzebna podczas 'przelatywania' po indeksach (no, chyba że chcesz lecieć na hardkora i użyć pętli For :D. W takim wypadku 'radź se sam'), i dajemy jej wartość 0 (ponieważ indeksy tablicy zaczynają się od zera). Potem stwórzmy pętlę While, i każmy jej działać dopóki zmienna $i jest mniejsza od wielkości tablicy z współrzędnymi.

A jak otrzymać wielkość naszej tablicy? Służy do tego funkcja UBound

 

Składnia

UBound ( Tablica [, Wymiar] )

 

Oczywiście że możemy po prostu wpisać to durne '13' zamiast bawić się z funkcjami. Ale dzięki tej funkcji zabezpieczymy program przed ewentualnym błędem, i nasza funkcja przy okazji stanie się uniwersalna. Radzę używać tego sposobu, zamiast wpisywania wielkości tablicy, ponieważ czasami może się zdarzyć że napiszemy program który sam stworzy tablicę, która będzie ustawiana przez użytkownika, i jej wielkość będzie się zmieniała.

 

Okej, w takim razie, skoro stworzyliśmy naszą pętlę, to możemy teraz pomyśleć co tam może być. Narazie, skoro program ma tylko ruszać myszką, musimy tam dopisać żeby program ruszał myszką, na koordynaty z tablicy. Prościzna :P

 

Jeśli nie masz jeszcze otwartych wszystkich spojlerów i nie wiesz jak zrobić ten myk ze zmienną dwuwymiarową, zajrzyj tutaj:

 

$zmienna[$i][0] ; -> Przeglądanie za pomocą pętli i zmiennej zerowego indeksu z drugiego wymiaru tablicy.
;Teraz dopasuj to sobie do naszego MouseMove'a

 

 

No okej, powiedzmy że działa. Ale jak zrobić, żeby program chwytał kartę? Dodać do tego kodu MouseUp i MouseDown!

 

I po raz wtóry... gotowiec dla niezapoznanego:

 

HotKeySet ("{End}", "Wyjscie")

Global $KoordyKart[13][2] = [[113, 154],[198,143],[352, 151],[456, 167],[525, 158],[606, 158],[603, 276],[527, 269],[435, 268],[376, 271],[272, 267],[196, 264],[111, 265]]

Func Wyjscie()
Local $msgbox = MsgBox (32+4, "Wyjscie", "Na pewno chcesz wyjsć?")
If $msgbox = 6 Then Exit
EndFunc

Func PrzesunKarte()
$i = 1
MouseClick("left", $KoordyKart[0][0], $KoordyKart[0][1])
While $i < Ubound($KordyKart)
If Not $i = 1 Then MouseUp("left")
MouseMove ($KoordyKart[$i][0], $KoordyKart[$i][1])
MouseDown("left")
$i += 1
WEnd
EndFunc

Sleep(1000)
PrzesunKarte($KoordyKart)

While 1
Sleep (100)
WEnd

 

 

Ja tutaj zrobiłem jeden trick: Dałem w instrukcji warunkowej warunek, który zapobiega nam 'podniesieniu' lewego przycisku myszy przy pierwszym przejściu pętli. Zrobiłem to żeby, jak zwykle, zapobiec bugom (i radzę się tobie wyuczyć tego nawyku, to świństwo jest przydatne :]). Dopisałem też żeby program automatycznie kliknął na zakrytą talię, żeby pojawiła się karta którą ma przeciągnąć :].

 

No dobra, mamy kod. Ale jak sprawdzić czy działa?

Wystarczy w dowolnym miejscu programu (no, niekoniecznie, po pętli nie można) wstawić wywołanie naszej funkcji. Pamiętajmy że musi być ona z parametrem, w którym podamy jej tablicę. Tutaj gotowca nie wstawiam, ponieważ powinieneś wiedzieć jak się robi podstawową rzecz :D

(radzę też wstawić sleepa przed wykonaniem funkcji, żeby mieć czas na aktywację okienka pasjansa)

 

Okej, odpalamy. Ale zauważmy jedną rzecz: Przecież program nie upuszcza nam karty!. W tym celu, musimy wstawić jeszcze jeden MouseUp poza pętlą i wszystko będzie OK.

 

No dobra, mamy już sporo kodu! Ale najgorsze przed nami. Teraz czas zaprogramować algorytm sprawdzania, czy dana karta może być upuszczona na dane pole.

 

No ale moment... jeszcze jedna rzecz xD

 

Napisałem wcześniej że zrobimy trick, dzięki któremu nasz program nie będzie uzależniony od ustawiania współrzędnych kart w kodzie za każdym razem kiedy zmienimy pozycję okienka. A jak? Otóż paru ludzi zasiadło, i wymyśliło coś, co nazywa się kalibracją (inaczej - wzorcowanie), czyli (uwaga, wikipedia!)

ogół czynności ustalających relację między wartościami wielkości mierzonej wskazanymi przez przyrząd pomiarowy a odpowiednimi wartościami wielkości fizycznych, realizowanymi przez wzorzec jednostki miary wraz z podaniem niepewności tego pomiaru.

 

W sumie to jest tylko ciekawostka, z której pewnie niewiele co zrozumiałeś xD, jedziem dalej.

 

Nasza kalibracja będzie polegała na tym, że stworzymy funkcję przypisaną do hotkeya, dzięki której user będzie mógł ustawić koordy z poziomu działającego programu.

Przy okazji dobrze by było, jakby program informował usera co ma zrobić... ale MsgBoxy to dziadostwo, które niestety trochę przeszkadza w boceniu. Musimy więc użyć ToolTipa!

 

Składnia

ToolTip ( "tekst" [, x [, y [, "nazwa" [, ikona [, opcje]]]]] )

 

U nas tooltip będzie się wyświetlać przy myszce, a dzięki temu że jeśli nie podamy parametru X i Y, tooltip automatycznie się pojawi przy myszce.

 

Tyle że... w tym momencie użycie hotkeya traci swoją przydatność, ponieważ hotkey blokuje klawisze. Tutaj najlepiej będzie użyć pętli, oraz funkcji _IsPressed z biblioteki Misc.au3.

 

Składnia:

#include <Misc.au3>
_IsPressed($sHexKey [, $vDLL = 'user32.dll'])

Kody klawiszy znajdziemy w Helpie, pod opisem tej funkcji. Aczkolwiek, dla wygody, macie tutaj listę:

 

01 Left mouse button

02 Right mouse button

04 Middle mouse button (three-button mouse)

05 Windows 2000/XP: X1 mouse button

06 Windows 2000/XP: X2 mouse button

08 BACKSPACE key

09 TAB key

0C CLEAR key

0D ENTER key

10 SHIFT key

11 CTRL key

12 ALT key

13 PAUSE key

14 CAPS LOCK key

1B ESC key

20 SPACEBAR

21 PAGE UP key

22 PAGE DOWN key

23 END key

24 HOME key

25 LEFT ARROW key

26 UP ARROW key

27 RIGHT ARROW key

28 DOWN ARROW key

29 SELECT key

2A PRINT key

2B EXECUTE key

2C PRINT SCREEN key

2D INS key

2E DEL key

30 0 key

31 1 key

32 2 key

33 3 key

34 4 key

35 5 key

36 6 key

37 7 key

38 8 key

39 9 key

41 A key

42 B key

43 C key

44 D key

45 E key

46 F key

47 G key

48 H key

49 I key

4A J key

4B K key

4C L key

4D M key

4E N key

4F O key

50 P key

51 Q key

52 R key

53 S key

54 T key

55 U key

56 V key

57 W key

58 X key

59 Y key

5A Z key

5B Left Windows key

5C Right Windows key

60 Numeric keypad 0 key

61 Numeric keypad 1 key

62 Numeric keypad 2 key

63 Numeric keypad 3 key

64 Numeric keypad 4 key

65 Numeric keypad 5 key

66 Numeric keypad 6 key

67 Numeric keypad 7 key

68 Numeric keypad 8 key

69 Numeric keypad 9 key

6A Multiply key

6B Add key

6C Separator key

6D Subtract key

6E Decimal key

6F Divide key

70 F1 key

71 F2 key

72 F3 key

73 F4 key

74 F5 key

75 F6 key

76 F7 key

77 F8 key

78 F9 key

79 F10 key

7A F11 key

7B F12 key

7C-7F F13 key - F16 key

80H-87H F17 key - F24 key

90 NUM LOCK key

91 SCROLL LOCK key

A0 Left SHIFT key

A1 Right SHIFT key

A2 Left CONTROL key

A3 Right CONTROL key

A4 Left MENU key

A5 Right MENU key

BA ;

BB =

BC ,

BD -

BE .

BF /

C0 `

DB [

DC \

DD ]

 

I jeszcze jedno: Jeśli wywołujemy tą funkcję w pętli, żeby program nie lagował za mocno procesora, dobrze jest otwórzyć plik user32.dll za pomocą DllOpen, i jako drugi parametr tej funkcji podać uchwyt do tego pliku. Po pętli należy zamknąć uchwyt poprzez DllClose.

 

No więc, na co czekasz? Gotowiec niżej, chyba że chcesz się czegoś nauczyć - wtedy leć programować :D

 

Przy okazji możemy jeszcze dopisać hotkeya do funkcji PrzesunKarte. Przyda nam się to.

I w sumie... skoro napiszemy funkcję kalibracji, to po kij nam przypisywanie koordów na dzień dobry? Możemy to bez wyrzutów sumienia wywalić, i wywołać gdzieś w programie funkcję kalibrującą, żeby przy starcie, na ten dzień dobry, można było sobie spokojnie wykalibrować bota :D

 

A oto twój upragniony gotowiec:

 

#include <Misc.au3>

HotKeySet ("{End}", "Wyjscie")
HotKeySet ("{F4}", "Kalibruj")
HotKeySet ("{F5}", "PrzesunKarte")

Global $KoordyKart[13][2]

Func Wyjscie()
Local $msgbox = MsgBox (32+4, "Wyjscie", "Na pewno chcesz wyjsć?")
If $msgbox = 6 Then Exit
EndFunc

Func PrzesunKarte()
$i = 1
MouseClick("left", $KoordyKart[0][0], $KoordyKart[0][1])
While $i < Ubound($KoordyKart)
If Not $i = 1 Then MouseUp("left")
MouseMove ($KoordyKart[$i][0], $KoordyKart[$i][1])
MouseDown("left")
$i += 1
WEnd
MouseUp("left")
EndFunc

Func Kalibruj()
$hDLL = DllOpen("user32.dll")
$i = 0
ToolTip("Kalibracja: Najedź kursorem na kartę i kliknij spację. Powtórz tak ze wszystkimi kartami."&@CRLF&"Kliknij Escape zeby przerwać kalibrację.")
While $i < UBound($KoordyKart)
If _IsPressed(12, $hDLL) Then
$KoordyKart[$i][0] = MouseGetPos(0)
$KoordyKart[$i][1] = MouseGetPos(1)
$i += 1
ToolTip ("Kliknąłes "&$i&" razy"&@CRLF&"Zostało "&UBound($KoordyKart) - $i&" do wskazania")
While _IsPressed(12, $hDLL)
Sleep(10)
WEnd
EndIf
WEnd
ToolTip ("")
DllClose($hDLL)
EndFunc

Kalibruj()

While 1
Sleep (100)
WEnd

 

 

No dobra cwaniaczku, a teraz przechodzimy poziom wyżej xD

 

Skoro mamy sprawdzać kolor, to musimy wiedzieć jakich narzędzi użyć. W naszym przypadku wystarczy funkcja PixelGetColor.

 

Składnia

PixelGetColor ( x , y [, uchwyt] )

 

Okej, bierz się za robotę.

Musimy dopisać do funkcji PrzesunKarte instrukcje, które sprawdzą nam jaki się aktualnie znajduje kolor na następnej karcie, a po przesunięciu konturu na to pole, porównać kolor przed i po. Jeśli kolory są takie same, program ma przejść do następnego pola, jeśli nie, upuszcza kartę, i rozpoczyna wszystko od nowa.

 

Podpowiem że do tego przyda nam się polecenie ExitLoop.

Musimy też zrobić, żeby program zapętlał się przy układaniu kart. Nie wiedząc dokładnie ile razy program będzie układał karty, lepiej zróbmy hotkeya awaryjnego który posłuży nam za wyjście z pętli układającej karty.

 

No to jedziem.

 

Tak, masz tu swojego gotowca, nie gorączkuj się tak...:

 

#include <Misc.au3>

HotKeySet ("{End}", "Wyjscie")
HotKeySet ("{F4}", "Kalibruj")
HotKeySet ("{F5}", "PrzesunKarte")
HotKeySet ("{F6}", "bot_pauza")

Global $KoordyKart[13][2], $botuj

Func bot_pauza()
$botuj = False
EndFunc

Func Wyjscie()
Local $msgbox = MsgBox (32+4, "Wyjscie", "Na pewno chcesz wyjsć?")
If $msgbox = 6 Then Exit
EndFunc

Func PrzesunKarte()
Local $i = 2, $kolorpiksela, $nowy_kolorpiksela
$botuj = True
While $botuj = True
MouseClick("left", $KoordyKart[0][0], $KoordyKart[0][1])
MouseMove($KoordyKart[1][0], $KoordyKart[1][1])
MouseDown("left")
While $i < UBound($KoordyKart)
$kolorpiksela = PixelGetColor($KoordyKart[$i][0], $KoordyKart[$i][1])
MouseMove ($KoordyKart[$i][0], $KoordyKart[$i][1])
$nowy_kolorpiksela = PixelGetColor($KoordyKart[$i][0], $KoordyKart[$i][1])
If $kolorpiksela <> $nowy_kolorpiksela Then
MouseUp("left")
$i = 2
ExitLoop
Else
$i += 1
EndIf
WEnd
$i = 2
MouseUp("left")
WEnd
MouseUp ("left")
EndFunc

Func Kalibruj()
$hDLL = DllOpen("user32.dll")
$i = 0
ToolTip("Kalibracja: Umiesć myszkę nad kartą i kliknij Alt."&@CRLF&"Myszkę musisz umiescić nad zakrytą talią, miejscem gdzie pojawia się wyciągnięta z niej karta, polami na 'asy', i nad polami z kartami (w tej kolejnosci)")
While $i < UBound($KoordyKart)
If _IsPressed(12, $hDLL) Then
$KoordyKart[$i][0] = MouseGetPos(0)
$KoordyKart[$i][1] = MouseGetPos(1)
$i += 1
ToolTip ("Kliknąłes na "&$i&" pól"&@CRLF&"Zostało "&UBound($KoordyKart) - $i&" pól do wskazania")
While _IsPressed(12, $hDLL)
Sleep(10)
WEnd
EndIf
WEnd
ToolTip ("")
DllClose($hDLL)
EndFunc

Kalibruj()

While 1
Sleep (100)
WEnd

 

 

Nie było tak trudno, nie xD?

Ja posłużyłem się techniką pętli działającej pod warunkiem zmiennej logicznej. Jeśli mogę to tak ująć. Dzięki temu mogłem swobodnie zatrzymywać bota i go wznawiać. Wystarczyło stworzyć zmienną logiczną, postawić pętli za warunek działać dopóki jej wartość wynosi True, i stworzyć funkcję przypisaną do hotkeya która ustawia jej wartość na False, co powoduje zatrzymanie działania pętli.

 

W naszej pętli logicznej nakazałem botowi kliknąć na zakrytą talię i następnie podnieść odkrytą kartę. Potem stworzyłem pętlę która lata po kartach i odwala 'czarną robotę'. W tej pętli zawarłem instrukcje pobrania koloru piksela z pola karty, na które chcemy przejść, poruszenia myszką na to pole, ponownego pobrania koloru piksela i porównania starego i nowego koloru. Jeśli są różne, bot kładzie kartę i wychodzi z pętli w pętli, rozpoczynając swój cykl działania od nowa. I to jest cały algorytm działania bota :)

 

Cóż, teraz możemy odpalić naszego bota, i sprawdzić czy działa. Po odpaleniu powinna się rozpocząć kalibracja, a po udanej kalibracji wystarczy kliknąć przycisk żeby bot zaczął nam układać karty. Pamiętajmy że musi być zaznaczona opcja "Przeciąganie konturu", żeby bot mógł poprawnie działać.

 

III: Epilog

 

Cóż, na tym zakończę mój pierwszy tutorial z serii AutoITowania. Nauczyliśmy się właśnie pisać dosyć prostego bota do pasjansa. Tutka pisałem przez 3 dni, i mam nadzieję że moja praca będzie doceniona (byłbym wielce szczęśliwy, jakby tutek został podpięty :D). I na koniec, kilka zadań dla przyszłych cheaterów.

 

Praca domowa: Udoskonal bota

1. Zrób żeby sprawdzał czy opcja przeciągania konturu jest zaznaczona, a jeśli nie, zaznacz ją. Do tego wystarczy ControlCommand oraz ControlClick. Po więcej informacji dotyczących tych funkcji, zapraszam do Helpa.

 

2. Zauważyłeś pewnie że bot, nawet po tym jak skończą się zakryte karty z talii. Napraw to. Kiedy skończy się talia, pole zmienia swój kolor na zielone kółko/czerwony krzyżyk. Zdobądź jakoś kody kolorów RGB (PixelGetColor), i każ botowi sprawdzać czy przypadkiem talia nie ma takiego koloru. W zależności od koloru, bot będzie musiał kliknąć 2 razy, albo przestać działać, i wyświetlić o tym informację.

 

I nieco trudniejsze: Dopisz, żeby bot układał wszystkie karty jakie są na planszy. Nie każę ci żeby bot był inteligentny, ale wystarczy że będzie to robił 'na czuja'

 

Tyle w tym Tutku. To, co uda wam się napisać, wrzucajcie w odpowiedzi (w spoilery. Nie chcę tutaj śmiecenia :D).

 

W następnym tutku: ImageSearch lub operacje na adresach. Piszcie co chcecie ^^.

846331404756772371599.jpeg
Opublikowano

ImageSearch lub operacje na adresach

 

Wybieram to 2.,jest bardziej profesjonalne ,wydajniejsze i trafniejsze i dzięki za tuta

Opublikowano

Tut fajny, chociaż to autoshit.

 

operacje na adresach ;)

 

bardzo dobry tut.

Post kokosza w Twoim temacie = +10 do zajebistości

Opublikowano

Dzięki za lajki :P

@up o stringach? Czyli co, opisać co i jak, oraz funkcje które są przydatne przy współpracy z nimi? Da się zrobić :D

 

A ja niedługo biorę się za NomadMemory

 

I ciekawostka: Tego bota robiłem przy tworzeniu tutka, na początku nawet nie wiedziałem do czego ma być ten bot :D. Bot był tworzony razem z tutkiem. I wygląda na to że takie tutki są najlepsze :P

 

//edit: I tak chyba nikt nie przeczytał tego tutka :] Wnoszę po tym, że nikt nie zauważył pewnej ciekawej rzeczy :D

846331404756772371599.jpeg
Opublikowano

A komu by się chciało tyle czytać :)

Wszyscy sprawdzają tylko czy jest gotowiec

Twoja stara robi catch the clowny w Game Makerze.

Opublikowano

ja również chciałbym zobaczyć o stringach. Jak ostatnio pisałem cos w au3 to to mi bardzo doskwierało (w sensie brak dostępu c-style [] ).

 

Jak pracowac ze stringami efektywnie ? Chetnie przeczytam.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

ja również chciałbym zobaczyć o stringach. Jak ostatnio pisałem cos w au3 to to mi bardzo doskwierało (w sensie brak dostępu c-style [] ).

 

Jak pracowac ze stringami efektywnie ? Chetnie przeczytam.

 

http://pl.wikibooks.org/wiki/AutoIt/Napisy_%28stringi%29

 

Do tego trochę wyobraźni i będzie efektywnie.

obraz24.png


Opublikowano

No weim ale czytalem to i nie zrozumialem zbyt wiele nic dlatego chcialem zeby ten ziom napisal cos o stringach w jakis bardziej przystepny dla poczonktujacych tut. nie musisz mnie od razy obrazac, kazdy kiedys zaczynal nawet ty. wiec relax

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

@up, powiedz mi - gdzie on cię obraził :D?

Dobra, najpierw napiszę tuta o obsłudze stringów, potem o adresach :P

Wezmę sie do roboty po południu, szkoła się zaczeła więc będę mieć mniej czasu.

 

//Lol, mój tutek niedługo zbierze więcej wyświetleń niż regulamin lokalny działu AutoIt :O

846331404756772371599.jpeg
Opublikowano

@up, powiedz mi - gdzie on cię obraził :D?

Dobra, najpierw napiszę tuta o obsłudze stringów, potem o adresach :P

Wezmę sie do roboty po południu, szkoła się zaczeła więc będę mieć mniej czasu.

 

//Lol, mój tutek niedługo zbierze więcej wyświetleń niż regulamin lokalny działu AutoIt :O

 

Tak obraził mnie. Po pierwsze zasugerował że jestem debilem, że nie umiem znaleźć czegokolwiek w google czy dokumentacji. Po drugie zasugerował że brakuje mi wyobraźni.

 

Tak się składa że jak chcesz coś szybko napisać, to nie mieści się w tym przeglądanie dokumentacji. Po prostu odpalam au3, próbuje coś zrobić, nie wiem jak sobie poradzić ze stringami - wyłączam i pierdole to. I to wcale nie oznacza że nie potrafie znaleźć sobie jakiegoś poradnika czy innego syfu.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Właściwie wystarczy przecież tylko znać funkcje StringMid/Left/Right, StringReplace, Pos, i tam StringRegExp jak kto lubi

Twoja stara robi catch the clowny w Game Makerze.

Opublikowano

Gdyby nie:

 

a) _IsPressed

Które jest ZŁE samo w sobie

 

B) odrobinę nieciekawa stylistyke

Duży blok tekstu bez ENTERków, kolorków, podziału na sekcję etc. ciężko się czyta

 

c) Podawanie niepotrzebnych, ścisłych definicji i skomplikowanej terminologi...

...odrzucających nawet mnie ( nie mówiąc o początkujących )

 

Tut byłby naprawdę dobry.

 

W dodatku dodałbym, zaraz tam gdzie - bardzo słusznie - w code podajesz składnie nowej funkcji kawałek kodu, w którym z niej korzystasz.

Dajesz zbiór gotowców do odpalenia, zamiast podawać schemat tworzenia "a teraz TEN kawałek kodu wstawiamy TUTAJ i otrzymujemy [.spoiler] TO [./spoiler]"

 

A, i takie U MAD BRO jest nieakceptowalne w Naprawdę Dobrym Tucie.

 

@EDIT

IsPressed nie jest "tragiczne", tylko ZŁE; różnica subtelna.

W każdym razie lepiej założyć hook'a.

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...