テクノロジー 開発 非公開: Python で三目並べゲームを作成するには?

Python で三目並べゲームを作成するには?

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

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

三目並べに慣れていない場合は、 ここで視覚的にプレイして理解してください。理解できなくても、見ていきますのでご安心ください。

○×ゲーム

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

三目並べの遊び方をすでに知っている場合は、最初のセクションをスキップしても構いません。

それでは、さっそく最初のセクションに進みましょう。

三目並べをする

ゲームには 2 人のプレイヤーが参加します。 2 つのサインが各プレーヤーを表します。ゲームで使用される一般的な記号はXOです。最後に、 9 個のボックスが入ったボードが表示されます。

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

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

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

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

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

三目並べの勝利ゲームプレイ
三目並べの勝利ゲームプレイ

上記のゲームプレイでは、プレイヤーXがゲームに勝ちます。すべてのボックスの対角線にX記号が表示されます。したがって、それぞれのプレイヤーがゲームに勝ちます。

同じサインを揃えてゲームに勝つ方法は全部で8通りあります。試合に勝つための8つのアレンジをすべて見てみましょう。

三目並べの必勝アレンジメント
三目並べの必勝アレンジメント

そして最終的には、勝利の配置がないまま引き分けでボードが埋められます。三目並べのやり方が理解できたと思います。

さあ、遊びの時間です。ゲームプレイを完全に理解するには、 ここにアクセスしてプレイしてください。すでに取得している場合はそのままにしておきます。

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

アルゴリズム

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

  • 2 次元配列を使用してボードを作成し、各要素を空として初期化します。
    • 任意の記号を使用して空を表すことができます。ここではハイフンを使用します。 '-'
  • ボードが埋まっているかどうかを確認する関数を作成します。
    • ボードを反復処理し、ボードに空の記号が含まれている場合はfalseを返し、そうでない場合は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
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

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

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

プロジェクトに基づいて自由に構造を調整し、改善してください。コードの構造には制限がありません。

最後の言葉

万歳! 😎 ゲームを完全にゼロから作成しました。それは私たちが毎日プレイする視覚的なゲームの1つではありません。ただし、ロジックを記述し、コード内のきれいな構造を維持するのに役立ちます。このような興味深いゲームを作成するには、同様のガイドラインに従ってください。子供の頃を数年遡れば、似たようなゲームを見つけることができます。

コーディングを楽しんでください! 👩‍💻

次に、Python のunittest モジュールを使用して数字当てゲームと単体テストを作成する方法を調べます。

「 Python で三目並べゲームを作成するには?」についてわかりやすく解説!絶対に観るべきベスト2動画

最強の三目並べAIをゼロから作る(1/5)
【見流し/Javaプログラミング】三目並べを作成しましょう