PythonでTic-Tac-Toeゲームを作成する方法は?

公開: 2021-08-19

Pythonで簡単なTicTacToeゲームを作成しましょう。 ゲームロジックを構築し、コードを構造化する方法を理解するのに役立ちます。

ゲームは人間が持っている娯楽の1つです。 Web、モバイル、デスクトップなどでさまざまな種類のゲームを見つけることができます。現在、これらの重いゲームの1つを作成するためにここにいるわけではありません。 Pythonを使用してCLIの三目並べゲームを作成します。

Tic Tac Toeに慣れていない場合は、ここで視覚的に再生して理解してください。 気にしないでください、あなたがそれを理解していなくても、私たちはそれを見るつもりです。

○×ゲーム

チュートリアルは3つの異なるセクションに分かれています。 最初のセクションでは、三目並べゲームのプレイ方法を学びます。 その後、ゲームロジックを考え出すのに役立つアルゴリズムが表示されます。 最後に、構造化コードとその説明を見ていきます。

Tic Tac Toeのプレイ方法をすでに知っている場合は、最初のセクションをスキップできます。

それで、これ以上面倒なことはせずに、最初のセクションに飛び込みましょう。

三目並べを再生する

ゲームには2人のプレイヤーが参加します。 2つの記号が各プレーヤーを表しています。 ゲームで使用される一般的な記号はXOです。 最後に、 9つのボックスを備えたボードがあります。

三目並べボードを視覚的に確認します。

三目並べボード
三目並べボード

ゲームプレイは以下のようになります。

  • まず、1人のユーザーが利用可能な空のボックスの1つにサインを配置します。
  • 次に、2番目のユーザーは、使用可能な空のボックスの1つにサインを配置します。
  • プレーヤーの目標は、それぞれの標識を完全に行方向または列方向、あるいは斜めに配置することです。
  • ゲームは、プレーヤーがゲームに勝つか、勝つ試合なしですべてのボックスを埋めて引き分けになるまで続きます。

いくつかのゲームプレイを視覚的に見てみましょう。

Tic Tac ToeWinゲームプレイ
Tic Tac ToeWinゲームプレイ

プレーヤーXは、上記のゲームプレイでゲームに勝ちます。 すべてのボックスは斜めにX記号で埋められます。 したがって、それぞれのプレイヤーがゲームに勝ちます。

同じサインを配置してゲームに勝つには、合計8つの方法があります。 ゲームに勝つことができる8つのアレンジメントすべてを見てみましょう。

三目並べの勝利の取り決め
三目並べの勝利の取り決め

そして最後に、ドローは勝ちの取り決めなしでボードを埋めます。 三目並べの方法を今すぐ理解していただければ幸いです。

今、それはあなたのためのプレイタイムです。 ゲームプレイを完全に理解するために、ここに行ってプレイすることができます。 すでに持っている場合はそのままにしておきます。

次に、アルゴリズムセクションを移動します。

アルゴリズム

次に、コードを記述するためのアルゴリズムについて説明します。 このアルゴリズムは、選択したプログラミング言語でコードを書くのに役立ちます。 それがどのように行われるか見てみましょう。

  • 2次元配列を使用してボードを作成し、各要素を空として初期化します。
    • 好きな記号を使用して空を表すことができます。 ここでは、ハイフンを使用します。 '-'
  • ボードがいっぱいかどうかをチェックする関数を記述します。
    • ボードを繰り返し処理し、ボードに空の記号が含まれている場合はfalseを返し、そうでない場合はtrue返しtrue
  • プレイヤーが勝ったかどうかをチェックする関数を作成します。
    • 前のセクションで説明したすべての可能性を確認する必要があります。
    • すべての行、列、および2つの対角線を確認します。
  • ユーザーがプレイしているときにボードを複数回表示するので、ボードを表示する関数を記述します。
  • ゲームを開始する関数を記述します。
    • プレイヤーの最初のターンをランダムに選択します。
    • ゲームが終了したときに中断する無限ループを記述します(勝つか引き分け)。
      • ボードをユーザーに見せて、次の動きの場所を選択します。
      • 行と列の番号を入力するようにユーザーに依頼します。
      • それぞれのプレーヤーのサインでスポットを更新します。
      • 現在のプレイヤーがゲームに勝ったかどうかを確認します。
      • 現在のプレーヤーがゲームに勝った場合は、勝ったメッセージを印刷して、無限ループを解除します。
      • 次に、ボードがいっぱいになっていないか確認します。
      • ボードがいっぱいになったら、描画メッセージを印刷して無限ループを解除します。
    • 最後に、ボードの最終ビューをユーザーに表示します。

何が起こっているのかを視覚化できるかもしれません。 完全に理解していなくても心配しないでください。 コードを見ると、より明確になります。

それでは、コードセクションにジャンプしましょう。 コードを試すために、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

コードの構造を理解するのに役立ついくつかの主要なポイント。

  • クラスを使用して、すべてのメソッドを1か所にまとめました。 他のコードでも簡単に再利用可能なバンドルにすることができます。
  • 次に、小さな作業であっても、責任ごとに異なる機能を定義しました。 コードを簡単に維持するのに役立ちます。
  • 上記の2つのアプローチは、ゲームを更新する場合にアプリを簡単に更新するのに役立ちます。

プロジェクトに基づいて、構造を自由に適応させ、改善してください。 コードの構造化は制限されていません。

最後の言葉

やあ! あなたは完全にゼロからゲームを作成しました。 これは、私たちが毎日プレイするビジュアルゲームの1つではありません。 ただし、ロジックを記述し、コードでクリーンな構造を維持するのに役立ちます。 同様のガイドラインに従って、このような興味深いゲームを作成してください。 数年前に子供時代に戻ると、同様のゲームを見つけることができます。

ハッピーコーディング!

次に、Pythonunittestモジュールを使用して数値推測ゲームとユニットテストを作成する方法を探ります。