public int Winner() {
		Set<Integer> remainingPlayers = new TreeSet<Integer>();
		for (Planet p : planets) {
			remainingPlayers.add(p.Owner());
		}
		for (Fleet f : fleets) {
			remainingPlayers.add(f.Owner());
		}
		remainingPlayers.remove(0);
		if (numTurns > maxGameLength) {
			int leadingPlayer = -1;
			int mostShips = -1;
			for (int playerID : remainingPlayers) {
				int numShips = NumShips(playerID);
				if (numShips == mostShips) {
					leadingPlayer = 0;
				} else if (numShips > mostShips) {
					leadingPlayer = playerID;
					mostShips = numShips;
				}
			}
			return leadingPlayer;
		}
		switch (remainingPlayers.size()) {
		case 0:
			return 0;
		case 1:
			return ((Integer) remainingPlayers.toArray()[0]).intValue();
		default:
			return -1;
		}
	}