Procedura - mur
Na koniec stworzymy procedurę, która narysuje na ekranie mur z cegieł, taki jak na przedstawionym rysunku.
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:
- mur, który składa się z warstw
- warstwa, która składa się z dwóch rzędów dolnego i górnego
- rząd dolny składający się z całych cegieł
- rząd górny składający się z połówek cegieł na zewnątrz i całych cegieł w środku
- cegłę
- pół cegły
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:
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.