Domáca úloha 3 Maximálny počet bodov: 30 Odovzdanie: Do 17.11. 20:00 Pokyny Domácu úlohu odovzdávajte do odevzdávarny: https://is.muni.cz/auth/el/1433/podzim2018/IB111/ode/skupina_34_bojnak/85571659/ Ustrážte si termín odovzdania, odevzdávarna sa v danom čase zatvára a úlohu potom nebude možné odovzdať. Prosím, dávajte si pozor na odpisovanie, ktoré sa tvrdo trestá. Môžete si pomáhať internetom, akurát pokiaľ nejaký kód odniekiaľ skopírujete, budem požadovať, aby ste mu rozumeli (môžem od vás požadovať, aby ste svoj kód vysvetlili). Odporúčam vám ale, aby ste úlohu pre vaše dobro robili sami, tak sa najlepšie naučíte programovať. Znovu si nezabudnite prečítať pokyny na adrese https://www.fi.muni.cz/IB111/?p=dupokyny a riadiť sa nimi pri odovzdávaní. V prípade akýchkoľvek nejasností ma neváhajte kedykoľvek kontaktovať. Snáď sa vam bude dariť tak, ako v predchádzajúcich úlohách :) Zadanie – Hra Blokovanie Naprogramujte hru Blokovanie a jej varianty človek vs. počítač a počítač vs. počítač s rôznymi stratégiami počítača. Pravidlá hry: - Hra sa hrá na štvorcovom pláne obdĺžnikových rozmerov - Na začiatku je plán voľný. Hráči sa striedajú. Vo svojom ťahu si hráč vyberie niektoré z voľných polí, čím zablokuje toto pole a všetky susedné polia (aj diagonálne). Každé pole na pláne môže byť teda voľné, alebo blokované. - Hráč, ktorý prvý nemôže zahrať svoj ťah (všetky polia boli zablokované), prehral. Detailnejšie sú pravidlá aj s príkladom popísané tu http://www.papg.com/show?2XMX. Je tu možné si hru aj zahrať. Ako bude naša verzia hry vyzerať? Na začiatku si hráč bude môcť zvoliť veľkosť poľa tak, že postupne zadá dve čísla s tým, že program hráčovi napovie, čo má práve zadať. Následne vypíšete hrací plán. Všetky voľné polia budú reprezentované znakom – a všetky obsadené znakom X. Následne si užívateľ bude môcť vybrať jednu z dvoch variant hier tým, že zadá na vstup jeden z dvoch znakov A, B: - Verzia človek vs. počítač (znak A), - Verzia počítač vs. počítač (znak B). Potom si zvolí, akou stratégiou bude počítač hrať tým, že zadá jeden zo znakov C,D,E: - Postupná stratégia (znak C), - Náhodná stratégia (znak D) - Maximálna blokujúca stratégia (znak E) V prípade, že je zvolená hra Počítač vs. Počítač, tak je nutné voľbu stratégie vykonať ešte raz – užívateľ musí zvoliť stratégiu aj pre druhý počítač. Po zadaní jedného z týchto znakov sa začne hrať. Verzia človek vs. počítač Postup hry: 1. Vždy sa na začiatku vypíše hracie pole (na začiatku sú vždy všetky polia voľné). 2. Na ťahu je človek. Ten si postupne zvolí súradnice poľa, ktoré chce zahrať. 3. To znamená, že najprv musí zadať číslo riadku, následne číslo stĺpca (pozor, riadky aj stĺpce číslujeme od 0). 4. Vypíše sa na výstup aktuálne hracie pole. 5. Na ťahu je počítača. Na výstup sa vypíše, aké pole si vybral počítač. Príklad výpisu: Computer chose row 0 and column 3. 6. Znovu sa vypíše aktualizované hracie pole. 7. Tento postup sa opakuje, kým hráč, alebo počítač nevyhrá. Vtedy sa vypíše, kto je víťazom. Vždy, keď užívateľ zahrá, musí sa skontrolovať, či je jeho ťah valídny (či nezadal súradnice, ktoré sú mimo hracieho poľa, alebo nezadal súradnice poľa, ktoré je už zablokované). V prípade nevalídneho ťahu je nutné na to hráča upozorniť a umožniť mu vybrať si znovu súradnice (až kým si nezvolí nejaké valídne). Počítač si vždy vyberá valídne polia. Verzia počítač vs. počítač Táto verzia vyzerá skoro rovnako s tým rozdielom, že užívateľ už po zvolení stratégie nezadáva na vstup nič. Hrá proti sebe Počítač 1 a Počítač 2 a na výstup sa vypisuje, ktorý počítač zahral ktoré pole. Po každom zahratí sa vypisuje aktualizovaný hrací plán. Na konci hry sa vypíše, ktorý počítač vyhral. Stratégie: Implementácie stratégie znamená naprogramovať spôsob, akým si bude počítač vyberať pole, ktoré zahrá. Postupná stratégia: - Počítač si vyberie vždy prvé voľné pole, ktoré pri priechode plánom nájde Náhodná stratégia: - Počítač hrá na náhodne zvolené prázdne pole Maximálna blokujúca stratégia: - Počítač hrá na také pole, ktoré zablokuje čo najviac voľných polí Aby toho nebolo málo... Analýza hry Pre rôzne veľkosti hracieho plánu analyzujte, či má výhodu prvý, alebo druhý hráč. Túto analýzu vyskúšajte pre súboje rôznych stratégií (náhoda vs. náhoda, náhoda vs. postupná stratégia)... Analýzu vykonajte aspoň pre tri rôzne stratégie. Tuto analýzu nerobte ručne, tu už žiadny vstup od užívateľa nebude. Analýza bude vyzerať iba ako funkcia analyze_game() s nula parametrami. Táto funkcia vypíše na výstup postupne stratégie, ktoré proti sebe skúšala a či mal väčšiu výhodu prvý, alebo druhý hráč (to znamená, či viackrát vyhral hráč, ktorý šiel prvý, alebo hráč, ktorý šiel druhý). Analýzu vykonáte podobne, ako sa robila v predchádzajúcej domácej úlohe – opakovane skúšate hrať hru s danými stratégiami a zisťujete, kto vyhral. PEP8 Od tejto domácej úlohy bude od vás vyžadovaný programátorský štýl zhodný so zásadami PEP8. Vaše zdrojové kódy budú testované na stránke http://pep8online.com/ a je možné stratiť nejaké body v prípade chýb v programátorskom štýle Rady 1. V tejto úlohe je veľmi dôležité rozdeliť si program správne do funkcií. Ak to na začiatku poriadne nepremyslíte, môžete napríklad pri analýze zistiť, že sa vám analýza takto vôbec nedá spraviť. Poriadne si rozdeľte funkcie, ktoré sa starajú o výpis a funkcie, ktoré sa starajú o samotnú hru, stratégie, atď. 2. Otestujte si, či program korektne funguje na obdĺžnikových plánoch. Častá chyba u úloh tohto typu je, že programátori testujú program iba na štvorcových plánoch a program im spadne, keď ho niekto vyskúša na obdĺžnikovom pláne. 3. Pri implementovaní náhodnej stratégie sa môže hodiť knižnica random https://docs.python.org/3/library/random.html a jej funkcia shuffle. Nie je nutné ale funkciu shuffle použiť, akým spôsobom stratégie implementujete, je na vás. Na nasledujúcej strane sa nachádza jednoduchý príklad hry človeka s počítačom. Príklad