package SuperMan; import robocode.*; import java.awt.Color; import java.util.*; import java.lang.Math.*; /** * SuperMan----DAYDream ONLY A SAMPLE */ public class SuperMan extends AdvancedRobot { private Vector trackVector;//target vector double previousEnergy = 100; int movementDirection = 1; int gunDirection = 1; int hurt=0; int hurtEnemy=0; static final int NORMAL = 0; static final int CRAZY = 1; static final int FIRE = 2; static final int RAMFIRE = 3; static final int TRACKFIRE = 4; static final int TRACKER = 5; static final int CORNER = 6; static final int SPINBOT = 7; static final int WALL = 8; //<Corner FIRE RamFire Spinbot Tracker TrackFire> static int corner = 0; // Which corner we are currently using boolean stopWhenSeeRobot = false; // See goCorner() boolean movingForward;//CRAZY METHOD NEEDED int turnDirection = 1;//RAMFIRE String trackName=null;//TRACKER double gunTurnAmt=10;//TRACKER int count = 0; int others; // Number of other robots in the game boolean peek; // Don't turn if there's a robot there double moveAmount; // How much to move //END <Corner FIRE RamFire Spinbot Tracker TrackFire> public void run() { // After trying out your robot, try uncommenting the import at the top, // and the next line: //设置颜色 setBodyColor(Color.black); setGunColor(Color.black); setRadarColor(Color.black); setScanColor(Color.red); // and the next line: //setColors(Color.red,Color.blue,Color.green); trackVector=new Vector(); setTurnGunRight(99999); do { RunMethod(NORMAL); } while (true); } public void RunMethod(int x) { switch(x){ case NORMAL: { setAhead(100); execute(); break;} case CRAZY: {setAhead(40000); movingForward = true; setTurnRight(90); waitFor(new TurnCompleteCondition(this)); setTurnLeft(180); waitFor(new TurnCompleteCondition(this)); setTurnRight(180); waitFor(new TurnCompleteCondition(this)); break;} case FIRE: {turnGunRight(5); break;} case RAMFIRE:{turnRight(5 * turnDirection); break;} case TRACKFIRE:{turnGunRight(10); // Scans automatically break;} case TRACKER: {turnGunRight(gunTurnAmt); count++; if (count > 2) { gunTurnAmt = -10; } if (count > 5) { gunTurnAmt = 10; } if (count > 11) { trackName = null; } break;} case CORNER: {goCorner(); int gunIncrement = 3; for (int i = 0; i < 30; i++) { turnGunLeft(gunIncrement); } gunIncrement *= -1; break;} case SPINBOT: {setTurnRight(10000); // Limit our speed to 5 setMaxVelocity(5); // Start moving (and turning) ahead(10000); break;} case WALL: { moveAmount = Math.max(getBattleFieldWidth(), getBattleFieldHeight()); // Initialize peek to false peek = false; // turnLeft to face a wall. // getHeading() % 90 means the remainder of // getHeading() divided by 90. turnLeft(getHeading() % 90); ahead(moveAmount); // Turn the gun to turn right 90 degrees. peek = true; turnGunRight(90); turnRight(90); break;} } } public void HitMethod(int x,HitRobotEvent e) { switch(x){ case NORMAL: {//NULL break;} case CRAZY: {// If we're moving the other robot, reverse! if (e.isMyFault()) { reverseDirection(); } break;} case FIRE: { double turnGunAmt = normalRelativeAngle(e.getBearing() + getHeading() - getGunHeading()); turnGunRight(turnGunAmt); fire(3); break;} case RAMFIRE:{ if (e.getBearing() >= 0) { turnDirection = 1; } else { turnDirection = -1; } turnRight(e.getBearing()); if (e.getEnergy() > 16) { fire(3); } else if (e.getEnergy() > 10) { fire(2); } else if (e.getEnergy() > 4) { fire(1); } else if (e.getEnergy() > 2) { fire(.5); } else if (e.getEnergy() > .4) { fire(.1); } ahead(40); // Ram him again! break;} case TRACKFIRE:{ // NULL break;} case TRACKER: { if (trackName != null && !trackName.equals(e.getName())) { out.println("Tracking " + e.getName() + " due to collision"); } // Set the target trackName = e.getName(); // Back up a bit. // Note: We won't get scan events while we're doing this! // An AdvancedRobot might use setBack(); execute(); gunTurnAmt = normalRelativeAngle(e.getBearing() + (getHeading() - getRadarHeading())); turnGunRight(gunTurnAmt); fire(3); back(50); break;} case CORNER: goCorner(); int gunIncrement = 3; for (int i = 0; i < 30; i++) { turnGunLeft(gunIncrement); } gunIncrement *= -1; break; case SPINBOT: { if (e.getBearing() > -10 && e.getBearing() < 10) { fire(3); } if (e.isMyFault()) { turnRight(10); } break;} case WALL: { if (e.getBearing() > -90 && e.getBearing() < 90) { back(100); } // else he's in back of us, so set ahead a bit. else { ahead(100); } break;} } } public void goCorner() { // We don't want to stop when we're just turning... stopWhenSeeRobot = false; // turn to face the wall to the "right" of our desired corner. turnRight(normalRelativeAngle(corner - getHeading())); // Ok, now we don't want to crash into any robot in our way... stopWhenSeeRobot = true; // Move to that wall ahead(5000); // Turn to face the corner turnLeft(90); // Move to the corner ahead(5000); // Turn gun to starting point turnGunLeft(90); } /** *onHitWall:撞墙反应事件 */ public void onHitWall(HitWallEvent e) { if(hurt<5) { reverseDirection(); } else { RunMethod(RAMFIRE); } } /** * reverseDirection: Switch from ahead to back & vice versa */ public void reverseDirection() { if (movingForward) { setBack(40000); movingForward = false; } else { setAhead(40000); movingForward = true; } } /** * normalRelativeAngle: Returns angle such that -180 < angle <= 180 */ public double normalRelativeAngle(double angle) { if (angle > -180 && angle <= 180) { return angle; } double fixedAngle = angle; while (fixedAngle <= -180) { fixedAngle += 360; } while (fixedAngle > 180) { fixedAngle -= 360; } return fixedAngle; } /** * normalAbsoluteAngle: Returns angle such that 0 <= angle < 360 */ public double normalAbsoluteAngle(double angle) { if (angle >= 0 && angle < 360) { return angle; } double fixedAngle = angle; while (fixedAngle < 0) { fixedAngle += 360; } while (fixedAngle >= 360) { fixedAngle -= 360; } return fixedAngle; } //根据距离判断火力 public void smartFire(double robotDistance) { if (robotDistance > 200 || getEnergy() < 15) { fire(1); } else if (robotDistance > 50) { fire(2); } else { fire(3); } } public void onHitRobot(HitRobotEvent e) { hurtEnemy=hurtEnemy+1; if(hurtEnemy==1) { HitMethod(FIRE,e); } if(hurtEnemy==2) { HitMethod(RAMFIRE,e); } if(hurtEnemy==3) { HitMethod(FIRE,e); } if(hurtEnemy==4) { HitMethod(SPINBOT,e); } if(hurtEnemy>=5) { HitMethod(TRACKER,e); } if(hurtEnemy==6 && hurt>3) { HitMethod(CRAZY,e); hurtEnemy=0; } } /** * 自定义函数:显示当前敌人的距离 */ public void showTrack() { int i=0; out.println("This Time is "+getTime()); out.println("Track's count is "+trackVector.size()); while(i<trackVector.size()) { Track myTrack=(Track)trackVector.get(i); out.println(myTrack.Name+"'s Distance is "+myTrack.Distance); i++; } } /** * onScannedRobot: What to do when you see another robot */ public void onScannedRobot(ScannedRobotEvent e) { if(!isInVector(e)) { Track myTrack=new Track(); myTrack.update(e); trackVector.add(myTrack); } if(isInVector(e)) { // Stay at right angles to the opponent setTurnRight(e.getBearing()+90-30*movementDirection); // If the bot has small energy drop, // assume it fired double changeInEnergy = previousEnergy-e.getEnergy(); if (changeInEnergy>0 && changeInEnergy<=3) { // Dodge! movementDirection =-movementDirection; setAhead((e.getDistance()/4+25)*movementDirection); } // When a bot is spotted, // sweep the gun and radar gunDirection = -gunDirection; setTurnGunRight(99999*gunDirection); // Fire directly at target fire(3); // Track the energy level previousEnergy = e.getEnergy(); } } /** * onHitByBullet: What to do when you're hit by a bullet */ public void onHitByBullet(HitByBulletEvent e) { turnLeft(90 - e.getBearing()); } /** * isInVector:自定义方法,判断该机器人是否已存在于队列中 */ public boolean isInVector(ScannedRobotEvent e) { int i=0; while(i<trackVector.size()) { Track myTrack=(Track)trackVector.get(i); if(myTrack.Name==e.getName()) { myTrack.update(e); return true; } i++; } return false; } /** * onScannedRobot:有机器人被消灭时产生该事件 */ public void onRobotDeath(RobotDeathEvent event) { int i=0; while(i<trackVector.size()) { Track myTrack=(Track)trackVector.get(i); if(myTrack.Name==event.getName()) { trackVector.remove(i); } i++; } } }