Jak vytvořit hru Tic-Tac-Toe v Pythonu?

Zkusme si společně vytvořit jednoduchou hru Piškvorky v jazyce Python. Tento projekt vám umožní proniknout do tajů herní logiky a pochopit, jak efektivně strukturovat kód.

Hraní her je oblíbenou formou zábavy. Na webu, v mobilních aplikacích i na počítačích najdeme nespočet herních titulů. Tentokrát se ale nebudeme pouštět do složitých projektů. Vytvoříme si jednoduchou textovou verzi hry Piškvorky, která se spouští v příkazovém řádku (CLI), a to s pomocí jazyka Python.

Pokud nevíte, jak se Piškvorky hrají, můžete si je vyzkoušet vizuálně zde. Nemusíte se ale obávat, i když hru neznáte, vše si vysvětlíme.

Piškvorky krok za krokem

Tento tutoriál je rozdělen do tří částí. Nejprve se seznámíme se samotnými pravidly hry. Poté se podíváme na algoritmus, který nám pomůže vytvořit herní logiku. Nakonec si představíme strukturovaný kód a jeho detailní popis.

Pokud už pravidla Piškvorek znáte, můžete první sekci přeskočit.

Pojďme se tedy rovnou pustit do první části.

Základní pravidla hry

Hry se účastní dva hráči. Každý hráč má svůj herní symbol – obvykle X a O. Hra se odehrává na hrací desce o rozměrech 3×3, tedy s celkem 9 políčky.

Pro lepší představu si prohlédněte obrázek hrací desky Piškvorek.

Hrací deska Piškvorek

Hra probíhá takto:

  • První hráč umístí svůj symbol na volné políčko.
  • Poté druhý hráč umístí svůj symbol na jiné volné políčko.
  • Cílem je umístit tři své symboly do jedné řady, sloupce nebo diagonály.
  • Hra pokračuje, dokud jeden z hráčů nezíská tři symboly v řadě, nebo dokud nejsou všechna políčka zaplněna bez vítěze (remíza).

Pro ilustraci se podívejme na několik herních situací.

Příklad výhry hráče X

Na obrázku výše vyhrál hráč s X, protože jeho symboly tvoří diagonální řadu. Hráč tedy vítězí.

Celkem existuje 8 možných kombinací, jak umístit tři stejné symboly a vyhrát hru. Podívejme se na všechny tyto výherní kombinace.

K remíze dochází, když se zaplní celá hrací deska a žádný z hráčů nevytvořil výherní kombinaci. Doufám, že nyní už princip hry chápete.

Nyní je čas si hru vyzkoušet. Můžete si ji zahrát zde, abyste si hru plně osvojili. Pokud už to máte za sebou, pojďme dál.

Nyní se přesuneme k sekci algoritmů.

Algoritmus pro tvorbu hry

Nyní se zaměříme na algoritmus, který použijeme pro napsání kódu. Tento algoritmus nám poslouží jako základ pro vytvoření hry v libovolném programovacím jazyce. Pojďme se podívat, jak na to.

  • Vytvoříme hrací desku jako dvourozměrné pole, kde každá pozice bude na začátku prázdná.
    • Prázdné políčko můžeme reprezentovat libovolným znakem. V našem případě použijeme pomlčku (-).
  • Vytvoříme funkci pro kontrolu, zda je hrací deska plná.
    • Projdeme všechny prvky desky a vrátíme *false*, pokud deska obsahuje prázdný znak. V opačném případě vrátíme *true*.
  • Vytvoříme funkci pro kontrolu, zda některý z hráčů vyhrál.
    • Zkontrolujeme všechny možné výherní kombinace, které jsme si popsali v předchozí sekci.
    • Zkontrolujeme všechny řádky, sloupce i obě diagonály.
  • Napíšeme funkci pro zobrazení hrací desky, protože ji budeme během hry několikrát zobrazovat uživateli.
  • Vytvoříme funkci pro spuštění hry.
    • Náhodně vybereme hráče, který začne hru.
    • Vytvoříme nekonečnou smyčku, která se přeruší, až hra skončí (výhrou nebo remízou).
      • Zobrazíme hrací desku uživateli, aby si vybral políčko pro svůj tah.
      • Požádáme uživatele o zadání čísla řádku a sloupce.
      • Aktualizujeme vybrané políčko příslušným symbolem hráče.
      • Zkontrolujeme, zda aktuální hráč vyhrál hru.
      • Pokud aktuální hráč vyhrál hru, vypíšeme zprávu o výhře a ukončíme smyčku.
      • Dále zkontrolujeme, zda je deska plná.
      • Pokud je hrací plocha plná, vypíšeme zprávu o remíze a ukončíme smyčku.
    • Nakonec zobrazíme uživateli finální stav hrací desky.

Možná už si dokážete představit, jak bude hra vypadat. Nemusíte si dělat starosti, pokud jste tomu úplně neporozuměli. Jakmile uvidíte kód, vše se vyjasní.

Pojďme se tedy podívat na kód. Předpokládám, že máte na svém počítači nainstalovaný Python, abyste si mohli kód vyzkoušet.

Kód hry v Pythonu

Zde je kód naší hry Piškvorky:

import random

class TicTacToe:

    def __init__(self):
        self.board = []

    def create_board(self):
        for i in range(3):
            row = []
            for j in range(3):
                row.append('-')
            self.board.append(row)

    def get_random_first_player(self):
        return random.randint(0, 1)

    def fix_spot(self, row, col, player):
        self.board[row][col] = player

    def is_player_win(self, player):
        win = None

        n = len(self.board)

        # kontrola řádků
        for i in range(n):
            win = True
            for j in range(n):
                if self.board[i][j] != player:
                    win = False
                    break
            if win:
                return win

        # kontrola sloupců
        for i in range(n):
            win = True
            for j in range(n):
                if self.board[j][i] != player:
                    win = False
                    break
            if win:
                return win

        # kontrola diagonál
        win = True
        for i in range(n):
            if self.board[i][i] != player:
                win = False
                break
        if win:
            return win

        win = True
        for i in range(n):
            if self.board[i][n - 1 - i] != player:
                win = False
                break
        if win:
            return win
        return False

        for row in self.board:
            for item in row:
                if item == '-':
                    return False
        return True

    def is_board_filled(self):
        for row in self.board:
            for item in row:
                if item == '-':
                    return False
        return True

    def swap_player_turn(self, player):
        return 'X' if player == 'O' else 'O'

    def show_board(self):
        for row in self.board:
            for item in row:
                print(item, end=" ")
            print()

    def start(self):
        self.create_board()

        player="X" if self.get_random_first_player() == 1 else 'O'
        while True:
            print(f"Na tahu je hráč {player}")

            self.show_board()

            # Získání vstupu od uživatele
            row, col = list(
                map(int, input("Zadejte číslo řádku a sloupce: ").split()))
            print()

            # Umístění symbolu hráče
            self.fix_spot(row - 1, col - 1, player)

            # Kontrola, zda hráč vyhrál
            if self.is_player_win(player):
                print(f"Hráč {player} vyhrál!")
                break

            # Kontrola, zda je hra nerozhodná
            if self.is_board_filled():
                print("Remíza!")
                break

            # Výměna hráče
            player = self.swap_player_turn(player)

        # Zobrazení finálního stavu hrací desky
        print()
        self.show_board()


# Spuštění hry
tic_tac_toe = TicTacToe()
tic_tac_toe.start()

Zde je ukázkový výstup z kódu:

$ python tic_tac_toe.py 
Na tahu je hráč X
- - -
- - -
- - -
Zadejte číslo řádku a sloupce: 1 1

Na tahu je hráč O
X - -
- - -
- - -
Zadejte číslo řádku a sloupce: 2 1

Na tahu je hráč X
X - -
O - -
- - -
Zadejte číslo řádku a sloupce: 1 2

Na tahu je hráč O
X X -
O - -
- - -
Zadejte číslo řádku a sloupce: 1 3

Na tahu je hráč X
X X O
O - -
- - -
Zadejte číslo řádku a sloupce: 2 2

Na tahu je hráč O
X X O
O X -
- - -
Zadejte číslo řádku a sloupce: 3 3

Na tahu je hráč X
X X O        
O X -        
- - O
Zadejte číslo řádku a sloupce: 3 2

Hráč X vyhrál!

X X O
O X -
- X O

Pár důležitých bodů, které vám pomohou pochopit strukturu kódu:

  • Kód je strukturován pomocí třídy, která seskupuje všechny metody do jednoho celku. Třídu lze tak snadno použít v jiném projektu.
  • Každá funkce je zodpovědná za malý úkol. To nám pomáhá udržovat kód přehledný a snadno modifikovatelný.
  • Tyto postupy nám umožňují snadno aktualizovat aplikaci, pokud budeme chtít hru v budoucnu vylepšit.

Nebojte se strukturu kódu upravovat a vylepšovat dle vašich potřeb. Struktura kódu není dogma.

Závěrem

Gratuluji! 😎 Úspěšně jste vytvořili hru Piškvorky od nuly. Sice se nejedná o vizuálně propracovanou hru, ale tento projekt vám pomůže procvičit si logické myšlení a naučí vás, jak udržovat čistou strukturu kódu. Můžete zkusit vytvořit i další zajímavé hry, které jste jako děti hrávali.

Příjemné kódování! 👩‍💻

Dále můžete zkusit vytvořit hru Hádání čísel nebo se seznámit s testováním jednotek pomocí modulu Python unittest.

Líbil se vám tento článek? Podělte se o něj se svými přáteli!