Slovníky  25. dubna 2019

Materiály

Nejste účastníkem kurzu
Pro zápis do kurzu se nejprve přihlašte a následně použijte tlačítko v přehledu kurzu.

Domácí projekty

Těchto pár úkolů slouží k procvičení práce se slovníky, které se následně pokusíš využít při programování známé skautské hry.

0.

Napiš funkci, která pro argumentem zadané číslo n vytvoří a vrátí slovník, kde jako klíče budou čísla od jedné do n a jako hodnoty k nim jejich druhé mocniny. Například:

>>> mocniny(4)
{1: 1, 2: 4, 3: 9, 4: 16}
1.

Napiš funkci, která sečte a vrátí sumu všech klíčů a sumu všech hodnot ve slovníku, který dostane jako argument. K vyzkoušení můžeš použít slovník z minulé úlohy. Například:

>>> soucet_klicu_a_hodnot(mocniny(4))
(10, 30)
2.

Napiš funkci, která jako argument dostane řetězec a vrátí slovník, ve kterém budou jako klíče jednotlivé znaky ze zadaného řetězce a jako hodnoty počty výskytů těchto znaků v řetězci. Například:

>>> pocet_znaku("hello world")
{'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
3.

Napiš funkci, která vypíše obsah slovníku (klíče a k nim náležící hodnoty) na jednotlivé řádky.

Funkci, která něco vypisuje, je vhodné pojmenovat speciálně, zde třeba vypis_slovnik, aby bylo jasné, že jen vypisuje a nic nevrací. Například:

>>> vypis_slovnik(mocniny(4))
Klíč 1, hodnota 1
Klíč 2, hodnota 4
Klíč 3, hodnota 9
Klíč 4, hodnota 16

A teď už ke slíbené hře.

4.

Úkolem je vytvořit známou skautskou hru „Kdo? S kým? Co dělali?“. Hra se hráče zeptá postupně na různé otázky, například „Kdo?“, „S kým?“, „Co dělali?“, „Kde?“, „Kdy?“, a nakonec „Proč?“, s tím, že mu umožní na jednu otázku odpovědět vícekrát a všechny odpovědi si uloží. Na závěr pak hra z každé sady odpovědí vybere náhodně jednu odpověď a z takto vybraných odpovědí složí větu, kterou vypíše uživateli. Seznam otázek by mělo být možné změnit v kódu na jednom místě bez zásahu do logiky programu.

Projekty závisí jeden na druhém, řeš je postupně. Až to uděláš, můžeš si zahrát hru! Tahle sekce není jednoduchá (a poslední dva projekty jsou obzvláště náročné). Můžeš zkusit spojit síly s ostatními účastnicemi kurzu!}

5.

Napiš funkci, která dostane seznam souřadnic (párů čísel menších než 10, která určují sloupec a řádek) a vypíše je jako mapu: mřížku 10×10, kde na políčka která jsou v seznamu napíše X, jinde tečku. Například:

nakresli_mapu([(0, 0), (1, 0), (2, 2), (4, 3), (8, 9), (8, 9)])
X X . . . . . . . .
. . . . . . . . . .
. . X . . . . . . .
. . . . X . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . X .

Jak na to?

  • Udělej tabulku (seznam seznamů) se samými tečkami, něco jako:
    [['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']].
  • Na příslušných místech nahraď tečky X-ky.
  • Tabulku vypiš pomocí dvou cyklů for zanořených do sebe.
6.

Napiš funkci pohyb, která dostane seznam souřadnic a světovou stranu ("s", "j", "v" nebo "z") a přidá k seznamu poslední bod „posunutý“ v daném směru. Např.:

souradnice = [(0, 0)]
pohyb(souradnice, 'v')
print(souradnice)         # → [(0, 0), (1, 0)]
pohyb(souradnice, 'v')
print(souradnice)         # → [(0, 0), (1, 0), (2, 0)]
pohyb(souradnice, 'j')
print(souradnice)         # → [(0, 0), (1, 0), (2, 0), (2, 1)]
pohyb(souradnice, 's')
print(souradnice)         # → [(0, 0), (1, 0), (2, 0), (2, 1), (2, 0)]

Funkce by neměla nic vracet. Jen mění už existující seznam.

Nezapomeň na testy.

7.

Napiš cyklus, který se bude ptát uživatele na světovou stranu, podle ní zavolá pohyb, a následně vykreslí seznam jako mapu. Pak se opět se zeptá na stranu atd.

Začínej se seznamem [(0, 0), (1, 0), (2, 0)].

8.

Doplň funkci pohyb tak, aby při pohybu umazala první bod ze seznamu souřadnic. Výsledný seznam tak bude mít stejnou délku, jako před voláním.

Uprav testy.

9.

Doplň funkci pohyb tak, aby zamezila:

  • pohybu ven z mapy,
  • pohybu na políčko, které už v seznamu je.

Vhodná výjimka pro tyto situace je ValueError('Game over').

Doplň i testy.

10.

Přidej do hry hadí potravu. Tady jsou pravidla pro vegetariánského hada, ale můžeš si je změnit podle chuti:

Seznam ovoce obsahuje na začátku jedno ovoce na políčku, na kterém není had (například: [(2, 3)] znamená jedno ovoce na pozici (2, 3)). Když had sežere ovoce, vyroste („nesmaže“ se mu ocas, tedy neprovede se to, cos přidala v projektu 13), a pokud na mapě zrovna není další ovoce, na náhodném místě (kde není had) vyroste ovoce nové.

Každých 30 tahů vyroste nové ovoce samo od sebe.

Na mapě se toto tajemné ovoce zobrazuje jako otazník (?).

11.

Hadí hřiště může mít libovolné rozměry větší než 4×1. Třeba 20×20 nebo 10×30.