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 budeš skládat postupně z malých částí. Napřed tedy musíš malé části vytvořit.
Úkoly dělej postupně.
Odevzdávej prosím celé programy se všemy potřebnými importy a pomocnými funkcemi.
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)Například:
vyhodnot('--------------------')
vrátí '-'
vyhodnot('--o--xxx---o--o-----')
vrátí 'x'
vyhodnot('xoxoxoxoxoxoxoxoxoxo')
vrátí '!'
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, 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ůžeš využít nějakou funkci, kterou jsme napsaly už na sraze?
Přepiš 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')
Původní řešení předchozího úkolu můžeš nechat tak, jak je.
Napiš 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.
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(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
o-x-----------------
Napiš 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š funkci piskvorky1d
, která:
tah_hrace
, a výsledek uloží jako nové poletah_pocitace
, a výsledek uloží jako nové poleZatím neřeš konec hry.
Teď pošéfuj 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áva.
Stav hry kontroluj po každém tahu.
Nezapomeň, že máš k dispozici funkci vyhodnot
!