Python에서 Tic-Tac-Toe 게임을 만드는 방법은 무엇입니까?

Python으로 간단한 Tic Tac Toe 게임을 만들어 봅시다. 게임 로직을 구축하고 코드를 구성하는 방법을 이해하는 데 도움이 됩니다.

게임은 인간이 가지고 있는 오락 중 하나입니다. 우리는 웹, 모바일, 데스크톱 등에서 다양한 유형의 게임을 찾을 수 있습니다. 우리는 지금 그 무거운 게임 중 하나를 만들기 위해 여기에 있는 것이 아닙니다. Python을 사용하여 CLI tic-tac-toe 게임을 만들 것입니다.

Tic Tac Toe에 익숙하지 않다면 시각적으로 재생하십시오. 여기 이해하다. 이해하지 못하더라도 걱정하지 마십시오. 우리는 그것을 볼 것입니다.

박하 사탕 발가락

튜토리얼은 세 개의 다른 섹션으로 나뉩니다. 첫 번째 섹션에서는 틱택토 게임을 하는 방법을 알게 됩니다. 그런 다음 게임 논리를 만드는 데 도움이 되는 알고리즘을 볼 수 있습니다. 마지막으로 구조화된 코드와 그에 대한 설명을 살펴보겠습니다.

Tic Tac Toe 게임 방법을 이미 알고 있다면 첫 번째 섹션을 건너뛸 수 있습니다.

이제 더 이상 고민하지 않고 첫 번째 섹션으로 들어가 보겠습니다.

박하 사탕 발가락 재생

한 게임에는 두 명의 플레이어가 있습니다. 두 개의 기호는 각 플레이어를 나타냅니다. 게임에서 사용되는 일반적인 기호는 X와 O입니다. 마지막으로 9개의 상자가 있는 보드가 있습니다.

틱택토 보드를 시각적으로 보십시오.

박하 사탕 발가락 보드

게임 플레이는 다음과 같습니다.

  • 먼저 한 명의 사용자가 사용 가능한 빈 상자 중 하나에 서명을 배치합니다.
  • 다음으로 두 번째 사용자는 사용 가능한 빈 상자 중 하나에 서명을 넣습니다.
  • 플레이어의 목표는 각각의 기호를 완전히 행 방향이나 열 방향 또는 대각선으로 배치하는 것입니다.
  • 게임은 플레이어가 게임에서 이기거나 이기는 경기 없이 모든 상자를 채워 무승부로 끝날 때까지 계속됩니다.

시각적으로 몇 가지 게임 플레이를 보자.

박하 사탕 발가락 승리 게임 플레이

  State of Survival 기프트 코드: 지금 사용

위의 게임 플레이에서 플레이어 X가 게임에서 승리합니다. 모든 상자는 대각선으로 X 기호로 채워집니다. 따라서 해당 플레이어가 게임에서 승리합니다.

같은 기호를 배열하고 게임에서 승리하는 방법은 총 8가지가 있습니다. 게임에서 승리할 수 있는 8가지 배열을 모두 살펴보겠습니다.

박하 사탕 발가락 승리 배열

그리고 마지막으로 무승부는 승패 없이 보드를 채웁니다. 이제 Tic Tac Toe 사용법을 이해하시기 바랍니다.

자, 이제 당신을 위한 놀이 시간입니다. 당신은 갈 수 있습니다 여기 게임 플레이를 완전히 이해하기 위해 재생합니다. 이미 받으셨다면 남겨두세요.

이제 알고리즘 섹션을 이동할 시간입니다.

연산

이제 코드를 작성하는 알고리즘에 대해 논의할 것입니다. 이 알고리즘은 선택한 프로그래밍 언어로 코드를 작성하는 데 도움이 됩니다. 어떻게 되었는지 봅시다.

  • 2차원 배열을 사용하여 보드를 만들고 각 요소를 공백으로 초기화합니다.
    • 원하는 기호를 사용하여 비어 있음을 나타낼 수 있습니다. 여기서는 하이픈을 사용하겠습니다. ‘-‘.
  • 보드가 채워졌는지 확인하는 함수를 작성하십시오.
    • 보드를 반복하고 보드에 빈 기호가 있으면 false를 반환하고 그렇지 않으면 true를 반환합니다.
  • 플레이어가 이겼는지 여부를 확인하는 함수를 작성하십시오.
    • 이전 섹션에서 논의한 모든 가능성을 확인해야 합니다.
    • 모든 행, 열 및 두 개의 대각선을 확인합니다.
  • 사용자가 플레이하는 동안 여러 번 보드를 보여주므로 보드를 표시하는 함수를 작성하십시오.
  • 게임을 시작하는 함수를 작성하십시오.
    • 무작위로 플레이어의 첫 번째 턴을 선택합니다.
    • 게임이 끝나면(승리 또는 무승부) 중단되는 무한 루프를 작성합니다.
      • 다음 이동을 위한 지점을 선택하기 위해 사용자에게 보드를 보여줍니다.
      • 사용자에게 행과 열 번호를 입력하도록 요청합니다.
      • 해당 선수 사인으로 자리를 업데이트하십시오.
      • 현재 플레이어가 게임에서 이겼는지 여부를 확인합니다.
      • 현재 플레이어가 게임에서 이기면 승리 메시지를 인쇄하고 무한 루프를 끊습니다.
      • 다음으로 보드가 채워졌는지 확인합니다.
      • 보드가 가득 차면 그리기 메시지를 인쇄하고 무한 루프를 끊습니다.
    • 마지막으로 사용자에게 보드의 최종 보기를 보여줍니다.

무슨 일이 일어나고 있는지 시각화할 수 있습니다. 완전히 이해하지 못하더라도 걱정하지 마십시오. 코드를 보면 더 명확해질 것입니다.

  Discord에서 전화번호 연결을 끊는 방법

이제 코드 섹션으로 이동해 보겠습니다. 코드를 시도하기 위해 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

코드의 구조를 이해하는 데 도움이 되는 몇 가지 주요 사항.

  • 우리는 클래스를 사용하여 모든 메서드를 한 곳에서 사용했습니다. 다른 코드에서도 쉽게 재사용 가능한 번들이 될 수 있습니다.
  • 다음으로, 작은 작업일지라도 각 책임에 대해 서로 다른 기능을 정의했습니다. 코드를 쉽게 유지하는 데 도움이 됩니다.
  • 위의 두 가지 접근 방식은 게임을 업데이트하려는 경우 앱을 쉽게 업데이트하는 데 도움이 됩니다.
  Linux에 Moka 아이콘 테마를 설치하는 방법

자유롭게 구조를 조정하고 프로젝트에 따라 개선하십시오. 코드를 구조화하는 것은 제한되지 않습니다.

마지막 단어

만세! 😎 당신은 완전히 처음부터 게임을 만들었습니다. 우리가 매일 하는 비주얼 게임 중 하나가 아닙니다. 그러나 논리를 작성하고 코드에서 깔끔한 구조를 유지하는 데 도움이 됩니다. 이와 같은 흥미로운 게임을 만들려면 유사한 지침을 따르십시오. 몇 년 어린 시절로 돌아가 보면 비슷한 게임을 찾을 수 있습니다.

행복한 코딩! 👩‍💻

다음으로 Python unittest 모듈을 사용하여 숫자 추측 게임 및 단위 테스트를 만드는 방법을 살펴봅니다.

기사를 재미있게 읽었습니까? 세상과 함께 나누는 건 어떨까요?