파이썬 기초문법/파이썬 게임 만들기

파이썬 게임 만들기 - 틱택토 게임 ⭕❌

Family in August 2025. 3. 8. 10:48
반응형

파이썬으로 시작하는 게임 개발의 세계 🐍🎮

안녕하세요! Python Game Dev 블로그의 네 번째 포스팅입니다. 이전에는 숫자 맞추기 게임, 퀴즈 게임, 그리고 행맨 게임을 만들어보았는데요, 오늘은 전 세계적으로 유명한 보드 게임인 틱택토(Tic-Tac-Toe) 게임을 만들어보겠습니다.

오늘의 게임: 틱택토 게임 ⭕❌

틱택토는 두 명의 플레이어가 번갈아가며 3x3 그리드에 각자의 기호(O 또는 X)를 놓는 간단한 게임입니다. 가로, 세로, 또는 대각선으로 자신의 기호를 세 개 연속으로 놓는 플레이어가 승리합니다. 이번 포스팅에서는 사용자가 컴퓨터와 대결할 수 있는 틱택토 게임을 만들어보겠습니다.

게임의 규칙 📜

  1. 게임은 3x3 그리드에서 진행됩니다.
  2. 플레이어는 'X'를, 컴퓨터는 'O'를 사용합니다.
  3. 플레이어와 컴퓨터가 번갈아가며 빈 칸에 자신의 기호를 놓습니다.
  4. 가로, 세로, 또는 대각선으로 같은 기호 세 개가 연속으로 놓이면 해당 플레이어가 승리합니다.
  5. 그리드가 가득 차도 승자가 없으면 무승부입니다.

전체 코드 💻

import random
import time
import os

def clear_screen():
    """화면을 깨끗하게 지우는 함수입니다."""
    os.system('cls' if os.name == 'nt' else 'clear')

def print_board(board):
    """게임 보드를 출력하는 함수입니다."""
    clear_screen()
    print("\n")
    print(f" {board[0]} | {board[1]} | {board[2]} ")
    print("---+---+---")
    print(f" {board[3]} | {board[4]} | {board[5]} ")
    print("---+---+---")
    print(f" {board[6]} | {board[7]} | {board[8]} ")
    print("\n")

def check_winner(board, player):
    """승리 조건을 확인하는 함수입니다."""
    # 가로 확인
    for i in range(0, 9, 3):
        if board[i] == board[i+1] == board[i+2] == player:
            return True
    
    # 세로 확인
    for i in range(3):
        if board[i] == board[i+3] == board[i+6] == player:
            return True
    
    # 대각선 확인
    if board[0] == board[4] == board[8] == player:
        return True
    if board[2] == board[4] == board[6] == player:
        return True
    
    return False

def is_board_full(board):
    """보드가 가득 찼는지 확인하는 함수입니다."""
    return " " not in board

def get_player_move(board):
    """플레이어의 수를 입력받는 함수입니다."""
    while True:
        try:
            move = int(input("원하는 위치를 선택하세요 (1-9): ")) - 1
            if move < 0 or move > 8:
                print("유효한 범위가 아닙니다. 1부터 9 사이의 숫자를 입력하세요.")
                continue
            
            if board[move] != " ":
                print("이미 선택된 위치입니다. 다른 위치를 선택하세요.")
                continue
                
            return move
        except ValueError:
            print("유효한 숫자를 입력하세요.")

def get_computer_move(board):
    """컴퓨터의 수를 결정하는 함수입니다."""
    # 이길 수 있는 위치 확인
    for i in range(9):
        if board[i] == " ":
            board_copy = board.copy()
            board_copy[i] = "O"
            if check_winner(board_copy, "O"):
                return i
    
    # 플레이어 승리 차단
    for i in range(9):
        if board[i] == " ":
            board_copy = board.copy()
            board_copy[i] = "X"
            if check_winner(board_copy, "X"):
                return i
    
    # 중앙 선호
    if board[4] == " ":
        return 4
    
    # 코너 선호
    corners = [0, 2, 6, 8]
    available_corners = [corner for corner in corners if board[corner] == " "]
    if available_corners:
        return random.choice(available_corners)
    
    # 나머지 위치 중 무작위 선택
    available_spaces = [i for i in range(9) if board[i] == " "]
    return random.choice(available_spaces)

def play_tictactoe():
    """틱택토 게임의 메인 함수입니다."""
    # 게임 보드 초기화 (1-9 숫자로 위치 표시)
    display_board = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
    print_board(display_board)
    
    # 실제 게임 보드 초기화 (공백으로)
    board = [" " for _ in range(9)]
    
    print("="*50)
    print("           틱택토 게임에 오신 것을 환영합니다!           ")
    print("="*50)
    print("당신은 X, 컴퓨터는 O입니다.")
    print("번호를 입력하여 원하는 위치에 표시하세요.\n")
    time.sleep(2)
    
    print_board(board)
    
    # 게임 루프
    while True:
        # 플레이어 차례
        print("당신의 차례입니다.")
        player_move = get_player_move(board)
        board[player_move] = "X"
        print_board(board)
        
        # 플레이어 승리 확인
        if check_winner(board, "X"):
            print("축하합니다! 당신이 이겼습니다! 🎉")
            break
        
        # 무승부 확인
        if is_board_full(board):
            print("무승부입니다! 😐")
            break
        
        # 컴퓨터 차례
        print("컴퓨터의 차례입니다...")
        time.sleep(1)  # 컴퓨터가 생각하는 것처럼 약간의 지연 추가
        
        computer_move = get_computer_move(board)
        board[computer_move] = "O"
        print_board(board)
        
        # 컴퓨터 승리 확인
        if check_winner(board, "O"):
            print("컴퓨터가 이겼습니다! 😔")
            break
        
        # 무승부 확인
        if is_board_full(board):
            print("무승부입니다! 😐")
            break

def main():
    """게임을 시작하고 재시작하는 함수입니다."""
    while True:
        play_tictactoe()
        
        # 다시 플레이할지 확인
        play_again = input("다시 플레이하시겠습니까? (y/n): ")
        if play_again.lower() != 'y':
            print("틱택토 게임을 종료합니다. 이용해 주셔서 감사합니다!")
            break

# 게임 시작
if __name__ == "__main__":
    main()

게임 화면

게임 화면

실행 시 콘솔 화면에서는 아래와 같은 보드가 표시됩니다:

 
1 | 2 | 3 
---+---+---
 4 | 5 | 6 
---+---+---
 7 | 8 | 9

게임 진행 중에는 다음과 같이 보드가 업데이트됩니다:

 
X |   | O 
---+---+---
   | X |   
---+---+---
 O |   | X

코드 설명 📝

1. 필요한 모듈 가져오기

import random
import time
import os
  • random 모듈: 컴퓨터의 무작위 수 선택을 위해 사용합니다.
  • time 모듈: 게임에 지연 효과를 주기 위해 사용합니다.
  • os 모듈: 화면을 지우는 기능을 위해 사용합니다.

2. 게임 보드 출력 함수

def print_board(board):
    """게임 보드를 출력하는 함수입니다."""
    clear_screen()
    print("\n")
    print(f" {board[0]} | {board[1]} | {board[2]} ")
    print("---+---+---")
    print(f" {board[3]} | {board[4]} | {board[5]} ")
    print("---+---+---")
    print(f" {board[6]} | {board[7]} | {board[8]} ")
    print("\n")

3x3 그리드를 ASCII 문자로 표현하여 현재 게임 상태를 보여줍니다.

3. 승리 조건 검사 함수

def check_winner(board, player):
    """승리 조건을 확인하는 함수입니다."""
    # 가로, 세로, 대각선 확인 로직

특정 플레이어('X' 또는 'O')가 가로, 세로, 대각선으로 세 개의 기호를 연속으로 놓았는지 확인합니다.

4. 인공지능(AI) 로직

 
def get_computer_move(board):
    """컴퓨터의 수를 결정하는 함수입니다."""
    # 다양한 전략 구현
  1. 승리 가능한 위치 확인
  2. 플레이어 승리 차단
  3. 중앙 위치 선호
  4. 코너 위치 선호
  5. 무작위 선택

5. 게임 메인 함수

def play_tictactoe():
    """틱택토 게임의 메인 함수입니다."""
    # 게임 로직

게임의 초기화, 플레이어 및 컴퓨터의 턴 관리, 승패 및 무승부 확인 등 게임의 전체 흐름을 관리합니다.

게임 실행 방법 🚀

  1. 위의 코드를 복사하여 텍스트 에디터에 붙여넣기
  2. 파일을 tictactoe.py와 같은 이름으로 저장
  3. 파이썬이 설치된 환경에서 터미널(명령 프롬프트)을 열고 파일을 저장한 디렉토리로 이동
  4. python tictactoe.py 명령어를 입력하여 게임 실행

확장 가능성 🌱

이 틱택토 게임을 다음과 같은 방향으로 확장해볼 수 있습니다:

  1. 난이도 설정 추가
    • 초급: 무작위 수 선택
    • 중급: 현재 구현된 수준
    • 고급: 미니맥스 알고리즘 적용
  2. 두 플레이어 모드 추가
    • 컴퓨터 대신 다른 사용자와 번갈아가며 플레이
  3. 더 큰 게임 보드
    • 4x4 또는 5x5 그리드로 확장
    • 승리 조건 수정 (예: 4개 또는 5개 연속)
  4. 그래픽 인터페이스 추가
    • pygame을 활용하여 GUI 버전 개발
  5. 미니맥스 알고리즘 구현
    • 더 강력한 AI를 위한 미니맥스 알고리즘 적용
    • 알파-베타 가지치기로 효율성 개선

게임에서 사용된 프로그래밍 개념 📚

이번 게임을 통해 다음과 같은 파이썬 개념들을 활용해보았습니다:

  1. 2차원 데이터 표현
    • 1차원 리스트로 2차원 그리드 표현하기
  2. 함수 분리와 모듈화
    • 다양한 기능을 함수로 분리하여 코드 가독성 향상
  3. 알고리즘 설계
    • 승리 조건 검사 알고리즘
    • 컴퓨터 AI 알고리즘
  4. 상태 관리
    • 게임 보드의 상태를 관리하고 업데이트
  5. 사용자 입력 검증
    • 유효하지 않은 입력 처리
  6. 게임 루프 설계
    • 턴 기반 게임 루프 구현

알고리즘 설명 🧮

틱택토 게임의 핵심 알고리즘들을 살펴보겠습니다:

승리 조건 검사 알고리즘

승리 조건은 가로, 세로, 대각선으로 같은 기호가 3개 연속되는 경우입니다:

  1. 가로 행 확인: 인덱스 (0,1,2), (3,4,5), (6,7,8)
  2. 세로 열 확인: 인덱스 (0,3,6), (1,4,7), (2,5,8)
  3. 대각선 확인: 인덱스 (0,4,8), (2,4,6)

컴퓨터 AI 알고리즘

컴퓨터의 수를 결정하는 알고리즘은 다음 우선순위로 작동합니다:

  1. 이길 수 있는 수가 있으면 그 위치 선택
  2. 플레이어가 이길 수 있는 위치 차단
  3. 중앙(5번 위치) 선택 (전략적으로 유리)
  4. 코너 위치(1, 3, 7, 9번) 선택
  5. 나머지 위치 중 무작위 선택

다음 포스팅 예고 🔮

다음 포스팅에서는 "스네이크 게임(Snake Game)"을 만들어 볼 예정입니다. 키보드 입력을 통한 실시간 게임 제어와 그리드 기반 움직임 처리에 대해 배워보겠습니다.

텍스트 기반 게임 몇 가지를 더 소개한 후, pygame을 활용한 그래픽 게임 시리즈로 발전해 나갈 계획입니다. 계속 지켜봐 주세요! 궁금한 점이나 제안사항이 있으시면 댓글로 남겨주세요. 행복한 코딩 되세요! 🐍✨

반응형