private int getNextYForEnemy(Enemy en, DataPoint dp) { double dist = computeDistance(en.getCoordX(), en.getCoordY(), dp.getCoordX(), dp.getCoordY()); if (dist <= ENEMY_DIST_BY_TURN) { return dp.getCoordY(); } else { return (int) (en.getCoordY() + ((dp.getCoordY() - en.getCoordY()) * ENEMY_DIST_BY_TURN / dist)); } }
private void findClosestEnemyFromMeAndDP() { // Liste des enemies avec leur DP le plus proche Map<Enemy, DataPoint> enemyDataPoint = new HashMap<Enemy, DataPoint>(); for (Enemy en : enemyList) { enemyDataPoint.put(en, findClosestDPForEnemy(en)); } // On a vise un enemy avant, doit-on continuer sur celui-la if (targettedEnemy != null && enemyList.contains(targettedEnemy)) { System.err.println("keep the same enemy"); hasToShoot = true; } else { Collections.sort(enemyList, new EnemyCloserThanDPComparator()); Enemy en = enemyList.get(0); DataPoint dp = enemyDataPoint.get(en); int turnNumberBeforeEnemyReachData = getLeftTurnNumberBeforeEnemyReachData(en, dp); int turnNumberBeforeEnemyDie = getTurnToKillEnemyInThisPosition(en, dp); boolean test = testCoordsWithEnemyPrevision( getXCoordsCloser(en.getCoordX(), en.getCoordY()), getYCoordsCloser(en.getCoordX(), en.getCoordY())); System.err.println("Can i get closer " + test); System.err.println("Turn to reach data " + turnNumberBeforeEnemyReachData); System.err.println("Turn to kill in this pos " + turnNumberBeforeEnemyDie); // Si on peut le tuer avant qu'il atteigne sa cible et qu'on ne peut pas se rapprocher if (turnNumberBeforeEnemyDie == turnNumberBeforeEnemyReachData || (enoughDamageToKillInOneShootNextTurn(en, dp) || test == false)) { hasToShoot = true; targettedEnemy = en.getEnemyId(); } else { if (test == true) { coordXToMove = getXCoordsCloser(en.getCoordX(), en.getCoordY()); coordYToMove = getYCoordsCloser(en.getCoordX(), en.getCoordY()); hasToShoot = false; additionnalText = "I 'm getting closer !"; System.err.println("Move to get closer from him"); } else { avoidEnemy(en); hasToShoot = false; } } } }
private int getTurnToKillEnemyInThisPosition(Enemy en, DataPoint dp) { int i = 0; int enemyLife = en.getEnemyLife(); int currentX = en.getCoordX(); int currentY = en.getCoordY(); while (enemyLife > 0) { currentX = getNextXForEnemy(currentX, currentY, dp); currentY = getNextYForEnemy(currentX, currentY, dp); int dist = computeDistance(getCoordX(), getCoordX(), currentX, currentY); enemyLife -= computeImpactEfficiency(dist); i++; } return i; }
private boolean willBeAbleToKillInOneShoot(int turnLeft, Enemy en, DataPoint dp) { int playerX = getCoordX(); int playerY = getCoordY(); int currentX = en.getCoordX(); int currentY = en.getCoordY(); while (turnLeft > 0) { currentX = getNextXForEnemy(currentX, currentY, dp); currentY = getNextYForEnemy(currentX, currentY, dp); playerX = getXCoordsCloser(currentX, currentY); playerY = getYCoordsCloser(currentX, currentY); turnLeft--; } int dist = computeDistance(playerX, playerY, currentX, currentY); if (enoughDamageToKillInOneShootInGivenDistance(dist, en.getEnemyLife())) { return true; } else { return false; } }
private void initPlayerFromInput(Scanner in) { reinit(); this.coordX = in.nextInt(); this.coordY = in.nextInt(); int dataCount = in.nextInt(); for (int i = 0; i < dataCount; i++) { dataPointList.add(new DataPoint(in.nextInt(), in.nextInt(), in.nextInt())); } int enemyCount = in.nextInt(); for (int i = 0; i < enemyCount; i++) { Enemy enemy = new Enemy(in.nextInt(), in.nextInt(), in.nextInt(), in.nextInt()); enemy.setDistanceFromPlayer( computeDistance(coordX, coordY, enemy.getCoordX(), enemy.getCoordY())); DataPoint dp = findClosestDPForEnemy(enemy); enemy.setClosestDataPoint(dp); enemyList.add(enemy); } Collections.sort(enemyList, new EnemyComparator()); }