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

Pojďme vytvořit jednoduchou hru Tic Tac Toe v Pythonu. Pomůže vám vybudovat herní logiku a pochopit, jak strukturovat kód.

Hraní je jednou ze zábav, kterou lidé mají. Můžeme najít různé typy her na webu, na mobilu, na desktopu atd. Nejsme tu proto, abychom teď dělali jednu z těch těžkých her. Chystáme se vytvořit CLI tic-tac-toe hru pomocí Pythonu.

Pokud neznáte Tic Tac Toe, zahrajte si ji vizuálně tady rozumět. Nebojte se, i když tomu nerozumíte, my to uvidíme.

Piškvorky

Tutoriál je rozdělen do tří různých částí. V první části se seznámíte s hraním hry piškvorky. Poté uvidíme algoritmus, který nám pomůže přijít s logikou hry. Nakonec uvidíme strukturovaný kód a jeho vysvětlení.

Pokud již víte, jak hrát Tic Tac Toe, můžete první sekci přeskočit.

Pojďme se tedy bez dalších řečí vrhnout na naši první sekci.

Hraní Tic Tac Toe

Ve hře budou dva hráči. Každého hráče představují dva znaky. Obecná znamení používaná ve hře jsou X a O. Nakonec bude deska s 9 krabicemi.

Vizuálně si prohlédněte desku tic-tac-toe.

Tic Tac Toe Board

Průběh hry bude následující.

  • Nejprve jeden uživatel umístí své znamení do jednoho z dostupných prázdných polí.
  • Poté druhý uživatel umístí své znamení do jednoho z dostupných prázdných polí.
  • Cílem hráčů je umístit své příslušné znaky zcela po řadách nebo sloupcích nebo diagonálně.
  • Hra pokračuje, dokud hráč hru nevyhraje nebo neskončila remízou vyplněním všech políček bez vítězného zápasu.

Podívejme se na některé hry vizuálně.

Tic Tac Toe Win Gameplay

Hráč X vyhrává hru ve výše uvedené hře. Všechna pole se diagonálně vyplňují znakem X. Hru tedy vyhrává příslušný hráč.

Existuje celkem 8 způsobů, jak uspořádat stejné znamení a vyhrát hru. Pojďme se podívat na všech 8 uspořádání, která mohou hru vyhrát.

  Na co se dívat na Quibi: 10 nejlepších pořadů

Vítězná ujednání Tic Tac Toe

A nakonec, remíza vyplní šachovnici bez jakéhokoli výherního uspořádání. Doufám, že nyní rozumíte tomu, jak používat Tic Tac Toe.

Teď je čas na hraní. Můžeš jít tady a hrajte, abyste zcela porozuměli hře. Nechte to, pokud už to máte.

Nyní je čas přesunout sekci algoritmů.

Algoritmus

Nyní probereme algoritmus pro psaní kódu. Tento algoritmus vám pomůže napsat kód v libovolném programovacím jazyce podle vašeho výběru. Pojďme se podívat, jak se to dělá.

  • Vytvořte desku pomocí 2-rozměrného pole a inicializujte každý prvek jako prázdný.
    • Prázdné můžete reprezentovat pomocí libovolného symbolu, který se vám líbí. Zde budeme používat pomlčku. ‚-‚.
  • Napište funkci, která zkontroluje, zda je deska plná nebo ne.
    • Iterujte přes desku a vraťte false, pokud deska obsahuje prázdný znak, nebo vraťte true.
  • Napište funkci pro kontrolu, zda hráč vyhrál nebo ne.
    • Musíme zkontrolovat všechny možnosti, které jsme probrali v předchozí části.
    • Zkontrolujte všechny řádky, sloupce a dvě úhlopříčky.
  • Napište funkci pro zobrazení hrací desky, protože během hraní ukážeme hrací desku uživatelům několikrát.
  • Napište funkci pro spuštění hry.
    • Náhodně vyberte první kolo hráče.
    • Napište nekonečnou smyčku, která se přeruší, když hra skončí (buď výhra nebo remíza).
      • Ukažte hrací plochu uživateli, aby si vybral místo pro další tah.
      • Požádejte uživatele, aby zadal číslo řádku a sloupce.
      • Aktualizujte místo příslušným znakem hráče.
      • Zkontrolujte, zda aktuální hráč vyhrál hru nebo ne.
      • Pokud aktuální hráč vyhrál hru, vytiskněte vítěznou zprávu a přerušte nekonečnou smyčku.
      • Dále zkontrolujte, zda je deska plná nebo ne.
      • Pokud je hrací plocha plná, vytiskněte zprávu o losování a přerušte nekonečnou smyčku.
    • Nakonec ukažte uživateli konečný pohled na tabuli.
  Jak opravit nefunkční gumu GIMP

Možná si dokážete představit, co se děje. Nebojte se, i když jste to úplně nepochopili. Jakmile kód uvidíte, získáte větší jasnost.

Pojďme tedy do sekce kódu. Předpokládám, že máte na svém PC nainstalovaný Python, abyste mohli kód vyzkoušet.

Kód

Projděte si níže uvedený kód.

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)

        # checking rows
        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

        # checking columns
        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

        # checking diagonals
        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"Player {player} turn")

            self.show_board()

            # taking user input
            row, col = list(
                map(int, input("Enter row and column numbers to fix spot: ").split()))
            print()

            # fixing the spot
            self.fix_spot(row - 1, col - 1, player)

            # checking whether current player is won or not
            if self.is_player_win(player):
                print(f"Player {player} wins the game!")
                break

            # checking whether the game is draw or not
            if self.is_board_filled():
                print("Match Draw!")
                break

            # swapping the turn
            player = self.swap_player_turn(player)

        # showing the final view of board
        print()
        self.show_board()


# starting the game
tic_tac_toe = TicTacToe()
tic_tac_toe.start()

Podívejte se na ukázkový výstup kódu.

$ python tic_tac_toe.py 
Player X turn
- - -
- - -
- - -
Enter row and column numbers to fix spot: 1 1

Player O turn
X - -
- - -
- - -
Enter row and column numbers to fix spot: 2 1

Player X turn
X - -
O - -
- - -
Enter row and column numbers to fix spot: 1 2

Player O turn
X X -
O - -
- - -
Enter row and column numbers to fix spot: 1 3

Player X turn
X X O
O - -
- - -
Enter row and column numbers to fix spot: 2 2

Player O turn
X X O
O X -
- - -
Enter row and column numbers to fix spot: 3 3

Player X turn
X X O        
O X -        
- - O
Enter row and column numbers to fix spot: 3 2

Player X wins the game!

X X O
O X -
- X O

Některé hlavní body, které vám pomohou pochopit strukturu kódu.

  • Použili jsme třídu, abychom měli všechny metody na jednom místě. Může to být snadno znovu použitelný balíček v nějakém jiném kódu.
  • Dále jsme definovali různé funkce pro každou odpovědnost, i když se jedná o malý úkol. Pomáhá snadno udržovat kód.
  • Výše uvedené dva přístupy nám pomáhají bez námahy aktualizovat aplikaci, pokud chceme aktualizovat hru.
  Jak otevřít Centrum oznámení na iPhone X

Nebojte se přizpůsobit strukturu a zlepšit ji na základě vašeho projektu. Strukturování kódu není omezeno.

Závěrečná slova

Hurá! 😎 Vytvořili jste hru úplně od nuly. Nepatří mezi vizuální hry, které hrajeme denně. Ale pomáhá vám psát logiku a udržovat čistou strukturu v kódu. Postupujte podle podobných pokynů a vytvořte zajímavé hry, jako je tato. Podobné hry najdete, pokud se vrátíte o pár let zpět do dětství.

Šťastné kódování! 👩‍💻

Dále prozkoumejte, jak vytvořit hru na hádání čísel a testování jednotek s modulem Python unittest.

Užili jste si čtení článku? Co takhle sdílet se světem?