79  틱택토 (Tic Tac Toe)

가장 단순하면서도 재미있는 고전 게임인 틱택토(Tic Tac Toe)를 만들어 봅시다. 명령줄 인터페이스(CLI) 앱부터 시작하여, 화려한 그래픽을 갖춘 버전까지 확장할 수 있습니다. 보너스 점수를 위해 사용자가 직접 X나 O를 그리면 기계가 이를 자동으로 인식하여 수를 두는 창의적인 기능을 구현해 보세요.

이 프로젝트는 2차원 격자판 위에서의 게임 로직(X/O 배치, 승리 판정)과 사용자 입력을 처리하는 방법을 익히기에 아주 좋은 과제입니다. 특히 최근 틱택토와 빙고(Bingo)를 결합한 새로운 게임 방식을 직접 설계해 보세요.

79.1 주요 개발 포인트

  • 격자판 기반 게임 로직: 3x3 격자판을 데이터 구조(예: 리스트)로 관리하고, X와 O를 번갈아 배치하는 턴 시스템을 구축합니다.
  • 승리 조건 판별 (Victory Check): 가로, 세로, 대각선 방향으로 같은 문자가 3개 연속으로 놓였는지 확인합니다.
  • 사용자 인터페이스 (GUI): 마우스 클릭으로 칸을 선택하거나, 터치 스크린에서 직접 X/O를 그리는 UI를 제작합니다.
  • 이미지 인식 연동 (Optional): OpenCV 등을 활용하여 사용자가 손으로 그린 문자를 디지털 데이터로 변환하여 게임에 반영합니다.
  • 로컬 멀티플레이어: 한 대의 컴퓨터나 모바일 기기에서 두 사람이 번갈아 가며 대결하는 기능을 구현합니다.

79.2 Python 구현 예시 (CLI 기반 간단한 틱택토 게임 루프)

def print_board(board):
    """
    현재 3x3 보드 상태를 보기 좋게 출력합니다.
    """
    print("\n--- 틱택토 보드 ---")
    for row in board:
        print(" | ".join(row))
        print("-" * 10)

def check_winner(board):
    """
    현재 보드에서 승리자가 있는지 확인합니다.
    """
    # 가로, 세로, 대각선 승리 조건
    for row in board:
        if row[0] == row[1] == row[2] != ' ': return row[0]
    for col in range(3):
        if board[0][col] == board[1][col] == board[2][col] != ' ': return board[0][col]
    if board[0][0] == board[1][1] == board[2][2] != ' ': return board[0][0]
    if board[0][2] == board[1][1] == board[2][0] != ' ': return board[0][2]
    
    return None

if __name__ == "__main__":
    # 빈 보드 생성
    board = [[' ' for _ in range(3)] for _ in range(3)]
    current_player = 'X'
    
    print("틱택토 게임을 시작합니다!")
    
    # 5번의 턴 시뮬레이션
    for turn in range(5):
        print_board(board)
        # 실제 구현 시 사용자로부터 입력을 받음 (예: 1, 1)
        # r, c = map(int, input(f"{current_player}님, 위치 선택 (행 열): ").split())
        r, c = turn % 3, (turn * 2) % 3 # 가상의 자동 입력
        
        if board[r][c] == ' ':
            board[r][c] = current_player
            winner = check_winner(board)
            if winner:
                print_board(board)
                print(f"축하합니다! {winner}님이 승리하셨습니다.")
                break
            current_player = 'O' if current_player == 'X' else 'X'
        else:
            print("이미 선택된 자리입니다. 다시 시도하세요.")