Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. package Robot;
  2. import robocode.*;
  3. import robocode.DeathEvent;
  4. import robocode.ScannedRobotEvent;
  5. import robocode.util.Utils;
  6.  
  7. import java.awt.*;
  8. import java.awt.geom.Point2D;
  9.  
  10. import static java.lang.Math.signum;
  11. import static java.lang.Math.toRadians;
  12.  
  13. import java.util.Random;
  14. public class MyFirstRobot extends AdvancedRobot{
  15. private static final double RADIANS_5 = toRadians(5);
  16. final Random random = new Random();
  17. private boolean isAlive = true;
  18.  
  19. private double enemyX = -1;
  20. private double enemyY = -1;
  21.  
  22. @Override
  23. public void run() {
  24. setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
  25. while (isAlive) {
  26.  
  27. if (enemyX > -1) {
  28. final double radarTurn = getRadarTurn();
  29. setTurnRadarRightRadians(radarTurn);
  30. final double bodyTurn = getBodyTurn();
  31. setTurnRightRadians(bodyTurn);
  32.  
  33. if (getDistanceRemaining() == 0) {
  34. final double distance = getDistance();
  35. setAhead(distance);
  36. final double gunTurn = getGunTurn();
  37. setTurnGunRightRadians(gunTurn);
  38. setFire(2);
  39.  
  40. }
  41. }
  42.  
  43. }
  44.  
  45.  
  46. execute();
  47. }
  48.  
  49.  
  50.  
  51. private double getRadarTurn() {
  52.  
  53. final double alphaToEnemy = angleTo(getX(), getY(), enemyX, enemyY);
  54.  
  55. final double sign = (alphaToEnemy != getRadarHeadingRadians())
  56. ? signum(Utils.normalRelativeAngle(alphaToEnemy - getRadarHeadingRadians()))
  57. : 1;
  58.  
  59.  
  60. return Utils.normalRelativeAngle(alphaToEnemy - getRadarHeadingRadians() + RADIANS_5 * sign);
  61.  
  62. }
  63.  
  64. @Override
  65. public void onScannedRobot(ScannedRobotEvent event) {
  66.  
  67.  
  68. final double alphaToEnemy = getHeadingRadians() + event.getBearingRadians();
  69.  
  70.  
  71. enemyX = getX() + Math.sin(alphaToEnemy) * event.getDistance();
  72. enemyY = getY() + Math.cos(alphaToEnemy) * event.getDistance();
  73. }
  74.  
  75. @Override
  76. public void onDeath(DeathEvent event) {
  77. isAlive = false;
  78. }
  79.  
  80. @Override
  81. public void onPaint(Graphics2D g) {
  82.  
  83.  
  84. if (enemyX > -1) {
  85. g.setColor(Color.WHITE);
  86. g.drawRect((int) (enemyX - getWidth() / 2), (int) (enemyY - getHeight() / 2), (int) getWidth(), (int) getHeight());
  87. }
  88. }
  89.  
  90. private static double angleTo(double baseX, double baseY, double x, double y) {
  91. double theta = Math.asin((y - baseY) / Point2D.distance(x, y, baseX, baseY)) - Math.PI / 2;
  92. if (x >= baseX && theta < 0) {
  93. theta = -theta;
  94. }
  95. return (theta %= Math.PI * 2) >= 0 ? theta : (theta + Math.PI * 2);
  96. }
  97. private double getDistance() {
  98.  
  99. return 200 - 400 * random.nextInt();
  100. }
  101.  
  102. private double getBodyTurn() {
  103.  
  104. final double alphaToMe = angleTo(enemyX, enemyY, getX(), getY());
  105.  
  106.  
  107. final double lateralDirection = signum((getVelocity() != 0 ? getVelocity() : 1) * Math.sin(Utils.normalRelativeAngle(getHeadingRadians() - alphaToMe)));
  108.  
  109. final double desiredHeading = Utils.normalAbsoluteAngle(alphaToMe + Math.PI / 2 * lateralDirection);
  110.  
  111. final double normalHeading = getVelocity() >= 0 ? getHeadingRadians() : Utils.normalAbsoluteAngle(getHeadingRadians() + Math.PI);
  112.  
  113. return Utils.normalRelativeAngle(desiredHeading - normalHeading);
  114. }
  115. private double getGunTurn() {
  116.  
  117. return Utils.normalRelativeAngle(angleTo(getX(), getY(), enemyX, enemyY) - getGunHeadingRadians());
  118. }
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement