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); }