매일 업데이트
2022-11-13 00:32 8 min

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

파이썬으로 만드는 간단한 틱택토 게임

파이썬을 사용하여 기본적인 틱택토 게임을 만드는 과정을 살펴보겠습니다. 이 과정을 통해 게임 로직을 설계하고 코드를 체계화하는 방법을 이해하는 데 도움이 될 것입니다.

게임은 인간에게 즐거움을 주는 중요한 요소 중 하나입니다. 다양한 플랫폼에서 다양한 종류의 게임을 즐길 수 있습니다. 이번에는 복잡한 게임을 만드는 대신, 파이썬을 이용하여 간단한 CLI 기반 틱택토 게임을 구현해 볼 것입니다.

만약 틱택토 게임에 익숙하지 않다면, 여기에서 시각적인 자료를 통해 게임 방식을 이해할 수 있습니다. 하지만 혹시 이해가 안 되더라도 걱정하지 마세요. 저희가 함께 알아볼 것입니다.

틱택토 게임 소개

이 튜토리얼은 크게 세 부분으로 구성되어 있습니다. 첫 번째 부분에서는 틱택토 게임의 규칙과 플레이 방법을 설명합니다. 두 번째 부분에서는 게임 로직을 구현하기 위한 알고리즘을 살펴봅니다. 마지막으로, 실제 파이썬 코드와 코드에 대한 자세한 설명을 제공합니다.

만약 틱택토 게임 방법을 이미 알고 있다면, 첫 번째 섹션은 건너뛰어도 괜찮습니다.

그럼, 바로 첫 번째 섹션으로 들어가 보겠습니다.

틱택토 게임 방법

틱택토는 두 명의 플레이어가 번갈아 가며 진행하는 게임입니다. 각 플레이어는 고유한 기호(일반적으로 'X'와 'O')를 사용하며, 3x3 크기의 격자판에서 진행됩니다. 플레이어들은 자신의 기호를 번갈아 가며 빈 칸에 배치합니다.

틱택토 보드를 시각적으로 보여드리겠습니다.

틱택토 게임 보드

게임 진행 방식은 다음과 같습니다.

  • 한 명의 플레이어가 빈 칸 중 하나에 자신의 기호를 놓습니다.
  • 다음으로, 다른 플레이어가 사용 가능한 빈 칸에 자신의 기호를 놓습니다.
  • 플레이어의 목표는 자신의 기호를 가로, 세로, 또는 대각선으로 일렬로 만드는 것입니다.
  • 승자가 결정되거나, 모든 칸이 채워져 무승부로 게임이 끝날 때까지 게임은 계속됩니다.

이제 몇 가지 게임 플레이 예시를 시각적으로 살펴봅시다.

위의 예시에서는 'X' 플레이어가 승리했습니다. 'X' 기호가 대각선으로 일렬로 배치되었기 때문입니다.

틱택토에서 승리할 수 있는 패턴은 총 8가지입니다. 이제 8가지 승리 패턴을 모두 살펴보겠습니다.

마지막으로, 모든 칸이 채워졌지만 승자가 없는 경우는 무승부가 됩니다. 틱택토 게임의 규칙을 이해하셨기를 바랍니다.

이제 직접 틱택토 게임을 즐겨보세요. 여기에서 게임을 플레이하면서 규칙을 완전히 이해할 수 있습니다. 이미 규칙을 알고 있다면 다음 단계로 넘어가겠습니다.

다음으로, 알고리즘 섹션으로 이동합니다.

게임 알고리즘

이제 코드를 작성하기 위한 알고리즘을 설명하겠습니다. 이 알고리즘은 선택한 프로그래밍 언어로 코드를 작성하는 데 도움이 될 것입니다. 어떻게 진행되는지 살펴봅시다.

  • 2차원 배열을 사용하여 게임 보드를 만들고, 각 요소를 빈칸으로 초기화합니다.
    • 빈칸을 나타내는 기호는 자유롭게 선택할 수 있습니다. 여기서는 하이픈('-')을 사용하겠습니다.
  • 보드가 완전히 채워졌는지 확인하는 함수를 작성합니다.
    • 보드를 순회하며 빈칸 기호가 있는지 확인합니다. 빈칸이 있으면 false를 반환하고, 없으면 true를 반환합니다.
  • 플레이어가 승리했는지 확인하는 함수를 작성합니다.
    • 이전 섹션에서 설명한 모든 승리 조건을 확인합니다.
    • 가로, 세로, 대각선 방향으로 승리 조건이 있는지 확인합니다.
  • 게임을 진행하는 동안 사용자에게 보드를 보여주는 함수를 작성합니다.
  • 게임을 시작하는 함수를 작성합니다.
    • 무작위로 첫 번째 플레이어를 선택합니다.
    • 게임이 종료될 때까지(승리 또는 무승부) 무한 루프를 실행합니다.
      • 사용자에게 현재 보드를 보여줍니다.
      • 사용자로부터 행과 열 번호를 입력받습니다.
      • 해당 위치에 현재 플레이어의 기호를 배치합니다.
      • 현재 플레이어가 승리했는지 확인합니다.
      • 현재 플레이어가 승리했다면 승리 메시지를 출력하고 루프를 종료합니다.
      • 만약 승리하지 못했다면, 보드가 모두 채워졌는지 확인합니다.
      • 보드가 모두 채워졌다면 무승부 메시지를 출력하고 루프를 종료합니다.
    • 마지막으로 게임 종료 후 최종 보드를 보여줍니다.

어떤 일이 일어나고 있는지 시각화할 수 있기를 바랍니다. 완전히 이해하지 못하더라도 걱정하지 마세요. 코드를 보면 더 명확해질 것입니다.

이제 코드를 직접 작성해 보겠습니다. PC에 파이썬이 설치되어 있다고 가정합니다.

코드

아래 코드를 살펴보겠습니다.

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):
        n = len(self.board)

        # 가로줄 확인
        for i in range(n):
            win = True
            for j in range(n):
                if self.board[i][j] != player:
                    win = False
                    break
            if win:
                return True

        # 세로줄 확인
        for i in range(n):
            win = True
            for j in range(n):
                if self.board[j][i] != player:
                    win = False
                    break
            if win:
                return True

        # 대각선 확인
        win = True
        for i in range(n):
            if self.board[i][i] != player:
                win = False
                break
        if win:
            return True

        win = True
        for i in range(n):
            if self.board[i][n - 1 - i] != player:
                win = False
                break
        if win:
            return True
        return False

    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()

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

            self.fix_spot(row - 1, col - 1, player)

            if self.is_player_win(player):
                print(f"Player {player} wins the game!")
                break

            if self.is_board_filled():
                print("Match Draw!")
                break

            player = self.swap_player_turn(player)
        print()
        self.show_board()


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

코드 구조를 이해하는 데 도움이 되는 몇 가지 중요한 사항입니다.

  • 모든 메서드를 클래스 내부에 정의하여 재사용 가능한 모듈 형태로 만들었습니다.
  • 각 작업 별로 세분화된 함수를 정의하여 코드 유지보수를 용이하게 했습니다.
  • 이러한 접근 방식은 게임을 개선하거나 변경해야 할 경우 앱을 쉽게 업데이트하는 데 도움이 됩니다.

프로젝트 요구 사항에 맞게 구조를 자유롭게 조정하고 개선할 수 있습니다. 코드 구조화에 대한 정답은 없습니다.

마지막으로

축하합니다! 😎 당신은 처음부터 틱택토 게임을 만들었습니다. 매일 우리가 플레이하는 시각적인 게임은 아니지만, 이 경험은 게임 로직을 설계하고 코드를 깔끔하게 구조화하는 데 도움이 될 것입니다. 유사한 지침을 따라 더 많은 흥미로운 게임을 만들어보세요. 어린 시절로 돌아가 보면 이와 비슷한 게임들을 많이 찾을 수 있을 겁니다.

즐거운 코딩하세요! 👩‍💻

다음으로 파이썬 unittest 모듈을 사용하여 숫자 추측 게임을 만들고 단위 테스트를 수행하는 방법을 살펴보겠습니다.

이 기사가 재미있으셨나요? 여러분의 생각을 공유해주세요!

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.