def print_board(board):
    for row in board:
        print(" | ".join(row))
        print("-" * 9)

def check_winner(board):
    # Check rows, columns, and diagonals
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2] != " ": return board[i][0]
        if board[0][i] == board[1][i] == board[2][i] != " ": return board[0][i]
    
    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

def play_game():
    board = [[" " for _ in range(3)] for _ in range(3)]
    current_player = "X"
    
    for turn in range(9):
        print_board(board)
        print(f"Player {current_player}'s turn.")
        
        try:
            row = int(input("Enter row (0-2): "))
            col = int(input("Enter col (0-2): "))
            
            if board[row][col] != " ":
                print("Spot taken! Try again.")
                continue
        except (ValueError, IndexError):
            print("Invalid input. Enter numbers between 0 and 2.")
            continue

        board[row][col] = current_player
        winner = check_winner(board)
        
        if winner:
            print_board(board)
            print(f"Congratulations! Player {winner} wins!")
            return

        current_player = "O" if current_player == "X" else "X"

    print_board(board)
    print("It's a tie!")

play_game()