/** * Returns changes in region strengths for each possible move. * * @param region * @return */ protected static Map<Neighbor, Float> checkMoves(Region region) { Map<Neighbor, Float> result = new HashMap<Neighbor, Float>(); for (Neighbor neighbor : region.neighbors) { // check if neighbor can be moved to if (RegionUtils.canMove(region, neighbor)) { // get current strengths of region, neighbor float regionStrength = RegionUtils.getRegionBattleStrength(region); float neighborStrength = RegionUtils.getRegionBattleStrength(neighbor.region); // swap units, see change in strengths Unit tempUnit = region.unit; region.unit = neighbor.region.unit; neighbor.region.unit = tempUnit; Player tempPlayer = region.player; region.player = neighbor.region.player; neighbor.region.player = tempPlayer; float regionMoveStrength = RegionUtils.getRegionBattleStrength(region); float neighborMoveStrength = RegionUtils.getRegionBattleStrength(neighbor.region); // put units back tempUnit = region.unit; region.unit = neighbor.region.unit; neighbor.region.unit = tempUnit; tempPlayer = region.player; region.player = neighbor.region.player; neighbor.region.player = tempPlayer; result.put( neighbor, regionMoveStrength + neighborMoveStrength - regionStrength - neighborStrength); } } return result; }
/** * Returns collection of moves for given score factor, ordered by descending score. * * @param overworld * @param player * @param scoreThreshold * @param scoreFactor * @return */ protected static Collection<Move> getMoves( Overworld overworld, Player player, ScoreFactor scoreThreshold, ScoreFactor captureScoreThreshold, ScoreFactor scoreFactor) { Map<Float, Move> moves = new TreeMap<Float, Move>(); // go through each region for (Region region : overworld.regions) { if (region.player.equals(player) && region.unit != null && region.unit.hasMove) { // go through each neighbor for (Neighbor neighbor : region.neighbors) { if (RegionUtils.canMove(region, neighbor)) { ScoreFactor score = new ScoreFactor(); float scoreValue = 0; boolean aboveThreshold = true; // get each score type for (ScoreFactor.Type type : ScoreFactor.Type.values()) { if (scoreThreshold.usesType(type) || scoreFactor.usesType(type)) { switch (type) { case BATTLE_STRENGTH_CHANGE: score.addFactor(type, getBattleStrengthChange(region, neighbor, true)); break; case ISLAND_PERCENTAGE: score.addFactor(type, RegionUtils.getIslandPercentage(region.island, player)); break; case ISLAND_STRENGTH: score.addFactor(type, RegionUtils.getIslandStrength(region.island, player)); break; case RANDOM: score.addFactor(type, Utils.random().nextFloat()); break; case BATTLE_LIKELIHOOD: case ISLAND_STRENGTH_CHANGE: // ignore break; } // check if score meets threshold // capture threshold if (!neighbor.region.player.equals(region.player) && neighbor.region.unit == null) { if (captureScoreThreshold.usesType(type)) { aboveThreshold &= score.getScore(type) >= captureScoreThreshold.getScore(type); } } // regular move threshold else { if (scoreThreshold.usesType(type)) { aboveThreshold &= score.getScore(type) >= scoreThreshold.getScore(type); } } // update score value if (scoreFactor.usesType(type)) { scoreValue += score.getScore(type) * scoreFactor.getScore(type); } } } // score above threshold if (aboveThreshold) { moves.put(scoreValue, new Move(Move.Type.MOVE, region, neighbor.region)); System.out.println( String.format("\tpossible move %f: %s", scoreValue, moves.get(scoreValue))); System.out.println("\t\t" + score); } } } } } return moves.values(); }