0
0 Комментариев
Данная программа, описанная в курсе по Python М. Доусона, демонстрирует работу функций и работает отлично, вот только не могу понять, как работает в частности функция computer_move(), а именно:
1) какова роль у цикла for в данной функции
2) для чего применяется после каждого из условий board[move] = EMPTY

ОС - Windows 10
IDE - PyCharm Community Edition 2019 x64

# крестики-нолики
# комп играет в крестики-нолики с пользователем
# 1. глобальные константы
X = \"X\"
O = \"O\"
EMPTY = \" \"
TIE = \"Ничья\"
NUM_SQUARES = 9
  def display_instruct():
    \"\"\"Выводит на экран инструкцию для игрока\"\"\"
    print(
        \"\"\"
        Добро пожаловать на ринг грандиознейших интеллектуальных состязаний всех времён!
        Твой мозг и мой процессор сойдутся в схватке за доской игры \"Крестики-нолики\".
        Чтобы сделать ход, введи число от 0 до 8. Числа одноначно соответствуют полям доски - так,
        как показано ниже:
        0 | 1 | 2
        ---------
        3 | 4 | 5
        ---------
        6 | 7 | 8
        Приготовься к бою, жалкий бестолковый человечишка! Вот-вот начнётся решающее сражение.\\n \"\"\"
    )
  # принимает текст вопроса и возвращает ответ
def ask_no_yes(question):
    \"\"\"Задаёт вопрос с ответом \"Да\" или \"Нет\".\"\"\"
    answer = None
    while answer not in (\"y\", \"n\"):
        answer = input(question).lower()
    return answer
  def ask_number(question, low, high):
    \"\"\"Просит ввести число из диапазона\"\"\"
    answer = None
    while answer not in range(low, high):
        answer = int(input(question))
    return answer
  def pieces():
    \"\"\"Определяет принадлежность первого хода.\"\"\"
    go_first = ask_no_yes(\"Хочешь оставить за собой первый ход? (y/n) \")
    if go_first == \"y\":
        print(\"Ну хорошо, даю тебе фору: играй крестиками. \")
        human = X
        computer = O
    else:
        print(\"Твоя удаль тебя погубит... буду начинать я. \")
        computer = X
        human = O
    return computer, human
  def new_board():
    \"\"\"Создаёт новую доску с пустыми полями.\"\"\"
    board = []
    for square in range(NUM_SQUARES):
        board.append(EMPTY)
    return board
  def display_board(board):
    \"\"\"Отображает новую доску на экране.\"\"\"
    print(\"\\n\\t\", board[0], \" | \", board[1], \" | \", board[2])
    print(\"\\t\", \"-------------\")
    print(\"\\t\", board[3], \" | \", board[4], \" | \", board[5])
    print(\"\\t\", \"-------------\")
    print(\"\\t\", board[6], \" | \", board[7], \" | \", board[8], \"\\n\")
  def legal_moves(board):
    \"\"\"Создаёт список доступных ходов.\"\"\"
    moves = []
    for square in range(NUM_SQUARES):
        if board[square] == EMPTY:
            moves.append(square)
    return moves
  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 None
  def human_move(board, human):
    \"\"\"Получает ход человека.\"\"\"
    legal = legal_moves(board)
    move = None
    while move not in legal:
        move = ask_number(\"Твой ход. Выбери одно из полей: \", 0, NUM_SQUARES)
        if move not in legal:
            print(\"Смешной человек! Ну выбери одно из свободных полей.\\n\")
    print(\"Okay...\")
    return move
  def computer_move(board, computer, human):
    \"\"\"Делает ход за компьютерного противника.\"\"\"
    # создадим копию (рабочую) доски, потому что функция будет изменять некоторые значения в списке
    board = board[:]
# поля от лучшего к худшему
    BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7)
    print(\"Я выбираю поле номер \", end=\" \")
    for move in legal_moves(board):
        board[move] = computer
# если следующим ходом может победить компьютер, выбираем этот ход
        if winner(board) == computer:
            print(move)
            return 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 congrats_winner(the_winner, human, computer):
    \"\"\"Поздравляет победителя игры.\"\"\"
    if the_winner != TIE:
        print(\"Три\", the_winner, \"в ряд!\")
    else:
        print(\"Ничья!\")
    if the_winner == computer:
        print(\"Как я и предсказывал, победа осталась за мной. \\n\"
              \"Вот ещё один довод в пользу того, что компьютеры превосходят людей решительно во всём!\")
    elif the_winner == human:
        print(\"О, нет, этого не может быть! Неужели ты как-то смог перехитрить меня, белковый? \\n\"
              \"Клянусь, я, компьютер, не допущу этого больше никогда!\")
    elif the_winner == TIE:
        print(\"Teбe несказанно повезло, дружок: ты сумел свести игру вничью. \\n\"
              \"Радуйся же сегодняшнему успеху! Завтра тебе уже не суждено его повторить. \")
  def main():
    display_instruct()
    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)
    congrats_winner(the_winner, computer, human)
  # запуск программы
main()
input(\"Для выхода из программы нажмите Enter\")

                                    
Добавить комментарий