def check_lose(board, moves, play_sym): temp_board = Board() for move in moves: temp_board.board = [row[:] for row in board.board] temp_board.add_move(*move, play_sym) if temp_board.check_winner()[0]: return move
def get_best_move(board, comp_sym, play_sym): best_score, best_move = -10, None temp_board = Board() for move in get_open_squares(board): temp_board.board = [row[:] for row in board.board] temp_board.add_move(*move, comp_sym) score = minimax(temp_board, False, comp_sym, play_sym, 1) if score > best_score: best_score = score best_move = move return best_move
def minimax(board, maximizing, comp_sym, play_sym, depth): if board.check_winner() == (True, comp_sym): #computer wins return 1 / depth elif board.check_winner()[0]: #player wins return -1 / depth elif len(get_open_squares(board)) == 0: #draw return 0 moves = get_open_squares(board) scores = [] temp_board = Board() for move in moves: temp_board.board = [row[:] for row in board.board] if maximizing: player = comp_sym else: player = play_sym temp_board.add_move(*move, player) scores.append(minimax(temp_board, not maximizing, comp_sym, play_sym, depth + 1)) if maximizing: return max(scores) return min(scores)
def test_check_diags_no_winner(self): myBoard = Board() myBoard.board = [['O', '_', 'X'], ['_', 'O', '_'], ['O', 'X', '_']] self.assertEqual(myBoard.check_diags(), 0)
def test_has_winner_None(self): myBoard = Board() myBoard.board = [['X', 'O', 'X'], ['O', 'X', '_'], ['_', '_', '_']] self.assertEqual(myBoard.has_winner(), 0)
def test_check_diags_0_in_pos_diag(self): myBoard = Board() myBoard.board = [['_', '_', 'O'], ['_', 'O', '_'], ['O', '_', '_']] self.assertEqual(myBoard.check_diags(), 2)
def test_check_diags_X_in_neg_diag(self): myBoard = Board() myBoard.board = [['X', '_', '_'], ['_', 'X', '_'], ['_', '_', 'X']] self.assertEqual(myBoard.check_diags(), 1)
def test_check_cols_0_in_cols_2(self): myBoard = Board() myBoard.board = [['_', '_', 'O'], ['_', '_', 'O'], ['_', '_', 'O']] self.assertEqual(myBoard.check_cols(), 2)
def test_check_cols_X_in_cols_0(self): myBoard = Board() myBoard.board = [['X', '_', '_'], ['X', '_', '_'], ['X', '_', '_']] self.assertEqual(myBoard.check_cols(), 1)
def test_check_rows_O_in_row_2(self): myBoard = Board() myBoard.board = [['_', '_', '_'], ['_', '_', '_'], ['O', 'O', 'O']] self.assertEqual(myBoard.check_rows(), 2)