파이썬으로 시작하는 게임 개발의 세계 🐍🎮
안녕하세요! Python Game Dev 블로그의 네 번째 포스팅입니다. 이전에는 숫자 맞추기 게임, 퀴즈 게임, 그리고 행맨 게임을 만들어보았는데요, 오늘은 전 세계적으로 유명한 보드 게임인 틱택토(Tic-Tac-Toe) 게임을 만들어보겠습니다.
오늘의 게임: 틱택토 게임 ⭕❌
틱택토는 두 명의 플레이어가 번갈아가며 3x3 그리드에 각자의 기호(O 또는 X)를 놓는 간단한 게임입니다. 가로, 세로, 또는 대각선으로 자신의 기호를 세 개 연속으로 놓는 플레이어가 승리합니다. 이번 포스팅에서는 사용자가 컴퓨터와 대결할 수 있는 틱택토 게임을 만들어보겠습니다.
게임의 규칙 📜
- 게임은 3x3 그리드에서 진행됩니다.
- 플레이어는 'X'를, 컴퓨터는 'O'를 사용합니다.
- 플레이어와 컴퓨터가 번갈아가며 빈 칸에 자신의 기호를 놓습니다.
- 가로, 세로, 또는 대각선으로 같은 기호 세 개가 연속으로 놓이면 해당 플레이어가 승리합니다.
- 그리드가 가득 차도 승자가 없으면 무승부입니다.
전체 코드 💻
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):
"""컴퓨터의 수를 결정하는 함수입니다."""
# 다양한 전략 구현
- 승리 가능한 위치 확인
- 플레이어 승리 차단
- 중앙 위치 선호
- 코너 위치 선호
- 무작위 선택
5. 게임 메인 함수
def play_tictactoe():
"""틱택토 게임의 메인 함수입니다."""
# 게임 로직
게임의 초기화, 플레이어 및 컴퓨터의 턴 관리, 승패 및 무승부 확인 등 게임의 전체 흐름을 관리합니다.
게임 실행 방법 🚀
- 위의 코드를 복사하여 텍스트 에디터에 붙여넣기
- 파일을 tictactoe.py와 같은 이름으로 저장
- 파이썬이 설치된 환경에서 터미널(명령 프롬프트)을 열고 파일을 저장한 디렉토리로 이동
- python tictactoe.py 명령어를 입력하여 게임 실행
확장 가능성 🌱
이 틱택토 게임을 다음과 같은 방향으로 확장해볼 수 있습니다:
- 난이도 설정 추가
- 초급: 무작위 수 선택
- 중급: 현재 구현된 수준
- 고급: 미니맥스 알고리즘 적용
- 두 플레이어 모드 추가
- 컴퓨터 대신 다른 사용자와 번갈아가며 플레이
- 더 큰 게임 보드
- 4x4 또는 5x5 그리드로 확장
- 승리 조건 수정 (예: 4개 또는 5개 연속)
- 그래픽 인터페이스 추가
- pygame을 활용하여 GUI 버전 개발
- 미니맥스 알고리즘 구현
- 더 강력한 AI를 위한 미니맥스 알고리즘 적용
- 알파-베타 가지치기로 효율성 개선
게임에서 사용된 프로그래밍 개념 📚
이번 게임을 통해 다음과 같은 파이썬 개념들을 활용해보았습니다:
- 2차원 데이터 표현
- 1차원 리스트로 2차원 그리드 표현하기
- 함수 분리와 모듈화
- 다양한 기능을 함수로 분리하여 코드 가독성 향상
- 알고리즘 설계
- 승리 조건 검사 알고리즘
- 컴퓨터 AI 알고리즘
- 상태 관리
- 게임 보드의 상태를 관리하고 업데이트
- 사용자 입력 검증
- 유효하지 않은 입력 처리
- 게임 루프 설계
- 턴 기반 게임 루프 구현
알고리즘 설명 🧮
틱택토 게임의 핵심 알고리즘들을 살펴보겠습니다:
승리 조건 검사 알고리즘
승리 조건은 가로, 세로, 대각선으로 같은 기호가 3개 연속되는 경우입니다:
- 가로 행 확인: 인덱스 (0,1,2), (3,4,5), (6,7,8)
- 세로 열 확인: 인덱스 (0,3,6), (1,4,7), (2,5,8)
- 대각선 확인: 인덱스 (0,4,8), (2,4,6)
컴퓨터 AI 알고리즘
컴퓨터의 수를 결정하는 알고리즘은 다음 우선순위로 작동합니다:
- 이길 수 있는 수가 있으면 그 위치 선택
- 플레이어가 이길 수 있는 위치 차단
- 중앙(5번 위치) 선택 (전략적으로 유리)
- 코너 위치(1, 3, 7, 9번) 선택
- 나머지 위치 중 무작위 선택
다음 포스팅 예고 🔮
다음 포스팅에서는 "스네이크 게임(Snake Game)"을 만들어 볼 예정입니다. 키보드 입력을 통한 실시간 게임 제어와 그리드 기반 움직임 처리에 대해 배워보겠습니다.
텍스트 기반 게임 몇 가지를 더 소개한 후, pygame을 활용한 그래픽 게임 시리즈로 발전해 나갈 계획입니다. 계속 지켜봐 주세요! 궁금한 점이나 제안사항이 있으시면 댓글로 남겨주세요. 행복한 코딩 되세요! 🐍✨
'파이썬 기초문법 > 파이썬 게임 만들기' 카테고리의 다른 글
파이썬 게임 만들기 - 브레이크아웃 게임 🧱🏓 (1) | 2025.03.08 |
---|---|
파이썬 게임 만들기 - 스네이크 게임 🐍🍎 (0) | 2025.03.08 |
파이썬 게임 만들기 - 행맨 게임 👨🎨 (2) | 2025.03.08 |
파이썬 게임 만들기 - 퀴즈 게임 🧠 (2) | 2025.03.08 |
파이썬 게임 만들기 - 숫자 맞추기 게임 🎯 (0) | 2025.03.07 |