Seminární skupiny 03, 04, 05 a 06 - cvičící J. Plhák

Týden 8

Domácí úkol 4 - Padající piškvorky - toto zadání platí pouze pro seminární skupiny 03, 04, 05 a 06 (cvičící Jaromír Plhák)

Popis: Vytvořte program hrající hru "Padající piškvorky" proti uživateli (na plánu zadané velikosti). Tato variace piškvorek se hraje na dvourozměrném hracím plánu. Hra je podobná klasickým piškvorkám s tím rozdílem, že pokud jste na tahu, nevolíte konkrétní čtvereček, do kterého byste umístili svůj symbol, ale sloupec. Symbol v daném sloupci spadne dolů (nejvíce, co to jde). Vyhrává ten, kdo poskládá 4 své symboly v řadě, sloupci nebo diagonále.

Zadání:
Vaším úkolem je implementovat:
- Funkci show_state(state), která vypíše daný plán na standardní výstup. Plán je reprezentován seznamem seznamů stejné délky, které obsahují znaky X (křížek), O (kolečko) nebo mezera pro neobsazené pole.
>>> state = [[' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', 'O'], [' ', ' ', ' ', ' ', 'X'], [' ', 'O', ' ', ' ', 'X']]
>>> show_state(state)
   
        O
        X
  O     X
- - - - -
0 1 2 3 4
- Funkci strategy(state, symbol), která pro daný plán a symbol vrátí pozici (sloupec) tahu počítače. Není nutné aby byla nějak sofistikovaná, může vracet náhodný sloupec v daném rozsahu.
>>> state = [[' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', 'X', ' ']]
>>> strategy(state, 'O')
2

Funkci tictactoe(rows, cols, human_starts=True), která umožňuje hrát hru padajících piškvorek na plánu o daném počtu řádků a sloupců. Můžete předpokládat, že zadaná velikost plánu je rozumná (alespoň 3 a méně než 25 sloupců a řádků). Parametr human_starts určuje, zda začíná hráč nebo počítač. Výpis průběhu hry by měl vypadat stejně, jako v následujících příkladech. Funkce kontroluje, zda jsou tahy zadané hráčem a počítačem platné a pokud nejsou, vyzve ho k novému zadání. Pro hru počítače volejte výše uvedené funkce show_state(state) a strategy(state, symbol).

Příklady hry
Příklad, v němž začíná hráč:
 
Na tahu je hrac
Do jakeho sloupce chces hrat? (do 0 do 9)? 5









          X
- - - - - - - - - -
0 1 2 3 4 5 6 7 8 9

Na tahu je pocitac
Pocitac hraje do sloupce cislo 9









          X       O
- - - - - - - - - -
0 1 2 3 4 5 6 7 8 9

Na tahu je hrac
Do jakeho sloupce chces hrat? (do 0 do 9)? 6









          X X     O
- - - - - - - - - -
0 1 2 3 4 5 6 7 8 9

Na tahu je pocitac
Pocitac hraje do sloupce cislo 5








          O
          X X     O
- - - - - - - - - -
0 1 2 3 4 5 6 7 8 9

Na tahu je hrac
Do jakeho sloupce chces hrat? (do 0 do 9)? 4








          O
        X X X     O
- - - - - - - - - -
0 1 2 3 4 5 6 7 8 9

Na tahu je pocitac
Pocitac hraje do sloupce cislo 7








          O
        X X X O   O
- - - - - - - - - -
0 1 2 3 4 5 6 7 8 9

Na tahu je hrac
Do jakeho sloupce chces hrat? (do 0 do 9)? 3








          O
      X X X X O   O
- - - - - - - - - -
0 1 2 3 4 5 6 7 8 9
Vyhral jsi!

Bodování:
- Funkce tictactoe(rows, cols, human_starts=True) musí korektně provádět hru hráče a počítače, kontrolovat zadané tahy hráče a určit výhru. Výpis se musí shodovat s výše uvedenými ukázkami.
- Základní variantou strategy je funkce, která dodržuje pravidla, ale jinak hraje náhodně. Pokud váš program bude hrát "inteligentně" (například ukončí hru, pokud bude mít možnost), získáte bonusové body. Čím inteligentněji, tím více bodů. V každém případě napište do komentáře stručné vysvětlení, jak moc inteligentně program hraje. Kvalita tohoto popisu je také důležitá.

Několik tipů:
- Než začnete psát kód, rozmyslete si (nejlépe si i nakreslete) dekompozici problému na jednodušší funkce. Jinak se v tom ztratíte. Problém lze rozložit různě, příklady užitečných funkcí: is_won(state) nebo valid_move(move, state), ale v průběhu řešení by vás pak měly napadnout ještě další. Kdykoliv zjistíte, že máte v programu duplicitní kód, zbavte se ho (např. právě pomocí nové pomocné funkce). A všechny funkce by měly zůstat dostatečně krátké a přehledné.
- Začněte variantou s náhodnými tahy, rozumné chování přidejte až potom. Při dobré dekompozici by rozšiřování neměl být problém.
- Zkuste si tuto hru párkrát zahrát (s někým nebo i sami se sebou), pomůže vám to lépe pochopit, jak by měl počítač optimálně hrát.

Důležité poznámky:

- Nepoužívejte diakritiku (ani v komentářích).
- Může dojít i k remíze (při naplnění všech dostupných hracích polí). Doporučuji toto detekovat, jinak pravděpodobně dojde k zacyklení programu.
- Pro jistotu ještě jednou: dodržte kostru programu i výpis průběhu hry tak, jak je uvedené v zadání.

Odevzdání:
  • Deadline 17. 11. v 23:59.
  • Odevzdejte jediný soubor uloha04.py, s definicemi funkcí show_state(state), strategy(state, symbol) a tictactoe(rows, cols, human_starts=True) (a dalšími pomocnými funkcemi dle vaší dekompozice). Dodržte tyto názvy funkcí a parametrů (kvůli částečně automatickému opravování úlohy).
  • Odevzdávárny:
    • Skupina 3 - https://is.muni.cz/auth/el/1433/podzim2016/IB111/ode/ode_65131781/65131799
    • Skupina 4 - https://is.muni.cz/auth/el/1433/podzim2016/IB111/ode/ode_65131783/65131813
    • Skupina 5 - https://is.muni.cz/auth/el/1433/podzim2016/IB111/ode/ode_65131786/65131828
    • Skupina 6 - https://is.muni.cz/auth/el/1433/podzim2016/IB111/ode/ode_65131787/65131849