Procedura - mur

Na koniec stworzymy procedurę, która narysuje na ekranie mur z cegieł, taki jak na przedstawionym rysunku.

Twoja przegądarka nie wspiera elementu canvas!

Najpierw o wyglądzie muru, można zauważyć, że składa się 3 warstw. W skłąd jednej warstwy wchodzą dwa rzędy jeden dolny normalny i drugi górny przesunięty o połowę cegły. Najlepszym rozwiązaniem jest podzielenie problemu narysowania muru na mniejsze problemy.
Tak, więc w naszym przypadku mamy:

Na początku zajmijmy się zdefiniowaniem procedur, które będą odpowiedzialne za stworzenie cegły i połówki cegły.
Procedura cegła będzie przyjmowała dwa paramety i będzie rysowała prostokąt z wtykorzystaniem tych parametrów. Procedura ta będzię również przesuwać zółwia na prawy dolny róg cegły aby móc później koło rysować kolejne cegły.

OTO CEGŁA :wysokość :szerokość
POWTÓRZ 2 [NP :wysokość PW 90 NP :szerokość PW 90] - rysuje prostokąt
PW 90 NP :szerokość LW 90 - przesuwa żółwia w prawy dolny róg cegły
JUŻ

Następnie utworzymy procedurę odpowiedzialna za rysowanie połowy cegły. Wykożystamy tutaj poprzednio zdefiniowaną procedurę której zmienimy parametr szerokość tak aby jego wartość była o połowe mniejsza (dzieląc przez 2) od długości cegły.

OTO PÓŁCEGŁY :wysokość :szerokość
CEGŁA :wysokość :szerokość/2 - wywołanie procedury cegła z szerokościa mniejszą o połowę
JUŻ

Kolejnym etapem jest stworzenie procedury która będzie rysowała dolny rząd. Procedura przyjmuje trzy parametry które określają wysokość rzędu (parametr jest przekazywany do procedur odpowiedzialnych za rysowanie cegieł i oznacza wysokość cegły), ogólną szerokość rzędu oraz ilość cegieł z których składa się rząd. Ilość cegieł będzie wykorzystywana do podziału szerokości jaką podamy na cegły. Pojawia się tutaj także procedura PRZESUŃ_ŻÓŁWIA która zefiniujemy poniżej. Jej zadaniem jest przesunięcie żółwia w miejsce które umożliwi rysowanie kolejnego rzędu. Czyli w naszym przypadku będzie to lewy górny róg rzędu.

OTO DOLNYRZAD :wysokość :szerokość :ilecegieł
POWTÓRZ :ilecegieł [CEGŁA :wysokość :szerokość/:ilecegieł] - rysuje cegły w dolnym rzędzie warstwy
PRZESUŃ_ŻÓŁWIA :wysokość (-:szerokość)
JUŻ

Procedura GÓRNYRZAD bedzie rysowała pół cegły, następnie całe cegły w ilośći o 1 mniejszej niż podajemy i na końcu narysuje kolejne pół cegły.Pojawia się tutaj również procedura PRZESUŃ_ŻÓŁWIA.

OTO GÓRNYRZAD :wysokość :szerokość :ilecegieł
PÓŁCEGŁY :wysokość :szerokość
POWTÓRZ :ilecegieł-1 [CEGŁA :wysokość :szerokość/:ilecegieł] -rysuje całe cegły w ilosc o 1 mniejszj nić podana
PÓŁCEGŁY :wysokość :szerokość
PRZESUŃ_ŻÓŁWIA :wysokość -:szerokość - parametr szerokość jest wykorzystywany z ujemną wartością
JUŻ

Procedura PRZESUŃ_ŻÓŁWIA, pojawiają się tutaj instrukcje PODNIEŚ i OPUŚĆ, które służą do podnoszenia i opuszczania pisaka. Jak pisak jest podniesiony to ruch żółwia nie zostawia śladu.

OTO PRZESUŃ_ŻÓŁWIA :wysokość :szerokość
PODNIEŚ NP :wysokość PW 90 NP :szerokość LW 90 OPUŚĆ
JUŻ

Mamy jużwszystkie procedury niezbędne aby stworzyć procedurę odpowiedzialną za rysowanie warstwy. Procedura WARSTWA która będzie łączyć w sobie procedury odpowiedzialne za rysowanie górnego i dolnego rzędu. Wysokość w procedurach odpowiedzialnych za rysowanie rzędu jest zmniejszona o połowę aby można było podać wartość która będzie odpowiedzialna za ogólną wysokość warstwy.

OTO WARSTWA :wysokość :szerokość :ilecegieł
DOLNYRZAD :wysokość/2 :szerokość :ilecegieł
GÓRNYRZAD :wysokość/2 :szerokość :ilecegieł
JUŻ

I na koniec pozostaje nam zdefiniowanie całości pod nazwą mur. Wywołanie procedury MUR narysuje mur zgodnie z podanymi parametrami. Należy pamiętać, że wysokość i szerokość odnoszą się do ogólnej wysokości muru.

OTO MUR :wysokość :szerokość :ilewarstw :ilecegieł
POWTÓRZ :ilewarstw [WARSTWA :wysokość/:ilewarstw :szerokość :ilecegieł]
PRZESUŃ_ŻÓŁWIA -:wysokość :szerokość - parametr szerokość jest wykorzystywany z ujemną wartością
JUŻ

W rezultacie końcowym wywołując procedurę MUR 250 500 3 6 otrzymamy:

Twoja przegądarka nie wspiera elementu canvas! Pobierz Internet Explorer 9 lub nowszą wersję!

W naszym przypadku jak używamy kilku procedur i łaczymy je w całość, parametry z jednej procedury przechodzą do następnej. Parametry z procedury MUR są odpowiednio modyfikowane dzięki temu kolejne procedury otrzymują parametry które umożliwiają ich odpowiedznie działanie.