# -*- coding: utf-8 -*-
# @Time : 2020/12/4 下午2:37
# @Author : Zhenghui Lyu
# @File : jingziqi.py
# @Software: PyCharm


X = 'X'  # 三种符号
O = '@'
EMPTY = ' '


def ask_yes_no(question):  # 询问玩家是否先走,question为提示字符串
    response = None
    while response not in ('y', 'n'):  # 如果输入不是y或n,再循环询问
        response = input(question).lower()
    return response  # y/n


def pieces():
    go_first = ask_yes_no('玩家你是否先走?(y/n)')
    if go_first == 'y':
        print('\n玩家你先走')
        human = X  # 先走为X
        computer = O
    else:
        print('\n电脑先走')
        human = O
        computer = X
    return computer, human  # 返回二者符号


def new_board():  # 创建空棋盘
    board = []
    for square in range(9):
        board.append(EMPTY)
    return board


def display_board(board):  # 显示带数字棋盘
    board2 = board[:]  # 创建副本
    for i in range(len(board)):
        if board[i] == EMPTY:
            board2[i] = i  # 在EMPTY位置填入数字
    print('\t', board2[0], '|', board2[1], '|', board2[2])
    print('\t', board2[3], '|', board2[4], '|', board2[5])
    print('\t', board2[6], '|', board2[7], '|', board2[8], '\n')


def legal_moves(board):  # 产生可以下棋位置的序列
    moves = []
    for square in range(9):
        if board[square] == EMPTY:
            moves.append(square)
    return moves


def ask_number(question, low, high):  # 如果输入不合法则循环判断0-8
    response = None
    while response not in range(low, high):
        response = int(input(question))
    return response


def human_move(board, human):  # 玩家走棋
    legal = legal_moves(board)
    move = None
    while move not in legal:  # 如果不合法
        move = ask_number('你走哪个位置?', 0, 9)
        if move not in legal:
            print('\n此位置已经有子')
    return move


def winner(board):
    WAYS_TO_WIN = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6))
    for row in WAYS_TO_WIN:
        if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner
    if EMPTY not in board:
        return 'TIE'  # 和棋
    return False


def computer_move(board, computer, human):
    board = board[:]  # 副本
    BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7)
    for move in legal_moves(board):
        board[move] = computer
        if winner(board) == computer:
            print('电脑下棋的位置...', move)
        board[move] = EMPTY
    for move in legal_moves(board):
        board[move] = human
        if winner(board) == human:
            print('电脑下棋的位置是...', move)
            return move
        board[move] = EMPTY
    for move in BEST_MOVES:
        if move in legal_moves(board):
            print('电脑下棋的位置是...', move)
            return move


def next_turn(turn):
    if turn == X:
        return O
    else:
        return X


def main():
    computer, human = pieces()
    turn = X
    board = new_board()
    display_board(board)
    while not winner(board):
        if turn == human:
            move = human_move(board, human)
            board[move] = human
        else:
            move = computer_move(board, computer, human)
            board[move] = computer
        display_board(board)
        turn = next_turn(turn)
    the_winner = winner(board)
    if the_winner == computer:
        print('电脑赢!\n')
    elif the_winner == human:
        print('玩家赢!\n')
    elif the_winner == 'TIE':
        print('和棋!\n')


if __name__ == '__main__':
    main()