public void onHitRobot(HitRobotEvent e) { System.out.println("START at : " + getTime() + " onHitRobot----------------------------"); // チームメイトなら進む方向を反転する String name = e.getName(); if (isTeammate(name)) { moveAmount = -moveAmount; System.out.println("Sorry " + name); } else { for (Enemy_info temp : enes) { if (name.equals(temp.get_en_name())) { System.out.println("taeget change to " + name); target_enemy = temp; enemy_detected = true; power = power * 3; } } } System.out.println("END at : " + getTime() + " onHitRobot----------------------------"); }
public void onRobotDeath(RobotDeathEvent e) { // ロボットが死んだ時 System.out.println("START at : " + getTime() + " onRobotDeath----------------------------"); System.out.println("print death " + e.getName()); if (isTeammate(e.getName())) { } else { // それが敵である時 if (target_enemy.get_en_name().equals(e.getName())) { enemy_detected = false; // 敵の生存フラグを折る enemy_count--; // 敵のカウントを減らす } walls_count--; // wallsのカウントを減らす } System.out.println("END at : " + getTime() + " onRobotDeath----------------------------"); }
/** onScannedRobot: What to do when you see another robot */ public void onScannedRobot(ScannedRobotEvent e) { System.out.println("START at : " + getTime() + " onScannedRobot----------------------------"); String nnn = e.getName(); System.out.println("scan " + nnn); double eneX = getX() + Math.sin(e.getBearingRadians() + Math.toRadians(getHeading())) * e.getDistance(); double eneY = getY() + Math.cos(e.getBearingRadians() + Math.toRadians(getHeading())) * e.getDistance(); Enemy_info enem = null; if (!isTeammate(nnn)) { // 味方への情報送信 try { broadcastMessage( nnn + ", " + e.getBearing() + ", " + e.getBearingRadians() + ", " + e.getDistance() + ", " + e.getEnergy() + ", " + e.getHeading() + ", " + e.getHeadingRadians() + ", " + e.getVelocity() + ", " + eneX + ", " + eneY); } catch (IOException ignored) { } // スキャンした車両がLocal敵リストにいるかどうかのフラグ boolean flag = false; System.out.println("send scanned info"); // スキャンした敵がLocal敵リストの中に存在するか for (Enemy_info temp : enes) { if (nnn.equals(temp.get_en_name())) { flag = true; enem = temp; // Local敵リストのアップデート temp.updateInformation( e.getBearing(), e.getBearingRadians(), e.getDistance(), e.getEnergy(), e.getHeading(), e.getHeadingRadians(), e.getVelocity(), eneX, eneY); System.out.println(" update scanned Info"); } } // スキャンした敵がLocal敵リストの中に存在しない場合 if (!flag) { // Local敵リストに新規追加 enem = new Enemy_info( nnn, e.getBearing(), e.getBearingRadians(), e.getDistance(), e.getEnergy(), e.getHeading(), e.getHeadingRadians(), e.getVelocity(), eneX, eneY); enes.add(enem); System.out.println(" add scanned info"); } if (enemy_detected == false) { // 共通の敵が設定されていない場合 enemy_detected = true; target_enemy = enem; try { broadcastMessage("Kill , " + target_enemy.get_en_name() + ", !!"); } catch (IOException ignored) { } } if (enemy_detected == true) { try { double enemyX = target_enemy.get_en_expX(); double enemyY = target_enemy.get_en_expY(); setTurnRadarLeftRadians(getRadarTurnRemainingRadians()); System.out.println("abs : eX " + enemyX + " : " + "eY " + enemyY); // 共通の敵が設定されている場合 double enemyBearing = Math.atan((enemyX - getX()) / (enemyY - getY())); // if(enemyBearing<0){ // System.out.println("change"); // enemyBearing = Math.PI*2 + enemyBearing; // }else if (enemyBearing < Math.PI){ // } // System.out.println("atan " + Math.atan((eneY-getY())/(eneX-getX()))); // System.out.println("atan1 " + Math.atan((eneX-getX())/(eneY-getY()))); // System.out.println("trueeee " + (e.getBearingRadians() + this.getHeadingRadians())); System.out.println( "enerad" + enemyBearing + " ?= " + "enemyBearing " + (this.getHeadingRadians() + e.getBearingRadians())); System.out.println(enemyBearing + Math.PI); double enemyHeading = target_enemy.get_en_heading(); // 敵の向き System.out.println("enemy heading:" + enemyHeading); // double enemyBearing = this.getHeadingRadians() + // target_enemy.get_en_bearingRadians();// 自分と敵の角度 // double enemyX = target_enemy.get_en_distance() * Math.sin(enemyBearing); // double enemyY = target_enemy.get_en_distance() * Math.cos(enemyBearing); enemyX = enemyX - getX(); enemyY = enemyY - getY(); System.out.println("Relative : eX " + enemyX + " : " + "eY " + enemyY); double battlefieldWidh = getBattleFieldWidth(); // フィールド幅 double battlefieldHeight = getBattleFieldHeight(); // フィールド高さ boolean isHeadingToCenter = (int) enemyHeading % 90 == 0; // 中心を向いている boolean isOnWall = nearlyEquals(enemyX, 18) || nearlyEquals(enemyX + 18, battlefieldWidh) || nearlyEquals(enemyY, 18) || nearlyEquals(enemyY + 18, battlefieldHeight); // 壁に張り付いている // 中心を向いている&&壁際にいる(=Walls)なら射撃 if (isHeadingToCenter && isOnWall) { System.out.println("Walls!!"); } double dis = 0; double heading = lastEnemyHeading; do { dis += Rules.getBulletSpeed(power); heading += target_enemy.get_en_headingRadians() - lastEnemyHeading; enemyX += target_enemy.get_en_velocity() * Math.sin(heading); enemyY += target_enemy.get_en_velocity() * Math.cos(heading); } while (dis < Point2D.distance(0, 0, enemyX, enemyY)); // // 相対角度に変換した上で砲塔の向きを変える setTurnGunRightRadians( Utils.normalRelativeAngle(Math.atan2(enemyX, enemyY) - getGunHeadingRadians())); setFire(power); // lastEnemyHeading = e.getHeadingRadians(); lastEnemyHeading = target_enemy.get_en_headingRadians(); System.out.println("lastEnemyHeading " + e.getHeadingRadians()); System.out.println(lastEnemyHeading); // 敵の居る方向へターンする // setTurnRightRadians(e.getBearingRadians()); setTurnRightRadians(enemyBearing - this.getHeadingRadians()); System.out.println("setTurnRightRadians " + e.getBearingRadians()); System.out.println(enemyBearing - this.getHeadingRadians()); // 前進する setAhead(moveAmount); } catch (NullPointerException ee) { System.out.println("NullPointerException"); System.out.println(target_enemy); } } } System.out.println("enemy_detected = " + enemy_detected); System.out.println("target is " + target_enemy.get_en_name()); System.out.println(target_enemy.get_en_expX() + " " + target_enemy.get_en_expY()); System.out.println("END at : " + getTime() + " onScannedRobot----------------------------"); }
public void onMessageReceived(MessageEvent e) { System.out.println( "START at : " + getTime() + " onMessageReceived----------------------------"); // メッセージを受け取った時 System.out.println("receive Message"); if (e.getMessage() instanceof String) { boolean flag = false; String raw = (String) e.getMessage(); enemy_data = raw.split(", ", -1); Enemy_info enem = null; String nnn = enemy_data[0]; if (raw.indexOf("Kill") != -1) { System.out.println("Receive kill instruction!!"); for (Enemy_info temp : enes) { if (enemy_data[1].equals(temp.get_en_name())) { target_enemy = temp; enemy_detected = true; } } } else { try { for (Enemy_info temp : enes) { if (nnn.equals(temp.get_en_name())) { // スキャンした敵がLocal敵リストの中に存在する flag = true; enem = temp; // 参照のコピー // Local敵リストの情報をアップデート temp.updateInformation( Double.parseDouble(enemy_data[1]), Double.parseDouble(enemy_data[2]), Double.parseDouble(enemy_data[3]), Double.parseDouble(enemy_data[4]), Double.parseDouble(enemy_data[5]), Double.parseDouble(enemy_data[6]), Double.parseDouble(enemy_data[7]), Double.parseDouble(enemy_data[8]), Double.parseDouble(enemy_data[9])); System.out.println(" update received Info"); } } if (!flag) { // スキャンした敵がLocal敵リストの中に存在しない //// Local敵リストの情報を新規追加 enem = new Enemy_info( nnn, Double.parseDouble(enemy_data[1]), Double.parseDouble(enemy_data[2]), Double.parseDouble(enemy_data[3]), Double.parseDouble(enemy_data[4]), Double.parseDouble(enemy_data[5]), Double.parseDouble(enemy_data[6]), Double.parseDouble(enemy_data[7]), Double.parseDouble(enemy_data[8]), Double.parseDouble(enemy_data[9])); enes.add(enem); System.out.println(" add received info"); } } catch (ArrayIndexOutOfBoundsException e2) { System.out.println("ArrayIndexOutOfBoundsException"); for (String n : enemy_data) { System.out.println(n); } } if (enemy_detected == false) { enemy_detected = true; target_enemy = enem; } } } System.out.println("target is " + target_enemy.get_en_name()); System.out.println("enemy_detected = " + enemy_detected); System.out.println("END at : " + getTime() + " onMessageReceived----------------------------"); }