public abstract class LandscapeTile {
	private static Random rnd = new Random();
	Vector2d coordinates;
	int elevation;
	
	public abstract int getMinElevation();
	public abstract int getMaxElevation();
	
	private LandscapeTile(Vector2d coordinates) {
		this.coordinates = coordinates;
		this.elevation = rnd.nextInt(getMinElevation(), getMaxElevation());
	}
	
	public static LandscapeTile hill(Vector2d coordinates) {
		return new Hill(coordinates);
	}
	
	public static LandscapeTile forest(Vector2d coordinates) {
		return new Forest(coordinates);
	}
	
	public static class Hill extends LandscapeTile {
		
		private Hill(Vector2d coordinates) {
			super(coordinates);
		}
		
		@Override
		public int getMinElevation() { 
			return 50;
		}
		
		public int getMaxElevation() {
			return 100;
		}
	}
	
	public static class Forest extends LandscapeTile {
		
		private Forest(Vector2d coordinates) {
			super(coordinates);
		}
		
		@Override
		public int getMinElevation() { 
			return 10;
		}
		
		public int getMaxElevation() {
			return 50;
		}
	}
	
	
	public static void main(String[] args) {
		List<LandscapeTile> tiles = Arrays.asList(
			LandscapeTile.hill(new Vector2d(0, 1)),
			LandscapeTile.forest(new Vector2d(1, 1))
		);
	}
}
