Advertisement
Guest User

Untitled

a guest
May 25th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. import random
  2.  
  3.  
  4. class Tic(object):
  5. winning_combos = (
  6. [0, 1, 2], [3, 4, 5], [6, 7, 8],
  7. [0, 3, 6], [1, 4, 7], [2, 5, 8],
  8. [0, 4, 8], [2, 4, 6])
  9.  
  10. winners = ('X-win', 'Draw', 'O-win')
  11.  
  12. def __init__(self, squares=[]):
  13. if len(squares) == 0:
  14. self.squares = [None for i in range(9)]
  15. else:
  16. self.squares = squares
  17.  
  18. def show(self):
  19. for element in [self.squares[i:i + 3] for i in range(0, len(self.squares), 3)]:
  20. print element
  21.  
  22. def available_moves(self):
  23. """what spots are left empty?"""
  24. return [k for k, v in enumerate(self.squares) if v is None]
  25.  
  26. def available_combos(self, player):
  27. """what combos are available?"""
  28. return self.available_moves() + self.get_squares(player)
  29.  
  30. def complete(self):
  31. """is the game over?"""
  32. if None not in [v for v in self.squares]:
  33. return True
  34. if self.winner() != None:
  35. return True
  36. return False
  37.  
  38. def X_won(self):
  39. return self.winner() == 'X'
  40.  
  41. def O_won(self):
  42. return self.winner() == 'O'
  43.  
  44. def tied(self):
  45. return self.complete() == True and self.winner() is None
  46.  
  47. def winner(self):
  48. for player in ('X', 'O'):
  49. positions = self.get_squares(player)
  50. for combo in self.winning_combos:
  51. win = True
  52. for pos in combo:
  53. if pos not in positions:
  54. win = False
  55. if win:
  56. return player
  57. return None
  58.  
  59. def get_squares(self, player):
  60. """squares that belong to a player"""
  61. return [k for k, v in enumerate(self.squares) if v == player]
  62.  
  63. def make_move(self, position, player):
  64. """place on square on the board"""
  65. self.squares[position] = player
  66.  
  67. def alphabeta(self, node, player, alpha, beta):
  68. if node.complete():
  69. if node.X_won():
  70. return -1
  71. elif node.tied():
  72. return 0
  73. elif node.O_won():
  74. return 1
  75. for move in node.available_moves():
  76. node.make_move(move, player)
  77. val = self.alphabeta(node, get_enemy(player), alpha, beta)
  78. node.make_move(move, None)
  79. if player == 'O':
  80. if val > alpha:
  81. alpha = val
  82. if alpha >= beta:
  83. return beta
  84. else:
  85. if val < beta:
  86. beta = val
  87. if beta <= alpha:
  88. return alpha
  89. if player == 'O':
  90. return alpha
  91. else:
  92. return beta
  93.  
  94.  
  95. def determine(board, player):
  96. a = -2
  97. choices = []
  98. if len(board.available_moves()) == 9:
  99. return 4
  100. for move in board.available_moves():
  101. board.make_move(move, player)
  102. val = board.alphabeta(board, get_enemy(player), -2, 2)
  103. board.make_move(move, None)
  104. print "move:", move + 1, "causes:", board.winners[val + 1]
  105. if val > a:
  106. a = val
  107. choices = [move]
  108. elif val == a:
  109. choices.append(move)
  110. return random.choice(choices)
  111.  
  112.  
  113. def get_enemy(player):
  114. if player == 'X':
  115. return 'O'
  116. return 'X'
  117.  
  118. if __name__ == "__main__":
  119. board = Tic()
  120. board.show()
  121.  
  122. while not board.complete():
  123. player = 'X'
  124. player_move = int(raw_input("Next Move: ")) - 1
  125. if not player_move in board.available_moves():
  126. continue
  127. board.make_move(player_move, player)
  128. board.show()
  129.  
  130. if board.complete():
  131. break
  132. player = get_enemy(player)
  133. computer_move = determine(board, player)
  134. board.make_move(computer_move, player)
  135. board.show()
  136. print "winner is", board.winner()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement