public Integer evaluate(Board state, Player.PlayerType player)
	{
		HashSet<Integer[]> thisBoardBlockedPoints = new HashSet<Integer[]>();
		for(int x=0;x<Board.BOARD_SIZE;x++){
			for(int y=0;y<Board.BOARD_SIZE;y++){
				if(state.get(x, y)==Board.BoardState.BLOCKED){
					Integer[] point = {x,y};
					thisBoardBlockedPoints.add(point);
				}
			}
		}
		if(!thisBoardBlockedPoints.equals(blockedPoints) || !visibilityMapInitialised){
			evaluateVisibilityMap(state); //This is pretty time consuming so we don't want to recalculate it every time
		}
		//Calculate every white square's visibility and every black square's visibility, find difference
		int whiteVisibilityAdvantage = 0;
		for(int x=0;x<Board.BOARD_SIZE;x++){
			for(int y=0;y<Board.BOARD_SIZE;y++){
				
				if(Board.BoardState.asBoardState(player) == state.get(x, y)){
					whiteVisibilityAdvantage += visibilityMap[x][y];
				}else if(Board.BoardState.asBoardState(player.getOpponent()) == state.get(x, y)){
					whiteVisibilityAdvantage -= visibilityMap[x][y];
				}
			}
		}
		return whiteVisibilityAdvantage;
	}