Skip to content

Instantly share code, notes, and snippets.

@osramek
Last active November 15, 2021 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save osramek/9d1a1cf22e91d00f013d82422b885bb8 to your computer and use it in GitHub Desktop.
Save osramek/9d1a1cf22e91d00f013d82422b885bb8 to your computer and use it in GitHub Desktop.

Zadání

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:

  1. 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.

  2. Příkaz FORWARD [celé kladné číslo X] kreslí čáru délky X px z aktuální pozice "pera" v aktuálním směru.

  3. Příkaz TURN [celé tj. i záporné číslo Z] pouze mění aktuální směr o Z, 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.

smery

  1. 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.

Rozšíření 1

Programovací jazyk bude znát 2 nové příkazy:

  1. SIZE [celé kladné číslo X] [celé kladné číslo Y]: určuje velikost výstupního obrázku.

  2. 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 na Z.

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.

Rozšíření 2

Jde o pokus aby náš program uměl krestli rekurzivní obrázky. Pravidla:

  1. 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 čáry X 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říkaz FORWARD má své vlastní "počítadlo" - to, že se v aktuálním FORWARD čára zkrátila o 10, nijak neovlivňuje ostatní forwardy.

  2. 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

Rozšíření 3

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.

vzor1 vzor2 vzor3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment