@Override
	public double getHeuristicValue(final AbstractState node, final Game game) {
		if (node == null || !(node instanceof BoardState))
			throw new IllegalArgumentException("node is illegal");
		BoardState s = (BoardState) node;
		List<Point> towerCoordinates = s.getTowerCoordinates();
		// check that the node is legal
		for (Point coord : towerCoordinates)
			if (game.hasTower(coord) || game.getBlockType(coord) != TILE_TYPE.GROUND)
				return -1;
		for (Tower t : game.getTowers())
			towerCoordinates.add(t.getMapLocation());

		int product = 1;
		for (Path p : game.getRoom().paths) {
			int intersectionsWithPath = 0;
			for (Point towerCoord : towerCoordinates)
				intersectionsWithPath += pathIntersections(towerCoord, game, p);
			product *= intersectionsWithPath;
		}
		return product;
	}