Skocz do zawartości

Skript - pętle


Rekomendowane odpowiedzi

Poradnik przedstawiający pętle w Skript. :)

Skript - pętle
Poznajemy pętle, ich rodzaje i przykładowe zastosowania.

I. Wstęp
Czym są pętle? Jak je dzielimy?

Pętle są wyrażeniami, dzięki którym możemy zapętlić w dany sposób/daną ilość razy jakiś kod.
Pętle dzielimy na dwie grupy:
- pętle skończone (wykonujące określoną ilość razy dany kod)
- pętle nieskończone (wykonujące dany kod przez cały czas działania skryptu)
wyjątkiem jest pętla while, która może być skończona lub nieskończona.

II. Pętle skończone
Czym się charakteryzują? Do czego można ich użyć?

Pętle skończone można podzielić na dwie grupy:
- pętle ze zdefiniowaną ilością zapętleń:

loop 13 times:
    # kod

loop {zmienna} times:
    # kod

loop 4*5+2^30 times:
    # kod

W pętlach tych możemy się odwoływać do zmiennej loop-number, która przechowuje numer zapętlenia.

- pętle zapętlające daną grupę obiektów

loop {lista::*}:
    # kod
loop all players:
    # kod
loop all sheeps in player's world:
    # kod
loop players in radius 4 of player:
    # kod
loop inventory of clicked block:
    # kod
loop inventory of arg:
    # kod
loop worlds:
    # kod
loop all dropped items:
    # kod

Każda z tych pętli może zawierać inne zmienne:
po zapętleniu listy zmiennych: loop-index - nazwa zmiennej, loop-value - wartość zmiennej,
po zapętleniu graczy: loop-player - gracz,
po zapętleniu owiec: loop-sheep (lub loop-entity) - owca,
po zapętleniu ekwipunku: loop-item - przedmiot,
po zapętleniu światów: loop-world - świat.

Pętle te wykonają dany kod dla każdego obiektu z zapętlonej grupy.

Pętle w pętli
Jeśli tworzymy kilka pętli w sobie nawzajem i posiadają one zmienne o takich typach, aby się do nich odwołać musimy zdefiniować numer pętli w formacie: nazwa_zmiennej-numer_pętli np. loop-number-2.

loop 30 times:
    loop 4 times:
        loop-number-1 is 3:
            send "3 zapętlenie pierwszej pętli, wyświetli się 4 razy"
        loop-number-2 is 4:
            send "4 zapętlenie drugiej pętli, wyświetli się 30 razy"
        loop-number-1 is 30:
            send "ostatnie zapetlenie pierwszej pętli, wyświetli się 4 razy"

III. Pętle nieskończone
Czym się charakteryzują? Do czego można ich użyć?

Pętle nieskończone, jak sama nazwa wskazuje, wykonują dany kod nieograniczoną ilość razy.
Jako jedyne stanowią samodzielne jednostki (nie muszą być zawarte w komendach, zdarzeniach).

every <czas>:
    # kod
every 1 tick:
    # kod
every 5 hours:
    # kod

Dany kod będzie wykonywany w nieskończoność co zdefiniowany czas np. co 5 godzin.

IV. Pętla while
Czym się charakteryzuje? Do czego można jej użyć?

Ciekawą pętlą jest pętla while, gdyż może być zarówno skończona jaki i nieskończona.

while <warunek>:
    # kod

Słownie można opisać ją tak: dopóki warunek jest spełniony wykonuje dany kod.

while 1 is 1:
    # kod

Powyższa pętla będzie wykonywała dany kod w nieskończoność. W praktyce jednak nie ma sensu tworzyć nieskończonej pętli while gdyż będzie ona działała tak samo jak pętle every. Jedyną różnicą jest ta, że jeśli kod w pętli nie będzie zawierał polecenia wait to nieskończona pętla while "zlaguje" serwer gdyż będzie on bez najmniejszej przerwy wykonywał kod w pętli "nie mając czasu" na żadne inne działanie.

Tak więc tworzenie nieskończonych pętli while - niewskazane!

Przy używaniu tej pętli warto zastosować zabezpieczenie przed nieskończonością, mianowicie:

set {_limit} to <limit powtorzen>
while <warunek>:
    # kod
    remove 1 from {_limit}
    {_limit} is 0:
        exit loop

V. Przykłady
Przykładowe zastosowania różnych pętli.

- Pętla every 5 seconds oraz zapętlenie wszystkich graczy na serwerze:

every 5 seconds:
    loop all players:
        {vampire.%loop-player%} is true
        sunlight level at the loop-player is greater than 10
        ignite the loop-player for 5 seconds

Działanie: jeśli zmienna {vampire.%gracz%} ma wartość true i gracz przebywa w słońcu - będzie się palił.

- Zapętlenie wszystkich graczy:

command /ac [<text>]:
    trigger:
        loop all players:
            loop-player has permission "jestem.adminem":
                send arg to loop-player

Działanie: wysyła wiadomość do wszystkich graczy posiadających uprawnienie jestem.adminem.

- Pętla while:

on right click on sign:
    line 1 is "[sklep]"
    line 2 constains "S" and "K" and ":"
    set {_i} to 1
    while {_k} or {_s} is not set:
        line 2 of clicked block constains "S %{_i}%:":
            set {_s} to {_i}
        line 2 of clicked block constains ":%{_i}% K":
            set {_k} to {_i}
        add 1 to {_i}
        {_i} is 9999:
            exit loop
        send "Cena kupna: %{_k}%, Cena sprzedaży: %{_s}%"

Działanie: pętla while jest tu wykorzystana do pobrania kwoty kupna i sprzedaży z tabliczki o wzorze:
linia 1: [sklep]
linia 2: S <cena sprzedaży>:<cena kupna> K
Pętla będzie wykonywana tak długo, aż zmienne {_s} i {_k} będą zapisane lub gdy osiągnie 9999 powtórzeń.

Edytowane przez piratjsk
poprawienie formatowania
Odnośnik do komentarza
https://skript.pl/temat/7-skript-p%C4%99tle/
Udostępnij na innych stronach

  • 5 miesięcy temu...
  • 5 tygodni później...

Kurde, zarąbisty poradnik, powinni wszystkie od pirata podpiąć :)

Jest kilka błędów

# kod

loop 4*5+2^30 times <- nie ma :

# kod

powturze� (ort i polski znak)

daj powtorzen

i w ostatnim skrypcie masz 2x constains zamiast contains

Odnośnik do komentarza
https://skript.pl/temat/7-skript-p%C4%99tle/#findComment-19480
Udostępnij na innych stronach

  • 2 lata później...
  • 3 lata później...
Teraz, CoFFeIN04 napisał:

to skoro tylko siebie chcesz to po co chcesz zapętlać?

Powiedz, co dokładnie chcesz zrobić.

Chce zrobic tak ze jak skrypt sie loaduje to chce aby mi wysylalo wiadomosc (tylko mi, i nie chodzi o gracza ktory ma dana permisje)

Odnośnik do komentarza
https://skript.pl/temat/7-skript-p%C4%99tle/#findComment-294154
Udostępnij na innych stronach

14 minut temu, Rafesqu napisał:

Chce zrobic tak ze jak skrypt sie loaduje to chce aby mi wysylalo wiadomosc (tylko mi, i nie chodzi o gracza ktory ma dana permisje)

no to możesz zrobić:
 

on load:
	send "wiadomosc" to ("gracz" parsed as player)

 

Odnośnik do komentarza
https://skript.pl/temat/7-skript-p%C4%99tle/#findComment-294155
Udostępnij na innych stronach

no to używasz przy tym send oraz parsowania stringa na gracza,

poradnik na temat parsowania:

 

 

Edytowane przez CoFFeIN04
proszę o wybaczenie z powodu kserokopiarkowania....
Odnośnik do komentarza
https://skript.pl/temat/7-skript-p%C4%99tle/#findComment-294156
Udostępnij na innych stronach

  • 3 tygodnie później...
W dniu 1.02.2014 o 20:38, piratjsk napisał:

Każda z tych pętli może zawierać inne zmienne:
po zapętleniu listy zmiennych: loop-index - nazwa zmiennej, loop-value - wartość zmiennej,

chodzi tutaj o loop-index. Albo ja nie zrozumiałem albo jest to źle napisane. Nie jest to nazwa zmiennej tylko liczba która jest z rzędu 

Odnośnik do komentarza
https://skript.pl/temat/7-skript-p%C4%99tle/#findComment-297299
Udostępnij na innych stronach

  • 1 rok później...

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...