如何在 Python 中創建井字遊戲?
已發表: 2021-08-19讓我們用 Python 創建一個簡單的 Tic Tac Toe 遊戲。 它將幫助您構建遊戲邏輯並了解如何構建代碼。
遊戲是人類的娛樂方式之一。 我們可以在網絡、移動設備、桌面設備等上找到不同類型的遊戲。我們現在不是來製作那些重磅遊戲的。 我們將使用 Python 創建一個 CLI 井字遊戲。
如果您不熟悉 Tic Tac Toe,請在此處直觀地播放以了解。 別擔心,即使你不明白,我們也會看到的。
井字遊戲
本教程分為三個不同的部分。 在第一部分,您將了解如何玩井字遊戲。 之後,我們將看到一個算法,可以幫助我們提出遊戲邏輯。 最後,我們將看到結構化代碼及其解釋。
如果您已經知道如何玩井字遊戲,您可以跳過第一部分。
因此,事不宜遲,讓我們深入了解我們的第一部分。
玩井字遊戲
一場比賽將有兩名球員。 兩個標誌代表每個玩家。 遊戲中使用的一般符號是X和O 。 最後,會有一個有9 個盒子的板子。
直觀地查看井字棋盤。

遊戲玩法如下。
- 首先,一位用戶將他們的標誌放在一個可用的空框中。
- 接下來,第二個用戶將他們的標誌放在一個可用的空框中。
- 玩家的目標是將他們各自的標誌完全按行或列或對角線放置。
- 遊戲繼續進行,直到玩家贏得遊戲,或者在沒有贏得比賽的情況下填滿所有方框而以平局告終。
讓我們直觀地看看一些遊戲玩法。

在上述遊戲玩法中,玩家X贏得遊戲。 所有框對角線填充X符號。 因此,相應的玩家贏得了比賽。
一共有8種方法可以安排相同的標誌並贏得比賽。 讓我們看看所有可以贏得比賽的8種安排。

最後,平局填滿棋盤,沒有任何獲勝安排。 我希望您現在了解如何使用井字遊戲。
現在,是你的遊戲時間。 你可以去這裡玩它,以完全了解遊戲玩法。 如果你已經得到了,就留下吧。
現在,是時候移動算法部分了。
算法
我們現在將討論編寫代碼的算法。 該算法將幫助您使用您選擇的任何編程語言編寫代碼。 讓我們看看它是如何完成的。
- 使用二維數組創建一個板並將每個元素初始化為空。
- 您可以使用任何您喜歡的符號來表示空。 在這裡,我們將使用連字符。
'-'。
- 您可以使用任何您喜歡的符號來表示空。 在這裡,我們將使用連字符。
- 寫一個函數來檢查板子是否被填滿。
- 遍歷棋盤並返回
false如果棋盤包含空符號,否則返回true。
- 遍歷棋盤並返回
- 編寫一個函數來檢查玩家是否贏了。
- 我們必須檢查我們在上一節中討論的所有可能性。
- 檢查所有行、列和兩條對角線。
- 編寫一個函數來顯示棋盤,因為我們會在用戶玩遊戲時多次向他們顯示棋盤。
- 編寫一個函數來啟動遊戲。
- 隨機選擇玩家的第一回合。
- 編寫一個無限循環,在遊戲結束(贏或平)時中斷。
- 向用戶展示棋盤以選擇下一步行動的地點。
- 要求用戶輸入行號和列號。
- 使用相應的玩家標誌更新該位置。
- 檢查當前玩家是否贏得了比賽。
- 如果當前玩家贏得了比賽,則打印獲勝消息並打破無限循環。
- 接下來,檢查板子是否被填滿。
- 如果棋盤已滿,則打印繪圖消息並打破無限循環。
- 最後,向用戶展示板的最終視圖。
您也許能夠想像正在發生的事情。 不要擔心,即使你沒有完全理解它。 一旦你看到代碼,你就會更加清晰。
所以,讓我們進入代碼部分。 我假設您在 PC 上安裝了 Python 來嘗試代碼。
代碼
通過下面的代碼。
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()查看代碼的示例輸出。

$ 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 XX - O - - - - - Enter row and column numbers to fix spot: 1 3 Player X turn XXO O - - - - - Enter row and column numbers to fix spot: 2 2 Player O turn XXO OX - - - - Enter row and column numbers to fix spot: 3 3 Player X turn XXOOX - - - O Enter row and column numbers to fix spot: 3 2 Player X wins the game! XXO OX - - XO幫助您理解代碼結構的一些要點。
- 我們使用了一個類將所有方法集中在一個地方。 它也可以很容易地成為其他一些代碼中的可重用包。
- 接下來,我們為每個職責定義了不同的功能,即使它是一個小任務。 它有助於輕鬆維護代碼。
- 如果我們想更新遊戲,上述兩種方法可以幫助我們輕鬆更新應用程序。
隨意調整結構並根據您的項目進行改進。 構建代碼不受限制。
最後的話
歡呼! 您已經完全從頭開始創建了一個遊戲。 它不是我們每天玩的視覺遊戲之一。 但它可以幫助您在代碼中編寫邏輯並維護乾淨的結構。 遵循類似的指導方針來創建一些像這樣有趣的遊戲。 如果您回到童年時代,您可以找到類似的遊戲。
快樂編碼!
接下來,探索如何使用 Python unittest 模塊創建猜數遊戲和單元測試。
