Skip to main content

Začínáme programovat v jazyku Python (Ukázka, strana 99)

Page 1

98

Kapitola 7 Balíčky, knihovny, robot Karel a jeho svět

Na řádku 1 se importují všechny veřejné atributy modulu (a zde současně balíčku) robotcz. A protože jeho atributy importujeme přímo (předpokládáme, že se nebudou měnit), nebudeme je muset kvalifikovat. Příkaz na řádku 2 vytvoří prázdný svět o jednom řádku a pěti sloupcích (ověřte si to). Potvrzuje to ostatně i vytištěný podpis na řádku 3. Příkaz na řádcích 4–5 tento svět odstraní a vytvoří svět, na jehož políčkách jsou různé počty značek a v jeho pravém dolním rohu je zeď. Jak vidíte, v prvním řádku jsem počty značek na jednotlivých polích prvního řádku zadával prostřednictvím číslic, počty na polích druhého řádku prostřednictvím „tečkových znaků“. Sami si ve svých programech vyberte, jaký způsob vám bude sympatičtější. Podpis světa na řádku 6 prozrazuje, že ve světě ještě není žádný robot. Změní to až příkaz na řádku 7, který vytvoří nového robota a (jak si záhy vysvětlíme) umístí jej do levého spodního rohu. Výsledek odpovídá obrázku 7.1. Protože poslední příkaz není výrazový, hodnota pomocné proměnné _ se nezměnila a stále odkazuje na vytvořený svět. Příkaz na řádku 8 proto tiskne jeho podpis, z nějž se dozvíme, že svět ví, že se po něm pohybuje jeden robot.

Obrázek 7.1: Svět robotů vytvořený programem z výpisu 7.1 doplněný o robota příkazy z výpisu

Vytvoření robota Roboti jsou instancemi třídy Karel z balíčku robotcz. Vytvoříme je proto zavoláním příslušného konstruktoru, tj. zavoláním jejich třídy jako funkce. Signatura tohoto konstruktoru je: Karel(row:int =-1, col:int = 0, dir4:Direction4 = DEFAULT_DIR, color:Color = DEFAULT_COLOR)

Zavoláte-li konstruktor jako bezparametrický, vytvoří se modrý, na východ (doprava) otočený robot, který bude umístěn do levého dolního (jihozápadního) rohu aktuálního světa, jak je tomu na obrázku 7.1. Pozice Řádek, na nějž bude robot umístěn, se zadává v argumentu row. Řádky se počítají od horního řádku, který je chápán jako nultý a jeho index roste směrem dolů. Sloupec, na nějž bude robot umístěn, se zadává v argumentu col. Sloupce se počítají od levého krajního sloupce, který je opět chápán jako nultý, a sloupcový index roste směrem doprava. 70_Python_NZ2_ZLOM.doc; verze 1.02.8964_2022-02-17_čt_15-48

Strana 98 z 316 Ukázka elektronické knihy, UID: KOS507029


7.3 Robot Karel a jeho svět

99

Zadáním záporného řádku nebo sloupce zadáváte řádek, resp. sloupec od konce. Řádek s indexem -1 je tedy posledním řádkem a sloupec s indexem -2 je předposledním sloupcem. Směr natočení Parametr dir4 definuje směr natočení vytvářeného robota a očekává argument typu Direction4. Ten může nabývat hodnot EAST, NORTH, WEST a SOUTH (východ, sever, západ a jih). Pro ty, kteří mají se světovými stranami potíže (a zjistil jsem, že takových lidí je překvapivě hodně), dodám, že východ je vpravo, sever nahoře, západ vlevo a jih dole. Implicitní hodnota tohoto argumentu, tj. hodnota atributu DEFAULT_DIR je EAST. Nezadáme-li proto směr, bude vytvořený robot otočen na východ (doprava). Až budete pokročilejší, budete si moci implicitní hodnotu změnit. Barva Parametr color definuje základní barvu vytvářeného robota a očekává argument typu Color. Ten může nabývat hodnot BLACK, BLUE, RED, MAGENTA, GREEN, CYAN, YELLOW a WHITE (černá, modrá, červená, magenta (fialová), zelená, azurová (blankytná), žlutá a bílá). Implicitní hodnota tohoto argumentu, tj. hodnota atributu DEFAULT_COLOR, je BLUE. Nezadáme-li proto barvu, bude vytvořený robot vybarven modře.

Akce V balíčku/modulu robotcz jsou definovány následující „akční“ funkce: step(k:Karel)

Přesune zadaného robota na sousední pole ve směru, do nějž je natočen. Je-li na tomto poli zeď či jiný robot, ohlásí chybu.

turnLeft(k:Karel) Otočí zadaného robota o 90° vlevo. pick(k:Karel)

Zadaný robot zvedne značku na políčku, na němž stojí. Není-li tam žádná značka, ohlásí chybu.

put(k:Karel)

Zadaný robot položí značku na políčko, na němž stojí. Přesáhne-li pak celkový počet značek na daném políčku maximální povolený počet, ohlásí chybu.

Všechny uvedené funkce vracejí odkaz na svůj argument, takže se při jejich zadání v interaktivním režimu zobrazí po jejich provedení stav zadaného robota. Ukázku zavolání výše popsaných funkcí si můžete prohlédnout ve výpisu 7.2. Příkazy na řádcích 1, 3, 5 a 8 provádějí operace popisované v příslušných komentářích. Můžete je provádět řádek za řádkem a vždy se přesvědčit, že se stav dvorku odpovídajícím způsobem změnil. Pozici a nasměrování robota se dozvíte z jeho podpisů. Podobu robotího světa po jejich provedení najdete na obrázku 7.2.

Obrázek 7.2: Svět robota po provedení akcí z výpisu 7.2 70_Python_NZ2_ZLOM.doc; verze 1.02.8964_2022-02-17_čt_15-48

Strana 99 z 316 Ukázka elektronické knihy, UID: KOS507029


100

Kapitola 7 Balíčky, knihovny, robot Karel a jeho svět

Výpis 7.2: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Ovládání vytvořeného robota

>>> step(k) # Posune robota o krok vpřed Karel_1(row=1, col=1, dir4=EAST, color=BLUE) >>> turn_left(k) # Otočí robota vlevo Karel_1(row=1, col=1, dir4=NORTH, color=BLUE) >>> put(k); step(k) # Položí značku a popojde Karel_1(row=1, col=1, dir4=NORTH, color=BLUE) Karel_1(row=0, col=1, dir4=NORTH, color=BLUE) >>> pick(k); turn_left(k); step(k) # Zvedne značku, pootočí se vlevo a popojde Karel_1(row=0, col=1, dir4=NORTH, color=BLUE) Karel_1(row=0, col=1, dir4=WEST, color=BLUE) Karel_1(row=0, col=0, dir4=WEST, color=BLUE) >>> step(k) # Pokusí se posunout robota o krok vpřed do okrajové zdi Traceback (most recent call last): File "<stdin>", line 1, in <module> File "p:\70_INP\robotcz\__init__.py", line 131, in step active_world().step(self) File "p:\70_INP\robotcz\robotworld.py", line 398, in step self._move_to(row, col, wrobot) File "p:\70_INP\robotcz\robotworld.py", line 477, in _move_to if not self._is_field_free(row, col): File "p:\70_INP\robotcz\robotworld.py", line 467, in _is_field_free self._checkInside(row, col) File "p:\70_INP\robotcz\robotworld.py", line 452, in _checkInside raise RWError(msg) robotcz.robotworld.RWError: Pozice [0, -1] není uvnitř světa robotů >>>

Příkaz na řádku 12 vyvolá chybu, protože se snažíme popojít s robotem, před nímž je okrajová zeď. Po zadání příkazu se zobrazí dialogové okno z obrázku 7.3, v němž nám program oznamuje, že jsme se pokusili přesunout robota na pozici mimo jeho svět. Po stisku OK se vytiskne chybové hlášení z řádků 13–26, na jehož konci se dozvíme totéž.

Obrázek 7.3: Okno s chybovým hlášením po provedení akcí z výpisu 7.2 Možná vás napadne, že zobrazování dialogového okna s chybovou zprávou zdržuje, ale mějte na paměti situace, kdy se program spouští v okenním režimu bez zobrazování příkazového řádku. Pak byste nevěděli, proč program najednou „vytuhl“ nebo se začal chovat jinak divně. 70_Python_NZ2_ZLOM.doc; verze 1.02.8964_2022-02-17_čt_15-48 Ukázka elektronické knihy

Strana 100 z 316


Turn static files into dynamic content formats.

Create a flipbook
Začínáme programovat v jazyku Python (Ukázka, strana 99) by Kosmas-CZ - Issuu