def alphabeta(board, depth, a, b, maximizing): if (depth == 0): return Heuristics.evaluate(board) if (maximizing): best_score = -AI.INFINITE for move in board.get_possible_moves(pieces.Piece.WHITE): copy = board.Board.clone(board) copy.perform_move(move) best_score = max(best_score, AI.alphabeta(copy, depth-1, a, b, False)) a = max(a, best_score) if (b <= a): break return best_score else: best_score = AI.INFINITE for move in board.get_possible_moves(pieces.Piece.BLACK): copy = board.Board.clone(board) copy.perform_move(move) best_score = min(best_score, AI.alphabeta(copy, depth-1, a, b, True)) b = min(b, best_score) if (b <= a): break return best_score
def get_ai_move(board, invalid_moves): best_move = 0 best_score = AI.INFINITE for move in board.get_possible_moves(pieces.Piece.BLACK): if (AI.is_invalid_move(move, invalid_moves)): continue copy = board.Board.clone(board) copy.perform_move(move) score = AI.alphabeta(copy, 3, -AI.INFINITE, AI.INFINITE, True) if (score < best_score): best_score = score best_move = move # Checkmate. if (best_move == 0): return 0 copy = board.Board.clone(board) copy.perform_move(best_move) if (copy.is_check(pieces.Piece.BLACK)): invalid_moves.append(best_move) return AI.get_ai_move(board, invalid_moves) return best_move
def minimax(board, depth, maximizing): if (depth == 0): return Heuristics.evaluate(board) if (maximizing): best_score = -AI.INFINITE for move in board.get_possible_moves(pieces.Piece.WHITE): copy = board.Board.clone(board) copy.perform_move(move) score = AI.minimax(copy, depth-1, False) best_score = max(best_score, score) return best_score else: best_score = AI.INFINITE for move in board.get_possible_moves(pieces.Piece.BLACK): copy = board.Board.clone(board) copy.perform_move(move) score = AI.minimax(copy, depth-1, True) best_score = min(best_score, score) return best_score
def get_valid_user_move(board): while True: move = get_user_move() valid = False possible_moves = board.get_possible_moves(pieces.Piece.WHITE) # No possible moves if (not possible_moves): return 0 for possible_move in possible_moves: if (move.equals(possible_move)): move.castling_move = possible_move.castling_move valid = True break if (valid): break else: print("Invalid move.") return move
def get_valid_user_move(board, api, uid, request): while True: move = get_user_move(api, uid, request) valid = False possible_moves = board.get_possible_moves(pieces.Piece.WHITE) # No possible moves if (not possible_moves): return 0 for possible_move in possible_moves: if (move.equals(possible_move)): move.castling_move = possible_move.castling_move valid = True break if (valid): break else: break return move
def get_valid_user_move(board, color=pieces.Piece.WHITE): while True: move = get_user_move(color) valid = False possible_moves = board.get_possible_moves(color) # No possible moves if (not possible_moves): return 0 for possible_move in possible_moves: if (move.equals(possible_move)): valid = True break if valid: break else: print(move.to_string()) print("Invalid move.") return move