środa, 11 lutego 2009

Pętle

dziś coś na temat pętli czyli chyba jednych z najbardziej użytecznych instrukcji jakie są w programowaniu. Czym są pętle? Są to instrukcje, które pozwalają nam wykonać jakaś instrukcję lub blok instrukcji pewną ilość razy przy pisaniu nie wielkiej ilości kodu.
W easyUO mamy 3 rodzaje pętli z czego praktycznie każdą można zastosować do każdego rozwiązania. Jednak niektóre są lepsze dla danych zastosowań.

Pętla for
Podobno najczęściej używana pętla w programowaniu, ale raczej nie w easyUO, ja sam nie spotkałem się zbyt często z jej użyciem. Nadaje się świetnie do wykonania czegoś parę razy, gdy wiemy wcześniej ile razy chcemy to wykonać.
Składnia:
for %i %start %end
{
instrukcje
}

I już spieszę z wyjaśnieniem co się tutaj dzieje.
for jest słówkiem kluczowym, zmienna %i jest tak zwanym iteratorem, czyli zmienną, która zmienia swoją wartość podczas przebiegu pętli. Na początku %i przyjmuje wartość podaną w start i po każdym przebiegu pętli (czyli wykonaniu instrukcji) jej wartość zwiększana jest o 1 aż do osiągnięcia wartości podanej w miejscu %end.
Przykład:
Jako przykład pokażę Ci również jak można zmieniać kolor tekstu.
for %i 1 20
{
set #SYSMSGCOL %i
event sysmessage Kolor: %i
}
halt


Pętla while
Pętla ta jest o wiele częściej stosowana podczas pisania skryptów. Wykonywana jest dopóki warunek przy słówku while jest prawdziwy. Jednak w przeciwieństwie do pętli for nie mamy tutaj żadnego iteratora. Przykład będzie taki sam jak przy pętli for
Składnia:
while warunek
{
instrukcje
}

Przykład:
set %i 1
while %i <= 20 {
set #SYSMSGCOL %i
event sysmessage Kolor: %i
set %i %i + 1
}

i może drugi przykład, taki bardziej życiowy i bardziej przydatny:
while #hits = #maxhist
{
}
gosub leczenie



Pętla repeat ... until
I to właśnie najczęściej stosowanai spotykana pętla w skryptach easyUO. Przrywana jest, jeśli warunek przy słówku until jest PRAWDZIWY. Warto zaznaczyć w tym miejscu, że pętla ta wykona się przynajmniej raz, gdyż warunek sprawdzany jest dopiero po wykonaniu instrukcji zawartych w pętli
Składnia:
repeat
{
instrukcje
}
until warunek

Przykład:
set %i 1
repeat
{
set #SYSMSGCOL %i
event sysmessage Kolor: %i
set %i %i + 1
}
until %i > 20

I przykład bardziej z życia
set %time %scnt + 10
repeat
{
if #sysmsg = Przestalas_sie_leczyc.
break
}
until %time > #scnt || #hits = #maxhits

Słówko break i continue
Przy okazji omawiania pętli warto wspomnieć w słówkach break oraz continue.
Słówko break powoduje natychmiastowe wyjście z pętli.
Przykład:
for %i 1 10
{
event sysmessage %i
if %i = 3
break
}

jeżeli wszystko co omawialiśmy do tej pory rozumiesz, to pętla powinna wykonać się 5 razy. Czyli na ekranie powinniśmy zobaczyć
1
2
3

gdyż przy wykonaniu 3 pętli warunek w if jest spełniony i następuje natrafienie na instrukcję break, czyli wyjście z pętli

Co do słówka continue, powoduje ona przerwanie danej iteracji i skoczenie do następnej. Czyli pomijamy to co jest po continue i zaczynamy kolejny przebieg pętli

Przykład:
for %i 1 20
{
if %i % 3 <> 0
continue
event sysmessage %i
}
mam nadzieję, że wiesz już co otrzymamy jako wynik wykonania takiej instrukcji.
Są to oczywiście liczby
3 6 9 12 15 18

Prześledźmy dokładnie co się dzieje w bloku instrukcji pętli
jeżeli reszta z dzielenia %i przez 3 jest różna od 0 to przechodzimy do kolejnej iteracji (czyli przechodzimy na początek pętli zwiększając %i o jeden)
jeżeli %i % 3 jest równe 0 to zostanie wyświetlona liczba wartość %i

Podsumowanie
Jako podsumowanie chcę napisać drogi czytelniku żebyś dobrze się nauczył pętli oraz wiedział co dzieje się w ich wnętrzu. Powód. Nie znam człowieka piszącego skrypty czy programy, który nie napisał jeszcze nigdy nie kończącej się pętli. Nic trudnego, na prawdę. Pokażę przykład jak można się zastanawiać "DLACZEGO TO #$%@#$ NIE DZIAŁA":
set %i 1
while %i <> 5
{
if %i % 3 = 0
continue
set %i %i + 1
}
dlaczego ta pętla będzie wykonywała się w nieskończoność. No sam spójrz. Gdy %i osiągnie wartość 3 wtedy przejdziemy na początek pętli, ale w pętli while %i nie zwiększa się automatycznie, czyli dalej będzie miało wartość 3. I tak aż się nie zdenerwujemy i nie wyłączymy tego skryptu.

Zapewne zastanawiasz się jak mam sprawdzać co dzieje się w skrypcie. Postaram się napisać o tym w następnej lekcji czyli jak debugować (szukać błędów) skrypty.

Brak komentarzy:

Prześlij komentarz