예제 #1
0
 private void findPlanetOnStar(Star star) {
   int highestPopulationCongeniality = 0;
   for (BasePlanet planet : star.getPlanets()) {
     if (planet.getPopulationCongeniality() > highestPopulationCongeniality) {
       highestPopulationCongeniality = planet.getPopulationCongeniality();
       mPlanetIndex = planet.getIndex();
     }
   }
 }
예제 #2
0
  private double scoreStar(Sector sector, BaseStar star) {
    int centre = BaseSector.SECTOR_SIZE / 2;
    double distanceToCentre =
        Math.sqrt(
            (star.getOffsetX() - centre) * (star.getOffsetX() - centre)
                + (star.getOffsetY() - centre) * (star.getOffsetY() - centre));
    // 0..10 (0 means the star is on the edge of the sector, 10 means it's the very centre)
    double distanceToCentreScore = (centre - distanceToCentre) / (centre / 10.0);
    if (distanceToCentreScore < 1.0) {
      distanceToCentreScore = 1.0;
    }

    // figure out the distance to the closest colonized star and give it a score based on that
    // basically, we want to be about 400 pixels away, no closer but a litter further away is
    // OK as well
    double distanceToOtherColonyScore = 1.0;
    double distanceToOtherColony = 0.0;
    BaseStar otherColony = null;
    for (BaseStar otherStar : sector.getStars()) {
      if (otherStar.getKey().equals(star.getKey())) {
        continue;
      }
      if (isColonized(otherStar)) {
        double distanceToColony =
            Math.sqrt(
                (star.getOffsetX() - otherStar.getOffsetX())
                        * (star.getOffsetX() - otherStar.getOffsetX())
                    + (star.getOffsetY() - otherStar.getOffsetY())
                        * (star.getOffsetY() - otherStar.getOffsetY()));
        if (otherColony == null || distanceToColony < distanceToOtherColony) {
          otherColony = otherStar;
          distanceToOtherColony = distanceToColony;
        }
      }
    }
    if (otherColony != null) {
      if (distanceToOtherColony < 500.0) {
        distanceToOtherColonyScore = 0.0;
      } else {
        distanceToOtherColonyScore = 500.0 / distanceToOtherColony;
        distanceToOtherColonyScore *= distanceToOtherColonyScore;
      }
    }

    double numTerranPlanets = 0.0;
    double populationCongeniality = 0.0;
    double farmingCongeniality = 0.0;
    double miningCongeniality = 0.0;
    for (BasePlanet planet : star.getPlanets()) {
      if (planet.getPlanetType().getInternalName().equals("terran")
          || planet.getPlanetType().getInternalName().equals("swamp")
          || planet.getPlanetType().getInternalName().equals("water")) {
        numTerranPlanets++;
      }
      populationCongeniality += planet.getPopulationCongeniality();
      farmingCongeniality += planet.getFarmingCongeniality();
      miningCongeniality += planet.getMiningCongeniality();
    }
    double planetScore = 0.0;
    if (numTerranPlanets >= 2) {
      planetScore = numTerranPlanets;
    }
    if (numTerranPlanets == 0) {
      return 0.0;
    }

    double congenialityScore =
        (populationCongeniality / numTerranPlanets)
            + (farmingCongeniality / numTerranPlanets)
            + (miningCongeniality / numTerranPlanets);
    congenialityScore /= 100.0;

    double score =
        (distanceToCentreScore * planetScore * congenialityScore * distanceToOtherColonyScore);

    log.info(
        String.format(
            Locale.ENGLISH,
            "Star[%s] score=%.2f distance_to_centre_score=%.2f planet_score=%.2f num_terran_planets=%.0f congeniality_score=%.2f distance_to_colony_score=%.2f distance_to_nearest_colony=%.2f",
            star.getName(),
            score,
            distanceToCentreScore,
            planetScore,
            numTerranPlanets,
            congenialityScore,
            distanceToOtherColonyScore,
            distanceToOtherColony));

    return score;
  }