public Tile bestTile(Player p) {
		Tile best = null;
		double max_value = -10, value;
		HashSet<Tile> adj_tiles = new HashSet<Tile>();
		for (Vertex v : _settlements) adj_tiles.addAll(v.tiles());
		for (Vertex v : _cities) adj_tiles.addAll(v.tiles());
		for (Tile t : adj_tiles) {
			value = 0;
			for (Vertex v : t.getVertices()) {
				if (v.buildType() == BuildType.City) {
					if (v.controller() == p) value -= (CITY_PAYOUT * 1.5);
					else value += CITY_PAYOUT;
				}
				else if (v.buildType() == BuildType.Settlement) {
					if (v.controller() == p) value -= (SETT_PAYOUT * 1.5);
					else value += SETT_PAYOUT;
				}
			}
			value *= DIE_FREQ[t.roll()];
			if (value > max_value) {
				max_value = value;
				best = t;
			}
		}
		return best;
	}