파이썬으로 틱택토 게임 만들기: 단계별 코드 튜토리얼
틱택토(삼목)는 두 명이 즐기는 고전 게임으로, 파이썬 기초를 다지기에 훌륭한 프로젝트입니다. PyCharm 같은 IDE나 명령줄에서 바로 실행해 보세요.
틱택토 게임 규칙
- 보드: 3×3 빈 격자에서 시작 (본 튜토리얼은 N×N 확장 지원)
- 기호: 플레이어 1은 X, 플레이어 2는 O 사용
- 차례: 번갈아 가며 빈 칸에 자신의 기호 표시
- 승리: 가로, 세로, 대각선 중 한 줄을 모두 채우면 승
- 무승부: 모든 칸이 찼는데 승자가 없으면 무승부
필수 지식 및 준비물
- 파이썬 기초: 변수, 리스트, 반복문(
for, while), 조건문(if), 함수
- 파이썬 3.x 설치 및 에디터(VS Code, PyCharm 등)
- 별도 라이브러리 불필요 (표준 라이브러리만 사용)
알고리즘 설계
- 게임 보드 생성 (N×N 리스트)
- 사용자로부터 보드 크기 N 입력받기 (최소 3)
- 첫 플레이어 무작위 결정
- 플레이어 차례대로 빈 칸 선택 → 기호 배치
- 매 턴 승리/무승부 판정
- 게임 종료 시 결과 출력 및 재시작 여부 확인
전체 파이썬 코드
# Guru99 N-Dimensional Tic Tac Toe
# N×N 보드 지원, 입력 검증, 재시작 기능 포함
def get_input(prompt, cast=None, condition=None, error_msg=None):
"""안전한 사용자 입력 처리: 타입 변환, 조건 검사, 재시도"""
while True:
try:
val = cast(input(prompt)) if cast else input(prompt)
if condition is None or condition(val):
return val
except Exception:
pass
print(error_msg or "잘못된 입력입니다. 다시 시도하세요.")
def print_board(board):
"""보드 예쁘게 출력"""
print()
for row in board:
print(" ".join(row))
print()
def check_win(board):
"""승리 조건 검사: 행, 열, 양 대각선"""
n = len(board)
# 행 검사
for row in range(n):
if all(board[row][col] == board[row][0] != "_" for col in range(n)):
return True
# 열 검사
for col in range(n):
if all(board[row][col] == board[0][col] != "_" for row in range(n)):
return True
# 좌상단-우하단 대각선
if all(board[i][i] == board[0][0] != "_" for i in range(n)):
return True
# 우상단-좌하단 대각선
if all(board[i][n-1-i] == board[0][n-1] != "_" for i in range(n)):
return True
return False
def play():
print("=" * 40)
print("N-DIMENSIONAL TIC TAC TOE by Guru99")
print("=" * 40)
# 보드 크기 입력 (3 이상)
N = get_input(
prompt="보드 크기 N 입력 (3 이상): ",
cast=int,
condition=lambda x: x >= 3,
error_msg="3 이상의 정수를 입력하세요."
)
board = [['_'] * N for _ in range(N)]
used = 0
turn = 0 # 0: Player 1(X), 1: Player 2(O)
while True:
print_board(board)
# 좌표 입력 (행, 열)
pick = get_input(
prompt=f"Player {turn+1} ({'X' if turn == 0 else 'O'}) - 위치 입력 (행 열): ",
cast=lambda s: tuple(map(int, s.split())),
condition=lambda p: 0 <= p[0] < N and 0 <= p[1] < N and board[p[0]][p[1]] == "_",
error_msg=f"0~{N-1} 사이의 빈 칸 좌표를 '행 열' 형식으로 입력하세요."
)
# 기호 배치
board[pick[0]][pick[1]] = "X" if turn == 0 else "O"
used += 1
# 승리 판정
if check_win(board):
print_board(board)
print(f"🎉 Player {turn+1} 승리!")
break
# 무승부 판정
elif used == N * N:
print_board(board)
print("무승부입니다!")
break
# 턴 변경
turn = 1 - turn
# 재시작 여부
again = get_input(
prompt="다시 하시겠습니까? (y/n): ",
cast=str.lower,
condition=lambda a: a in ('y', 'n'),
error_msg="y 또는 n만 입력하세요."
)
if again == 'y':
play()
else:
print("게임을 종료합니다. 안녕히 가세요!")
if __name__ == '__main__':
play()
실행 예시 (3×3 보드)
========================
N-DIMENSIONAL TIC TAC TOE by Guru99
========================
보드 크기 N 입력 (3 이상): 3
_ _ _
_ _ _
_ _ _
Player 1 (X) - 위치 입력 (행 열): 1 1
_ _ _
_ X _
_ _ _
Player 2 (O) - 위치 입력 (행 열): 0 1
_ O _
_ X _
_ _ _
...
Player 1 (X) - 위치 입력 (행 열): 1 0
_ O O
X X X
_ _ _
🎉 Player 1 승리!
다시 하시겠습니까? (y/n):
코드 핵심 포인트 해설
1. 안전한 입력 처리 (get_input)
cast: 입력 문자열을 원하는 타입으로 변환 (int, lambda 등)
condition: 유효성 검사 함수 (범위, 중복 등)
- 예외 발생 시나 조건 불만족 시 에러 메시지 출력 후 재시도
2. 보드 출력 (print_board)
- 2차원 리스트를 행 단위로 순회하며
" ".join(row)로 공백 구분 출력
3. 승리 판정 (check_win)
- 행: 각 행의 모든 원소가 같고 빈칸(
_)이 아닌지 확인
- 열: 각 열에 대해 동일 검사
- 대각선: 인덱스
(i, i)와 (i, n-1-i) 검사
all()과 제너레이터 표현식으로 간결하게 구현
4. 게임 루프 (play)
while True 무한 루프로 턴 진행
turn = 1 - turn으로 0↔1 토글 (플레이어 교대)
- 재시작 시 함수 자기 호출 (
play())로 상태 초기화
확장 아이디어
- AI 상대 추가: 미니맥스(Minimax) 알고리즘 구현으로 컴퓨터 대전 가능
- GUI 버전:
tkinter나 pygame으로 그래픽 인터페이스 구현
- 점수 기록: 승/패/무 통계 저장 및 표시
- 네트워크 대전:
socket 모듈로 원격 플레이어와 대결
결론
- 틱택토는 파이썬 기초 문법(리스트, 반복문, 조건문, 함수)을 종합적으로 연습하기에 최적의 프로젝트입니다.
- 알고리즘을 먼저 설계하고 함수 단위로 쪼개 구현하면 복잡한 로직도 관리하기 쉽습니다.
- 입력 검증(
get_input) 같은 유틸리티 함수를 분리하면 코드 재사용성과 안정성이 높아집니다.
- 직접 실행해 보며 버그를 수정하고 기능을 확장해 보세요!