Piškvorky (Tic-Tac-Toe)
Nejnovější verze Pythonu, kterou byste v tomto kurzu měli používat, je Python 3.12.
Pomocí algoritmu Minimax implementujte AI, která hraje piškvorky optimálně.

Kdy úkol dokončit
Jak získat pomoc
Začínáme
- Stáhněte výchozí kód z https://cdn.cs50.net/ai/2023/x/projects/0/tictactoe.zip a rozbalte jej.
- V adresáři projektu spusťte
pip3 install -r requirements.txt, abyste nainstalovali balíček Pythonu (pygame), který projekt vyžaduje.
Porozumění výchozímu kódu
Tento projekt má dva hlavní soubory: runner.py a tictactoe.py. tictactoe.py obsahuje veškerou logiku hry a volby optimálních tahů. runner.py je již implementován a obsahuje celý kód grafického rozhraní hry. Až dokončíte všechny požadované funkce v tictactoe.py, měli byste pomocí python runner.py být schopni hrát proti své AI!
Otevřeme tictactoe.py a podíváme se na to, co je připraveno. Nejprve definujeme tři proměnné: X, O a EMPTY, které představují možné hodnoty polí herní desky.
Funkce initial_state vrací počáteční stav desky. V této úloze jsme desku zvolili jako seznam tří seznamů představujících její tři řádky. Každý vnitřní seznam obsahuje tři hodnoty, které jsou buď X, O, nebo EMPTY. Následují funkce, jejichž implementaci jsme nechali na vás!
Specifikace
Dokončete implementace player, actions, result, winner, terminal, utility a minimax.
- Funkce
playermá přijmout stavboarda vrátit hráče, který je na tahu, tedyXneboO.- V počátečním stavu hry hraje jako první
X. S každým dalším tahem se hráči střídají. - Pokud je vstupem koncová deska, tedy hra již skončila, je přípustná libovolná návratová hodnota.
- V počátečním stavu hry hraje jako první
- Funkce
actionsmá vrátitsetvšech akcí, které lze na dané desce provést.- Každá akce má být n-tice
(i, j), kdeioznačuje řádek tahu (0,1nebo2) ajpolíčko v daném řádku, na které se táhne (také0,1nebo2). - Povolené tahy zahrnují všechna políčka desky, v nichž dosud není
XaniO. - Pokud je vstupem koncová deska, je přípustná libovolná návratová hodnota.
- Každá akce má být n-tice
- Funkce
resultpřijímáboardaactiona má vrátit nový stav desky, aniž by původní desku změnila.- Pokud
actionnení platnou akcí pro danou desku, program má vyvolat výjimku. - Vrácený stav má odpovídat desce, která by vznikla, kdyby hráč na tahu provedl na původní vstupní desce tah do políčka určeného vstupní akcí.
- Původní deska musí zůstat nezměněna: Minimax bude během výpočtu potřebovat zvažovat mnoho různých stavů desky. Prostá změna políčka v samotném
boardproto není správnou implementací funkceresult. Před změnami pravděpodobně budete chtít vytvořit hlubokou kopii desky.
- Pokud
- Funkce
winnermá přijmoutboarda vrátit vítěze, pokud existuje.- Pokud vyhrál hráč X, funkce má vrátit
X. Pokud vyhrál hráč O, funkce má vrátitO. - Vyhrát lze umístěním tří vlastních značek do souvislé vodorovné, svislé nebo diagonální řady.
- Můžete předpokládat nejvýše jednoho vítěze. Žádná deska tedy nebude mít současně tři značky v řadě u obou hráčů, protože by to byl neplatný stav desky.
- Pokud hra nemá vítěze, protože ještě probíhá nebo skončila remízou, funkce má vrátit
None.
- Pokud vyhrál hráč X, funkce má vrátit
- Funkce
terminalmá přijmoutboarda vrátit booleovskou hodnotu označující, zda hra skončila.- Pokud hra skončila, protože někdo vyhrál nebo jsou všechna políčka obsazena bez vítěze, funkce má vrátit
True. - Pokud hra stále probíhá, funkce má naopak vrátit
False.
- Pokud hra skončila, protože někdo vyhrál nebo jsou všechna políčka obsazena bez vítěze, funkce má vrátit
- Funkce
utilitymá přijmout koncový stavboarda vrátit užitek této desky.- Pokud vyhrál X, užitek je
1. Pokud vyhrál O, užitek je-1. Pokud hra skončila remízou, užitek je0. - Můžete předpokládat, že
utilitybude volána proboardpouze tehdy, kdyžterminal(board)jeTrue.
- Pokud vyhrál X, užitek je
- Funkce
minimaxmá přijmoutboarda vrátit optimální tah pro hráče, který je na této desce na tahu.- Vrácený tah má být optimální akce
(i, j)z povolených akcí na desce. Pokud je více tahů stejně optimálních, je přípustný kterýkoli z nich. - Pokud
boardpředstavuje koncovou desku, funkceminimaxmá vrátitNone.
- Vrácený tah má být optimální akce
U všech funkcí přijímajících board můžete předpokládat platnou desku: seznam obsahuje tři řádky a v každém jsou tři hodnoty X, O nebo EMPTY. Poskytnuté deklarace funkcí, tedy pořadí ani počet jejich argumentů, neměňte.
Až budou všechny funkce správně implementovány, měli byste být schopni spustit python runner.py a hrát proti své AI. Protože při optimální hře obou stran piškvorky končí remízou, nikdy byste AI neměli porazit. Pokud ale sami nebudete hrát optimálně, může porazit ona vás!
Nápověda
- Pokud chcete funkce testovat v jiném souboru Pythonu, můžete je importovat například řádkem
from tictactoe import initial_state. - Do
tictactoe.pymůžete přidat další pomocné funkce, pokud jejich názvy nekolidují s názvy funkcí nebo proměnných, které již v modulu existují. - Alfa-beta prořezávání je volitelné, ale může zrychlit běh vaší AI!
Testování
Pokud chcete, můžete po nastavení check50 ve svém systému spustit následující příkaz pro ověření správnosti kódu. Není to povinné; můžete úkol jednoduše odevzdat podle kroků na konci specifikace a stejné testy se spustí na našem serveru. V každém případě kód také sami zkompilujte a otestujte!
check50 ai50/projects/2024/x/tictactoe
Následujícím příkazem zkontrolujte styl svého kódu pomocí style50.
style50 tictactoe.py
Pamatujte, že kromě modulů standardní knihovny Pythonu nesmíte importovat žádné jiné moduly než ty, které jsou zde výslovně povoleny. Jinak se nejen nespustí check50, ale ani submit50 nebude moci úkol ohodnotit, protože používá check50. Pokud k tomu dojde, pravděpodobně jste importovali něco nepovoleného nebo výchozí kód jinak změnili způsobem, který zadání nepovoluje. Existují nástroje, které některé projekty značně zjednodušují, ale to zde není cílem: učíte se na nižší úrovni. Pokud zde není řečeno, že je můžete používat, používat je nesmíte.
Jak úkol odevzdat
- Navštivte tento odkaz, přihlaste se účtem GitHub a klikněte na Authorize cs50. Poté zaškrtněte políčko udělující týmu kurzu přístup k vašim odevzdaným pracím a klikněte na Join course.
- Nainstalujte Git a volitelně nainstalujte
submit50. - Pokud máte nainstalovaný
submit50, spusťtesubmit50 ai50/projects/2024/x/tictactoeJinak pomocí Gitu odešlete práci do
https://github.com/me50/USERNAME.git, kdeUSERNAMEje vaše uživatelské jméno GitHub, do větve pojmenovanéai50/projects/2024/x/tictactoe.
Pokud kód odevzdáváte přímo pomocí Gitu místo submit50, nezahrnujte jiné soubory ani složky než ty, které máte podle výše uvedené specifikace skutečně upravit. Jinými slovy nenahrávejte celý svůj adresář!
Práce by měla být ohodnocena do pěti minut. Pak můžete na https://cs50.me/cs50ai zobrazit aktuální postup!