Vlastní funkce  18. listopadu 2021

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

Trocha zamyšlení na rozehřátí.

0.

Co se stane, když tělo nějaké funkce necháš prázdné?

1.

Co se stane, když necháš prázdné tělo cyklu?

Procvičení funkcí.

2.

Napiš funkci (proceduru) vykresli_domecek, která vykreslí domeček dané velikosti. Velikost se zadá jako argument. Proceduru v programu několikrát zavolej s různými velikostmi:

vykresli_domecek(30)
vykresli_domecek(40)
vykresli_domecek(80)

domečky

3.

Napiš funkci, která vykreslí vesnici se zadaným počtem domů, kde každý dům bude mít zadanou velikost. Jednotlivé domy budou umístěny vedle sebe.

Při tvorbě této procedury využij funkci vykresli_domecek z předchozí úlohy!

vykresli_vesnici(5, 30) # 5 domečků, každý má velikost 30
vykresli_vesnici(3, 50) # 3 domečky, každý má velikost 50
4.

Vyber si nějakou úlohu z minulé lekce (např. vytvoření zkratky pro světovou stranu nebo převod na snake_case), a udělej z ní funkci. Tato funkce obdrží řetězec pomocí argumentu, a poté vrátí vypočtený výsledek.

Funkci v programu několikrát zavolej (s různými argumenty) a vypiš výsledky těchto volání.

5.

Připomeň si záměnu znaku v řetězci z lekce o řetězcích a vytvoř funkci zamen, která dostane jako argument vstupní řetězec, pozici a nový znak, který má nahradit původní znak na zadané pozici.

vysledek = zamen("ahoj", 2, "x")
# v proměnné vysledek by nyní mělo být "ahxj"
6.

Vylepši předchozí funkci tak, že funkce místo pozice dostane znak, který má být nahrazen. Všechny výskyty tohoto znaku v původním řetězci budou v navráceném řetězci nahrazeny novým znakem.

zamen("ahoj", "o", "x") # "ahxj"
zamen("cokolada", "o", "u") # "cukulada"

Procvičení programování. Často je jednoduché něco napsat, ale dotažení do konce může být časově náročné. Nemáš-li čas, zkus se aspoň zamyslet, jak bys projekt vyřešil(a).

7.

Funguje-li ti hra sibenice z předchozí lekce, můžeš ji vylepšit.

  • Pokud hráč nezadá přesně jeden znak (tj. nezadá nic nebo zadá více znaků), vynadej mu, ale nepočítej to jako pokus.
  • Použij funkci zamen pro nahrazení podtržítka (místo toho, aby byl příslušný kód přímo v hlavním programu).
  • Po vypsání počtu neúspěšných pokusů vypiš obrázek. Funkci, která vrátí obrázek podle počtu pokusů, si můžeš zkopírovat odsud
  • Když hráč nezadá písmeno (zadá např. !), nepovažuj to za tah.
  • Zařiď, aby hra fungovala pro slova s více stejnými písmeny (např. čokoláda).
  • Po skončení dej hráči možnost hru opakovat.

Jednotlivá vylepšení dělej jednotlivě a v odpovědi napiš, která jsou hotová a která rozpracovaná. Jakmile nějaké vylepšení začne fungovat, program odevzdej! Je možné odevzdat několik verzí.

Nakonec trošku delší projekt. Budeme na něm stavět dál; nedokončíš-li ho teď, budeš ho muset dodělat později.

1-D piškvorky se hrají na řádku s dvaceti políčky. Hráči střídavě přidávají kolečka (`o`) a křížky (`x`), třeba:
1. kolo: -------x------------
2. kolo: -------x--o---------
3. kolo: -------xx-o---------
4. kolo: -------xxoo---------
5. kolo: ------xxxoo---------
Hráč, která dá tři své symboly vedle sebe, vyhrál.
8.

Napiš funkci vyhodnot, která dostane řetězec s herním polem 1-D piškvorek a vrátí jednoznakový řetězec podle stavu hry:

  • "x" – Vyhrál hráč s křížky (pole obsahuje "xxx")
  • "o" – Vyhrál hráč s kolečky (pole obsahuje "ooo")
  • "!" – Remíza (pole neobsahuje "-", a nikdo nevyhrál)
  • "-" – Ani jedna ze situací výše (t.j. hra ještě neskončila)
9.

Napiš funkci tah, která dostane řetězec s herním polem, číslo políčka (0-19), a symbol (x nebo o) a vrátí herní pole (t.j. řetězec) s daným symbolem umístěným na danou pozici.

Hlavička funkce by tedy měla vypadat nějak takhle:

def tah(pole, cislo_policka, symbol):
    "Vrátí herní pole s daným symbolem umístěným na danou pozici"
    ...

Můžeš využít nějakou funkci, kterou jsme napsaly už na sraze?

10.

Napiš funkci tah_hrace, která dostane řetězec s herním polem, zeptá se hráče, na kterou pozici chce hrát, a vrátí herní pole se zaznamenaným tahem hráče. Funkce by měla odmítnout záporná nebo příliš velká čísla a tahy na obsazená políčka. Pokud uživatel zadá špatný vstup, funkce mu vynadá a zeptá se znova.

11.

Napiš funkci tah_pocitace, která dostane řetězec s herním polem, vybere pozici, na kterou hrát, a vrátí herní pole se zaznamenaným tahem počítače.

Použij jednoduchou náhodnou „strategii”:

  1. Vyber číslo od 0 do 19.
  2. Pokud je dané políčko volné, hrej na něj.
  3. Pokud ne, opakuj od bodu 1.

Hlavička funkce by tedy měla vypadat nějak takhle:

def tah_pocitace(pole):
    "Vrátí herní pole se zaznamenaným tahem počítače"
    ...
12.

Napiš funkci piskvorky1d, která vytvoří řetězec s herním polem a střídavě volá funkce tah_hrace a tah_pocitace, dokud někdo nevyhraje nebo nedojde k remíze.

Nezapomeň kontrolovat stav hry po každém tahu.

13.

Zvládneš pro počítač naprogramovat lepší strategii? Třeba aby se snažil hrát vedle svých existujících symbolů nebo aby bránil protihráčovi?

Stačí jen docela malé vylepšení!

Poslední projekt je bonusový, slouží k procvičení rekurze.

14.

Řekněte želvě, aby nakreslila tento stromeček. (Instrukce můžeš řádek po řádku přeložit do Pythonu.)

Rekurzivní želví stromek

  • Stromeček dané délky a úhlu se kreslí takto:

    • (Malý stromeček je jen jedna větvička.) Je-li délka menší než 20:
      • Pohni se dopředu o danou délku.
      • Otoč se zpátky, o 180°
      • Pohni se dopředu o délku (aby želva byla na stejném místě jako na začátku)
      • Otoč se zpátky, o 180° (aby se želva dívala stejným směrem jako na začátku)
    • Jinak (je stromeček rozvětvený):
      • Pohni se dopředu o polovinu délky (nakreslíš tak kmen)
      • Otoč se doprava o úhel
      • Nakresli stromeček s poloviční délkou (delka/2) a dvoutřetinovým úhlem (uhel*2/3)
      • Otoč se doleva o úhel
      • Nakresli stromeček s poloviční délkou a dvoutřetinovým úhlem
      • Otoč se doleva o úhel
      • Nakresli stromeček s poloviční délkou a dvoutřetinovým úhlem
      • Otoč se doprava o úhel
      • Otoč se zpátky, o 180°
      • Pohni se dopředu o polovinu délky (aby želva byla na stejném místě jako na začátku)
      • Otoč se zpátky, o 180° (aby se želva dívala stejným směrem jako na začátku)
  • Otoč želvu o 90° doleva (aby se dívala nahoru)

  • Nakresli stromeček o délce 200 a úhlu 60.