public Universe next() {
   List<Fleet> futureFleets = new ArrayList<Fleet>();
   List<Planet> newPlanets = new ArrayList<Planet>();
   for (Planet planet : planets.items) {
     newPlanets.add(planet.grow());
   }
   List<Fleet> arrivingFleets = new ArrayList<Fleet>();
   for (Fleet fleet : fleets.items) {
     Fleet movedFleet = fleet.move();
     if (movedFleet.turnsRemaining > 0) {
       futureFleets.add(movedFleet);
     } else {
       arrivingFleets.add(movedFleet);
     }
   }
   Fleets arriving = new Fleets(arrivingFleets);
   for (Fleet fleet : arrivingFleets) {
     Planet planet = new Planets(newPlanets).find(fleet.destinationPlanet);
     Fleets attacking = arriving.attacking(planet);
     if (attacking.enemyFleets().ships() != attacking.myFleets().ships()) {
       newPlanets.remove(planet);
       planet = planet.receive(fleet);
       newPlanets.add(planet);
     }
   }
   return new Universe(new Planets(newPlanets), new Fleets(futureFleets), turn + 1, reservations);
 }