Archiwum
- LATANIE W KATARZE
- Pierwszy Polak w Barcelonie !!!
- Przyznaj to ,przyznaj tamto ... czyli ... ?
- Producenci już mają karty GeForce GTX 465. Dostawy pierwszych próbek ruszą lada dzień
- Wyciekły pierwsze wyniki testów karty GeForce GTX 460. Szykuje się niezła gratka?
- Microsoft zapowiada Xbox Fun Day 2010 - pierwsze wejściówki do wygrania już w poniedz
- Pierwsze zdjęcia (prawie) karty NVIDII, szybszej niż GeForce GTX 480
- Znamy datę wydania pierwszego DLC do gry Red Dead Redemption
- GeForce GTX 460 - pierwsza karta z układem GF104. Kolejna specyfikacja
- Driver: San Francisco - zobacz pierwszy gameplay i nowe rozwiązania w serii
- qBittorrent 2.2.10 dla Linux
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- conclusum.xlx.pl
Cytat
Długie szaty krępują ciało, a bogactwa duszę. Sokrates
I byłem królem. Lecz sen przepadł rankiem. William Szekspir (właść. William Shakespeare, 1564 - 1616)
Dalsza krewna: Czy śmierć to krewna? - życia pytasz się kochanie, tak krewna, ale dalsza, już na ostatnim planie. Sztaudynger Jan
Dla aktywnego człowieka świat jest tym, czym powinien być, to znaczy pełen przeciwności. Luc de Clapiers de Vauvenargues (1715 - 1747)
A ludzie rzekną, że nieba szaleją, a nieba rzekną: że przyszedł dzień Wiary. Cyprian Kamil Norwid (1821-1883)
aaaaLATANIE W KATARZEaaaa
Witajcie!Dzisiaj miało być trochę o praktycznym pisaniu botów. Przejdźmy więc od razu do rzeczy. Napiszmy sobie Prostego fishingbota do metina(dlatego, że ta gra jest jedną z popularniejszych i będziecie się mogli pochwalić znajomym :). Pierwsze co robimy, przy pisaniu jakiegokolwiek bota, to uruchamiamy grę i sprawdzamy co nasz bot powinien robić. Jeśli ktoś z was powie, że powinien łowić ryby, oznacza to, że niewiele zrozumieliście z poprzednich lekcji. Kiedy już będziecie bardziej zaawansowani w programowaniu, zrozumiecie, że łowienie ryb jest tylko zmianą konkretnych liczb. Pod koniec tej części pokażę wam jak to działa w praktyce. Na razie zajmijmy się tym co widzimy na monitorze i tym co sami robimy. Musimy się ustawić koło wody(Ekhem jak to zrobić?!). Na szczęście jest to przygotowanie wstępne i możemy poprosić o to użytkownika naszego bota. Drugim zadaniem jest założenie przynęty. Jak to zrobić? W innych botach prosili o ustawienie przynęty na F3, więc i my tak zrobimy i nakażemy botowi wcisnąć F3:
Send("{F3}")
Następnie zarzucamy wędkę, a tą umiejętność śmiało możemy ustawić na F4:
send("{F4}")
Zastanówmy się teraz. Jeśli wiemy na jakiej zasadzie działają fishingboty(a pewnie wiemy:)), to udajmy, że nie wiemy. Zobaczmy co się dzieję. Pojawia się chmurka z majtającą się rybom i znika. Stąd wiemy, że powinniśmy wyciągnąć naszą przynętę. Co moglibyśmy tutaj wykorzystać? Zawsze możemy wykorzystać pamięć(o tym potem), ale niestety - nie umiemy :(. Może udałoby się wykorzystać jakoś tą chmurkę. Może udałoby się ją jakoś powiększyć? Kręcimy kamerą na prawo i lewo i w końcu znajdujemy żądaną pozycje. Na dodatek jest ona łatwa do odnalezienia, nie będziemy musieli się nad tym głowić(Wystarczy ustawić kamerę od góry). Hmmm... Teraz musimy jakoś wykryć naszą chmurkę.
No więc pomyślmy. Czy jest funkcja, która sprawdza jaki kolor ma dany fragment(pixel) ekranu? A może sprawdzi od razu większy kawałek. Przemierzając niezmierzoną otchłań pomocy AutoIT natrafiamy w końcu na porządaną funkcję:
PixelGetColor ( x , y [, hwnd] ) Funkcja pobiera kolor jednego pixela. Jak na początek, to bardzo dobrze, ale nie świetnie. Chcemy pobrać kolor conajmniej czterech pixeli. Dlatego utwórzmy sobie stosowną pętlę:
Dim color[4]
for $i=1 to 4 step +1
$color[1]=PixelGetColor(eeee...
Pewnie niejeden z was tak się zatrzymał w tym momencie. Skąd wziąśc potrzebne argumenty do funkcji PixelGetColor()? Poznamy teraz niezwykle przydatne narzędzie jakim jest Au3Info. Uruchommy sobie tą aplikacje. Oto ustawienia jakich ja używam:
[Only registered and activated users can see links. Click Here To Register...]
Jak widzicie z menu, program ten pozwala odczytać współrzędne i kolor pixela na który wskazuje nasza mysz. Przyznajcie, że z takim narzędziem pisanie botów staje się dla was o wiele łatwiejsze. Oto pętla z przykładowymi zestawami argumentó:
$ilosc=4
Dim color[$ilosc]
for $i=0 to ($ilosc2)-1 step +1
$color[$i*2]=PixelGetColor(150+$i, 150)
$color[$i*2+1]=PixelGetColor(150, 150+$i)
Next
Ten fragment kodu może być trudny do zrozumienia, dlatego tłumaczę: Po pierwsze zmienna ilość. Zastosowałem ją, żebyście mogli sprawdzać dowolny kwadrat pixeli. W zasadzie ilosc musi być podzielny przez 2 i można się przed tym zabezpieczyć, ale to zadanie pozostawiam wam :). Składni $color[$i*2]; $color[$i*2+1] używam, żeby wartości się nie powtarzały. Jeśli sobie to rozpiszecie, to zobaczycie, że jednemu elementowi tablicy nigdy nie zosaną przypisane takie same wartości, a jednocześnie każdemu elementowi zostanie przypisana wartośc. Ale nic z naszym kolorem nie robimy, a powinniśmy go sprawdzić:
for $i=0 to 4 step +1
if Not($color[$i]<=0xFFFFFF and $color[$i]>=0xDDDDDD) then
ContinueLoop(2)
EndIf
Next
0x przed wartościom oznacza, że będzie ona podana w systemie szesnastkowym. To powinno być wam znane z innych źródeł, jeśli nie, to krótko mówiąc - jest to taki system liczenia, gdzie po 9, zamiast 10 występuje A tak więc analogicznie: A-10, B-11, C-12, D-13, E-14, F-15. A 16, to oczywiście 0. FF, oznacza w tym systemie 255. Większość kolorów jest podawanych w formacie RGB, to jest: Ilość czerwonego, Ilość zielonego, Ilość niebieskiego. 0xFF0000 - oznacza kolor maksymalnie czerwony, 0x00FF00 - oznacza kolor maksymalnie zielony, 0x0000FF - oznacza kolor maksymalnie niebieski. Mam nadzieję, że jest to zrozumiane. 0x000000 - to kolor czarny. W Au3Info macie podany kolor danego pixela i to z niego powinniście skorzystać :).
Przechodząc dalej, continueloop(2), oznacza rozpoczęcie pętli od początku. Dlaczego dwa w nawiasie? Bo nie chodzi nam, o akualną pętlę, tylko pętlę matkę. Zaraz się wam to rozjaśni(bo na razie pętli matki nie zrobiliśmy.
Niby wszystko w porządku, ale nasz bot nie wyciąga ryb. Ba! On się od razu wyłącza(jeśli się wogóle skompilował). Dlaczego? Ano spójrzmy na to co do tej pory napisaliśmy:
$ilosc=4
Dim color[$ilosc]
Send("{F3}")
Send("{F4}")
for $i=0 to ($ilosc2)-1 step +1
$color[$i*2]=PixelGetColor(150+$i, 150)
$color[$i*2+1]=PixelGetColor(150, 150+$i)
Next
for $i=0 to 4 step +1
if Not($color[$i]<=0xFFFFFF and $color[$i]>=0xDDDDDD) then
ContinueLoop(2)
EndIf
Next
Pamiętamy co robi program, gdy skończą mu się instrukcje? Nasz właśnie to zrobił. Potrzebujemy pętli głównej do naszego bota:
while 1
$ilosc=4
Dim color[$ilosc]
Send("{F3}")
Send("{F4}")
for $i=0 to ($ilosc2)-1 step +1
$color[$i*2]=PixelGetColor(150+$i, 150)
$color[$i*2+1]=PixelGetColor(150, 150+$i)
Next
for $i=0 to 4 step +1
if Not($color[$i]<=0xFFFFFF and $color[$i]>=0xDDDDDD) then
ContinueLoop(2)
EndIf
Next
WEnd
Ajć! Znowu problem. Co tym razem? Program non-stop wciska na zmiane F3 i F4. Dlaczego? Co u diabła zrobiliśmy źle. Po dwóch minutach wpatrywania się w skrypt klepiemy się w czoło z politowaniem. O to o czym zapomnieliśmy:
while 1
$ilosc=4
Dim color[$ilosc]
Send("{F3}")
Send("{F4}")
while 1
for $i=0 to ($ilosc2)-1 step +1
$color[$i*2]=PixelGetColor(150+$i, 150)
$color[$i*2+1]=PixelGetColor(150, 150+$i)
Next
for $i=0 to 4 step +1
if Not($color[$i]<=0xFFFFFF and $color[$i]>=0xDDDDDD) then
ContinueLoop(2)
EndIf
Next
WEnd
WEnd
Teraz powinno działać, ale dla pewności spójrzmy w kod, zanim go uruchomimy. Szybko zauważamy kolejny błąd i eliminujemy go:
while 1
$ilosc=4
Dim color[$ilosc]
Send("{F3}")
Send("{F4}")
while 1
for $i=0 to ($ilosc2)-1 step +1
$color[$i*2]=PixelGetColor(150+$i, 150)
$color[$i*2+1]=PixelGetColor(150, 150+$i)
Next
for $i=0 to 4 step +1
if Not($color[$i]<=0xFFFFFF and $color[$i]>=0xDDDDDD) then
ContinueLoop(2)
else
ExitLoop(2)
endif
Next
WEnd
WEnd
Uff! Ale z nas zaawansowane programistyczne bestie! Uruchommy nasz kod i zobaczmy jak się spisze w grze. NIEEEE!!! Zapamiętajcie sobie. Biurka i monitory początkujących programistów zawsze mają przerąbane. Nasz skrypt działa - owszem, ale jak działa?! Nie da się nawet zalogować. Skrypt działa od razu po uruchomieniu programu. Oczywiście, co bardziej cwany doda na początku kodu linijke: "Sleep(10000)", ale co to za szpan? Na razie przekształćmy to sobie na funkcję. Pamiętacie jak? Jeśli nie, to macie:
Func Lowic_czas()
while 1
$ilosc=4
Dim color[$ilosc]
Send("{F3}")
Send("{F4}")
while 1
for $i=0 to ($ilosc2)-1 step +1
$color[$i*2]=PixelGetColor(150+$i, 150)
$color[$i*2+1]=PixelGetColor(150, 150+$i)
Next
for $i=0 to 4 step +1
if Not($color[$i]<=0xFFFFFF and $color[$i]>=0xDDDDDD) then
ContinueLoop(2)
else
ExitLoop(2)
endif
Next
WEnd
WEnd
EndFunc
Na razie tyle będzie z naszego kodu. Na następnej lekcji poznamy hotkeye i trochę sobie o nich porozmawiamy. Jak będę miał dobry humor, to też wstawię SS :).
I jeszcze tak dla treningu:
Funkcja:
PixelSearch ( left, top, right, bottom, color [, shade-variation [, step [, hwnd]]] ) sprawdza, czy w podanym zakresie istnieją pixele o podanym kolorze(biorąc pod uwagę zakres błędu - shade-variation), jeśli tak, to zwraca dwuelementową tablice danych, gdzie element 0 oznacza oś X, a element 1 oznacza oś Y. Jeżeli nie znaleziono koloro, makro @Error, zostaje zmienione na 1 (@Error=1).
Na podstawie tych informacji spróbujcie przerobić trochę funkcję łowiącą ryby. Będzie ona wtedy bardziej wydajna :).
Mam nadzieję, że udało mi się odtworzyć tok myślenia początkującego programisty i że dzięki tej części łatwiej wam będzie rozwiązywać problemy w waszych programach!
No cóż?! Miłego programowania(ponad standardzikiem)
Byłbym niezmiernie wdzięczny, gdyby ktoś zechciał wrzucić Screeny, bo informatycy, to z natury leniwe bestie :].
Zezwalam na kopiowanie poradnika tylko z dołączonym linkiem i BANNEREM swiata gier! (tego serwisu) i oczywiście tylko i wyłącznie z tym dopiskiem.
Pozdrawiam:
WaY
Mały problem, nic tu nie widze :P
możesz bardziej to opisać? dac screeny? Czego nie widzisz??