Vytváříme jednoduchý programovací jazyk, který slouží ke kreslení obrázků. Vstupem je zdrojový text/soubor a výstupem je obrázek. Náš výsledný program může být jak konzolová aplikace, tak aplikace s grafickým rozhraním.
Jedná se o variaci známé "želvičky". Kreslíme pixel po pixelu, černou barvou na bílé pozadí. Vstupní zdrojový text by mohl vypadat takto:
FORWARD 100
TURN 2
Náš jazyk bude interpretovaný, proto jej náš program bude vykonávat "řádek po řádku". Pravidla:
-
Výstupní obrázek má rozměry 1000px x 1000px, počáteční kreslící pozice je 100px od horního a 100px od levého okraje. Počáteční směr je 0.
-
Příkaz
FORWARD [celé kladné číslo X]
kreslí čáru délkyX
px z aktuální pozice "pera" v aktuálním směru. -
Příkaz
TURN [celé tj. i záporné číslo Z]
pouze mění aktuální směr oZ
, nic nekreslí. Směrů je 8 očíslovaných podle obrázku. Výpočet směru probíhá v "modulo 8", tzn. pokud směr vyjde 8, jedná se o směr 0, směr 1 je zároveň směr 9 atd. Podobně směr -1 je směr 7.
- Zdrojový text se vykonává opakovaně dokud nenastane některá z podmínek:
- Program se chystá kreslit na černý pixel.
- Program se chystá kreslit mimo "plátno"
Z pravidel vyplývá, že ukázkový zdroják výše by měl nakreslit čtverec 100 x 100 px v levém horním rohu obrázku.
Programovací jazyk bude znát 2 nové příkazy:
-
SIZE [celé kladné číslo X] [celé kladné číslo Y]
: určuje velikost výstupního obrázku. -
ORIGIN [celé kladné číslo X] [celé kladné číslo X] [celé číslo Z]
: nastavuje počáteční pozici pera na[X, Y]
a počáteční směr naZ
.
Oba příkazy se vykonají pouze jedenkrát, nepodléhají opakovanému procházení příkazů. Pokud bude některý z příkazů ve zdrojáku vícekrát je rozhodnutí na vás. Program může skončit chybou a nic nekreslit, nebo může např. brát v potaz pouze první výskyt a ostatní ignorovat.
Jde o pokus aby náš program uměl krestli rekurzivní obrázky. Pravidla:
-
Příkaz
FORWARD
akceptuje nový volitelný druhý parametr:FORWARD [X] [celé tj. i záporné číslo Z]
.Z
je číslo o které se upraví délka čáryX
při příštím průchodu programem. Tzn.FORWARD 100 -10
nakreslí napoprvé čáru 100px, příště 90, pak 80 atd. Důležité je, že každý jednotlivý příkazFORWARD
má své vlastní "počítadlo" - to, že se v aktuálnímFORWARD
čára zkrátila o 10, nijak neovlivňuje ostatní forwardy. -
Oproti základním podmínkám pro ukončení cyklu (bod 4 ze zadání) je přidána další podmínka:
- Program se chystá kreslit čáru délky 0 nebo méně.
Př. Program co nakreslí schody které se postupně zkracují:
FORWARD 100 -10
TURN 2
FORWARD 100 -10
TURN -2
Programovací jazyk bude znát nový příkaz TILE [celé kladné číslo RX] [celé kladné číslo RY]
, který podobně jako příkazy z Rozšíření 1, se nevykonává opakovaně, ale pouze jedenkrát. Příkaz říká, že vytvořený obrázek je pouze jedna z dlaždic, která se má v horizontálním směru opakovat RX
-krát a ve vertikálním směru RY
-krát. Příkaz SIZE
při použití TILE
tedy definuje rozměr jedné dlažice, opravdová velikost výstupního obrázku bude tedy SIZE X * TILE RX
na SIZE Y * TILE RY
pixelů. Jako bonus k tomuto rozšíření můžeme příkaz TILE
naučit skládat dlaždice různým způsobem. Na prvním obrázku je základní způsob, další dva obrázky jsou příklady jak jinak by šly dlaždice skládat. Typ skládání by byl zadán jako třetí volitelný parametr příkazu TILE
.