Upravte program z Lekce 2, který postupně načte od
uživatele dvě čísla a operaci ('+'
, '-'
, '*'
nebo '/'
)
a provede na číslech příslušnou operaci.
Program upravte tak, aby:
Nulou nelze dělit.
Použijte na to ošetření příslušné chyby (tj. ne if delitel == 0:
).
Příklad použití:
První číslo: třistatřiatřicet
Zadávej jen čísla
První číslo: 333
Druhé číslo: 0
Operace: /
Nulou nelze dělit.
Dnešním úkolem je naprogramovat hru 1D Piškvorky. Nakonec bude fungovat následovně:
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.
Hru budete skládat postupně z malých částí. Napřed tedy musíte vytvořit malé části; ty pak poskládáte dohromady.
Úkoly dělejte postupně.
Odevzdávejte prosím celé soubory se všemi potřebnými importy a pomocnými funkcemi.
Napište 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)Například:
vyhodnot('--------------------')
vrátí '-'
vyhodnot('--o--xxx---o--o-----')
vrátí 'x'
vyhodnot('xoxoxoxoxoxoxoxoxoxo')
vrátí '!'
Napište 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, pozice, symbol):
"""Vrátí herní pole s daným symbolem umístěným na danou pozici
`pole` je herní pole, na které se hraje.
`pozice` je číslo políčka. Čísluje se od nuly.
`symbol` může být 'x' nebo 'o', podle toho jestli je tah za křížky
nebo za kolečka.
"""
...
Například:
tah('--------------------', 0, 'x')
vrátí 'x-------------------'
tah('--------------------', 19, 'o')
vrátí '-------------------o'
tah('x-o-x-o-x-o-x-o-x-o-', 5, 'x')
vrátí 'x-o-xxo-x-o-x-o-x-o-'
Můžete využít nějakou funkci, kterou už máte napsanou?
Přepište funkci tah
, aby skončila s chybou ValueError
v těchto případech:
Hra na pozici, která není v poli, např.
tah('--------------------', -1, 'x')
Hra na obsazené políčko, např.
tah('x-------------------', 0, 'o')
Hra jiným symbolem než 'x'
nebo 'o'
, např.
tah('--------------------', 0, 'řeřicha')
Odevzdané řešení předchozího úkolu můžete nechat tak, jak je.
Napište funkci tah_hrace(pole, symbol)
, která dostane řetězec
s herním polem a symbol (x
nebo o
) a:
tah
zjistí, jak vypadá herní pole se zaznamenaným tahem
hráčePokud uživatel zadá špatný vstup (nečíslo, záporné číslo, obsazené políčko apod.), funkce mu vynadá a zeptá se znova. (Není potřeba použít pro každý případ jinou hlášku.)
Hlavička funkce by tedy měla vypadat nějak takhle:
def tah_hrace(pole, symbol):
"""Zeptá se hráče na tah a vrátí nové herní pole
`pole` je herní pole, na které se hraje.
`symbol` může být 'x' nebo 'o', podle toho jestli hráč hraje za křížky
nebo za kolečka.
"""
...
Například zavolání print("Nový stav hry je:", tah_hrace('o-------------------', 'x'))
by mohlo dopadnout takto:
Kam chceš hrát? nevím
Zadávej čísla!
Kam chceš hrát? 0
Tam nejde hrát!
Kam chceš hrát? -1
Tam nejde hrát!
Kam chceš hrát? 151
Tam nejde hrát!
Kam chceš hrát? 2
Nový stav hry je: o-x-----------------
Pozor: pravděpodobně budete potřebovat ošetřit různé chyby na různých místech.
Napište funkci tah_pocitace(pole, symbol)
, která dostane řetězec s herním
polem a symbol, vybere pozici, na kterou hrát, a vrátí herní pole
se zaznamenaným tahem počítače.
Použij jednoduchou náhodnou „strategii”:
Hlavička funkce by tedy měla vypadat nějak takhle:
def tah_pocitace(pole, symbol):
"""Vrátí herní pole se zaznamenaným tahem počítače
`pole` je herní pole, na které se hraje.
`symbol` může být 'x' nebo 'o', podle toho jestli hráč hraje za křížky
nebo za kolečka.
"""
...
Zavolání print(tah_pocitace('o-------------------', 'x'))
by
mohlo vypsat třeba o---------x---------
.
Napište funkci piskvorky1d
, která:
'--------------------'
tah_hrace
, a výsledek uloží jako nové poletah_pocitace
, a výsledek uloží jako nové poleZatím neřešte konec hry.
Teď pošéfujte konec hry. Když někdo vyhraje nebo dojde k remíze, cyklus se ukončí a vypíše se výsledek – třeba s gratulací nebo povzbuzující zprávou.
Stav hry kontrolujte po každém tahu.
Nezapomeňte, že máte k dispozici funkci vyhodnot
!
Program rozdělte do modulů a upravte importy tak, aby program stále fungoval. Moduly by neměly mít vedlejší efekty.
vyhodnot
, tah_hrace
a piskvorky1d
patří do modulu piskvorky
(tj. souboru piskvorky.py
).tah_pocitace
patří do modulu ai
(tj. souboru ai.py
).tah
zařaďte podle videa o cyklických importech.Protože samotná hra – vypisování a ptaní se na otázky – je vedlejší efekt,
tak teď nepůjde spustit. Aby to šlo, vytvořte ještě „spouštěcí“ modul hra
(tj. soubor hra.py
) s následujícím obsahem:
from piskvorky import piskvorky1d
piskvorky1d()
Odevzdávání a kontrola několika souborů je zatím složité, proto si tento úkol zkontrolujte sami:
python hra.py
v příkazové řádce spustí funkční hru.import piskvorky
v Pythonu nespustí hru (a nemá ani další
vedlejší efekty).Pokud si nejste jisti, nebo program nefunguje, neváhejte napsat na Slack a nezapoměňte přiložit kód jako zip archiv se všemi soubory.