Advertisement
Guest User

Untitled

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