Guest User

Крестики-нолики

a guest
Sep 21st, 2015
2,293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.60 KB | None | 0 0
  1. # Крестики-нолики
  2. # Компьютер играет в крестики-нолики против пользователя
  3.  
  4. # глобальные константы
  5. X = "X"
  6. O = "O"
  7. EMPTY = " "
  8. TIE = "TIE"
  9. NUM_SQUARES = 9
  10.  
  11. def display_instruct():
  12.     """Выводит на экран инструкцию для игрока."""
  13.     print(
  14.     """
  15.    Добро пожаловать на ринг грандиознейших интеллектуальных состязаний всех времён.
  16.    Твой мозг и мой процессор сойдутся в схватке за доской игры "Крестики-нолики".
  17.    Чтобы сделать ход, введи число от 0 до 8. Числа однозначно соотвествуют полям
  18.    доски - так, как показано ниже:
  19.  
  20.                        0 | 1 | 2
  21.                        ---------
  22.                        3 | 4 | 5
  23.                        ---------
  24.                        6 | 7 | 8
  25.  
  26.    Приготовься с к бою, жалкий человечишка. Вот-вот начнётся решающее сражение.\n
  27.    """
  28.     )
  29.  
  30.  
  31. def ask_yes_no(question):
  32.     """Задаёт вопрос с ответом 'Да' или 'Нет'."""
  33.     response = None
  34.     while response not in ("y", "n"):
  35.         response = input(question).lower()
  36.     return response
  37.  
  38.  
  39. def ask_number(question, low, high):
  40.     """Просит ввести число из диапазона"""
  41.     response = None
  42.     while response not in range(low, high):
  43.         response = int(input(question))
  44.     return response
  45.  
  46.  
  47. def pieces():
  48.     """Определяет принадлежность перового хода."""
  49.     go_first = ask_yes_no("Хочешь оставить за собой первый ход? (y, n): ")
  50.     if go_first == "y":
  51.         print("\nНу что ж, дают тебе фору: играй крестиками.")
  52.         human = X
  53.         computer = O
  54.     else:
  55.         print("\nТвоя удаль тебя погубит... Буду начинать я.")
  56.         computer = X
  57.         human = O
  58.     return computer, human
  59.  
  60.  
  61. def new_board():
  62.     """Создаёт новую игровую доску."""
  63.     board = []
  64.     for square in range(NUM_SQUARES):
  65.         board.append(EMPTY)
  66.     return board
  67.  
  68.  
  69. def display_board(board):
  70.     """Отображает игровую доску на экране."""
  71.     print("\n\t", board[0], "|", board[1], "|", board[2])
  72.     print("\t", "----------")
  73.     print("\t", board[3], "|", board[4], "|", board[5])
  74.     print("\t", "----------")
  75.     print("\t", board[6], "|", board[7], "|", board[8])
  76.  
  77.  
  78. def legal_moves(board):
  79.     """Создаёт список доступных ходов."""
  80.     moves = []
  81.     for square in range(NUM_SQUARES):
  82.         if board[square] == EMPTY:
  83.             moves.append(square)
  84.     return moves
  85.  
  86.  
  87. def winner(board):
  88.     """Определяет победителя в игре."""
  89.     WAYS_TO_WIN = ((0, 1, 2),
  90.                    (3, 4, 5),
  91.                    (6, 7, 8),
  92.                    (0, 3, 6),
  93.                    (1, 4, 7),
  94.                    (2, 5, 8),
  95.                    (0, 4, 8),
  96.                    (2, 4, 6))
  97.     for row in WAYS_TO_WIN:
  98.         if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
  99.             winner = board[row[0]]
  100.             return winner
  101.         if EMPTY not in board:
  102.             return TIE
  103.     return None
  104.  
  105.  
  106. def human_move(board, human):
  107.     """Получает ход человека"""
  108.     legal = legal_moves(board)
  109.     move = None
  110.     while move not in legal:
  111.         move = ask_number("Твой ход. Выбери одно из полей (0 - 8):", 0, NUM_SQUARES)
  112.         if move not in legal:
  113.             print("\nСмешной человек! Это поле уже занято. Выбери другое.\n")
  114.     print("Ладно...")
  115.     return move
  116.  
  117.  
  118. def computer_move(board, computer, human):
  119.     """Делает ход за компьютерного противника."""
  120.     # создадим рабочую копию доски, потому что функция будет менять некотороые элементы в списке
  121.     board = board[:]
  122.     # ходы, от лучшего к худшему
  123.     BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7)
  124.  
  125.     print("Я выберу поле номер", end = " ")
  126.     # если сдедующим ходом может победить компьютер, выберем этот ход
  127.     for move in legal_moves(board):
  128.         board[move] = computer
  129.         if winner(board) == computer:
  130.             print(move)
  131.             return move
  132.         # выполнив проверку этого хода, отменим его (в локальной копии игровой доски)
  133.         board[move] = EMPTY
  134.  
  135.     # если следующим ходом может победить чегловек, блокируем этот ход
  136.     for moves in legal_moves(board):
  137.         board[move] = human
  138.         if winner(board) == human:
  139.             print(move)
  140.             return move
  141.         # выполнив проверку этого хода, отменим его (в локальной копии игровой доски)
  142.         board[move] = EMPTY
  143.  
  144.     # поскольку следующим ходом ни одна из сторон не может победить,
  145.     # выберем лучшее из доступных полей
  146.     for move in BEST_MOVES:
  147.         if move in legal_moves(board):
  148.             print(move)
  149.             return move
  150.  
  151.  
  152. def next_turn(turn):
  153.     """Осуществляет переход хода."""
  154.     if turn == X:
  155.         return O
  156.     else:
  157.         return X
  158.  
  159.  
  160. def congrat_winner(the_winner, computer, human):
  161.     """Поздравляет победителя игры."""
  162.     if the_winner != TIE:
  163.         print("Три", the_winner, "в ряд!\n")
  164.     else:
  165.         print("Ничья!\n")
  166.     if the_winner == computer:
  167.         print("Как я и предсказывал, победа в очередной раз осталась за мно!\n" \
  168.               "Вот ещё один довод в пользу того, что компьютеры превосходят человека решительно во всём.")
  169.     elif the_winner == human:
  170.         print("О нет, этого не может быть! Неужели ты как-то сумел меня перехитрить белковый? \n" \
  171.               "Клянусь: я, компьютер, не допущу этого никогда!")
  172.     elif the_winner == TIE:
  173.         print("Тебе несказанно повезло, дружок: ты сумел игру вничью. \n" \
  174.               "Радуйся же сегодняшнему успеху. Завтра тебе уже не суждено его повторить.")
  175.  
  176.  
  177. def main():
  178.     display_instruct()
  179.     computer, human = pieces()
  180.     turn = X
  181.     board = new_board()
  182.     display_board(board)
  183.     while not winner(board):
  184.         if turn == human:
  185.             move = human_move(board, human)
  186.             board[move] = human
  187.         else:
  188.             move = computer_move(board, computer, human)
  189.             board[move] = computer
  190.         display_board(board)
  191.         turn = next_turn(turn)
  192.     the_winner = winner(board)
  193.     congrat_winner(the_winner, computer, human)
  194.  
  195. # запуск программы
  196. main()
  197. input("Нажмите Enter, чтобы выйти.")
Advertisement
Add Comment
Please, Sign In to add comment