private static void goToLocationSwarm(MapLocation location, boolean defuseMines) throws GameActionException { // Swarming double dxToLocation = location.x - rc.getLocation().x; double dyToLocation = location.y - rc.getLocation().y; double distanceToLocation = Math.sqrt(rc.getLocation().distanceSquaredTo(location)); Robot[] nearbyAlliedRobots = rc.senseNearbyGameObjects(Robot.class, 14, rc.getTeam()); int totalDx = 0; int totalDy = 0; int totalNearbyerDx = 0; int totalNearbyerDy = 0; for (int i = nearbyAlliedRobots.length; --i >= 0; ) { RobotInfo robotInfo = rc.senseRobotInfo(nearbyAlliedRobots[i]); if (robotInfo.type == RobotType.SOLDIER) { MapLocation iterLocation = robotInfo.location; totalDx += (iterLocation.x - rc.getLocation().x); totalDy += (iterLocation.y - rc.getLocation().y); if (rc.getLocation().distanceSquaredTo(iterLocation) <= 5) { // for repelling totalNearbyerDx += (iterLocation.x - rc.getLocation().x); totalNearbyerDy += (iterLocation.y - rc.getLocation().y); } } } double denom = Math.sqrt(totalDx * totalDx + totalDy * totalDy); double nearbyerDenom = Math.sqrt(totalNearbyerDx * totalNearbyerDx + totalNearbyerDy * totalNearbyerDy); double addX, addY; double addXNearbyer, addYNearbyer; if (Math.abs(totalDx) < 0.01) { addX = 0; } else { addX = swarmC * totalDx / denom; } if (Math.abs(totalDy) < 0.01) { addY = 0; } else { addY = swarmC * totalDy / denom; } if (Math.abs(totalNearbyerDx) < 0.01) { addXNearbyer = 0; } else { addXNearbyer = swarmD * totalNearbyerDx / nearbyerDenom; } if (Math.abs(totalNearbyerDy) < 0.01) { addYNearbyer = 0; } else { addYNearbyer = swarmD * totalNearbyerDy / nearbyerDenom; } double finalDx = dxToLocation / distanceToLocation + addX - addXNearbyer; double finalDy = dyToLocation / distanceToLocation + addY - addYNearbyer; // rc.setIndicatorString(0, "totalDx: " + Integer.toString(totalDx) + ", finalDx: " + // Double.toString(finalDx)); // rc.setIndicatorString(1, "totalDy: " + Integer.toString(totalDy) + ", finalDy: " + // Double.toString(finalDy)); int dirOffset; double ratioCutoff = 2.5; double ratio = Math.abs(finalDx / finalDy); if (ratio > ratioCutoff) { // go along x-axis if (finalDx > 0) { dirOffset = 2; } else { dirOffset = 6; } } else if (ratio < 1 / ratioCutoff) { // go along y-axis if (finalDy > 0) { dirOffset = 4; } else { dirOffset = 0; } } else { if (finalDx > 0) { if (finalDy >= 0) { dirOffset = 3; } else { dirOffset = 1; } } else { if (finalDy > 0) { dirOffset = 5; } else { dirOffset = 7; } } } Direction dirToMoveIn = Direction.values()[dirOffset]; if (defuseMines) { NavSystem.goDirectionAndDefuse(dirToMoveIn); } else { NavSystem.goDirectionAvoidMines(dirToMoveIn); } }