Robocode 直线瞄准机器人
生活随笔
收集整理的這篇文章主要介紹了
Robocode 直线瞄准机器人
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
該方法是直線瞄準算法
使用Walls機器人以及下面算法的機器人
//戰場類 package?type.com.xalead; public class Enemy { //?????public static void main(String[] args) { //???????????Enemy e1 = new Enemy(); //???????????Enemy e2 = new Enemy(); //???????????Enemy e3 = new Enemy(); //???????????Enemy e4 = new Enemy(); //??????????? //???????????e1.PI = 3.14159265; //???????????System.err.println(e2.PI); //???????????Enemy.PI = 333; //???????????Enemy.work(); //?????} //?????static double PI = 3.14; //?????public static void work(){} ???????//attribute ???????private double bearing; ???????private double distance = 3000; ???????private double heading; ???????private double speed; ??????? ??????? ???????public double getSpeed() { ?????????????return speed; ???????} ???????public void setSpeed(double speed) { ?????????????this.speed = speed; ???????} ???????public double getDistance() { ?????????????return distance; ???????} ???????public void setDistance(double distance) { ?????????????this.distance = distance; ???????} ???????public double getHeading() { ?????????????return heading; ???????} ??????? ???????//property ???????public void setHeading(double heading) { ?????????????if(!(heading < 0.0)){ ????????????????????this.heading = heading; ?????????????} ???????} ??????? ???????/** ??????? * bearing錕斤拷錕斤拷錕斤拷錕� ??????? * @return ??????? */ ???????public double getBearing(){ ?????????????return this.bearing; ???????} ???????/** ??????? * bearing錕斤拷錕斤拷錕� ??????? * @param bearing ??????? */ ???????public void setBearing(double bearing){ ?????????????this.bearing = bearing; ???????} }//測試機器人 package?type.com.xalead; import java.awt.geom.Point2D; import robocode.AdvancedRobot; import robocode.Rules; import robocode.ScannedRobotEvent; import robocode.util.Utils; public class TestRobot extends AdvancedRobot { ???????public static void main(String[] args) { ?????????????// double a = Math.tan(Math.toRadians(135)); ?????????????// System.err.println(a); ?????????????// double a = Math.toDegrees(Math.atan2(10, -10)); ?????????????// System.err.println(a); ?????????????System.out.println(Math.random()); ???????} ???????private double time1 = 0; ???????private Enemy enemy = new Enemy(); ???????private boolean discover = false; ???????private double heading = 0.0; ???????private double radarHeading = 0.0; ???????private double bPower = 3; ???????private double time = 0; ???????private double distance = 3000; ???????@Override ???????public void onScannedRobot(ScannedRobotEvent e) { ?????????????discover = true; ?????????????preTime = time1; ?????????????time1 = getTime(); ?????????????enemy.setBearing(e.getBearingRadians()); ?????????????enemy.setSpeed(e.getVelocity()); ?????????????enemy.setDistance(e.getDistance()); ? ? ? ? ? ? ?preHeading = enemy.getHeading(); ?????????????enemy.setHeading(e.getHeadingRadians()); ?????????????time = distance / Rules.getBulletSpeed(bPower); ???????} //裝飾方法 ???????private void dressing() { ???????} //旋轉方法 ???????private void severance() { ?????????????setAdjustGunForRobotTurn(true); ?????????????setAdjustRadarForGunTurn(true); ???????} //簡單移動的方法 ???????private void simpleMove() { ?????????????double increment = 0; ?????????????if (enemy.getBearing() > 0) { ????????????????????increment = Math.PI / 2 - enemy.getBearing(); ????????????????????setTurnLeftRadians(increment); ?????????????} else { ????????????????????increment = Math.PI / 2 + enemy.getBearing(); ????????????????????setTurnRightRadians(increment); ?????????????} ?????????????setAhead(1000); ???????} ???????private double safDis = 100;//安全距離 ?? ?? ?//高級移動方法 ???????private void movement() { ?????????????if (getDistanceRemaining() < 1) { ????????????????????double nx = 0; ????????????????????double ny = 0; ????????????????????nx = Math.random() * (getBattleFieldWidth() - 2 * safDis) + safDis; ????????????????????ny = Math.random() * (getBattleFieldHeight() - 2 * safDis) + safDis; ????????????????????double headArg = 90 - Math.atan2(ny - getY(), nx - getX()); ????????????????????headArg = Utils.normalAbsoluteAngle(headArg); ????????????????????double dis = Point2D.distance(getX(), getY(), nx, ny); ????????????????????if (headArg - getHeadingRadians() > Math.PI / 2) { ???????????????????????????setTurnRightRadians(headArg - getHeadingRadians() + Math.PI); ???????????????????????????setAhead(-dis); ????????????????????} else { ???????????????????????????setTurnRightRadians(headArg - getHeadingRadians()); ???????????????????????????setAhead(dis); ????????????????????} ?????????????} ???????} ???????private void doScan() { ?????????????if (discover) { ????????????????????heading = this.getHeadingRadians(); ????????????????????radarHeading = this.getRadarHeadingRadians(); ????????????????????double temp = radarHeading - heading - enemy.getBearing(); ? ? ? ? ? ? ? ? ? ? temp = Utils.normalRelativeAngle(temp); ????????????????????temp *= 1.2; ????????????????????setTurnRadarLeftRadians(temp); ?????????????} ???????} ???????private double firePower() { ?????????????return bPower; ???????} ???????/** ??????? *? ??????? */ ???????private double immidate() { ?????????????double increment = heading + enemy.getBearing() ???????????????????????????- getGunHeadingRadians(); ?????????????increment %= 2 * Math.PI; ?????????????increment = Utils.normalRelativeAngle(increment); ?????????????return increment; ???????} ???????/** ??????? * 開槍 ??????? */ ???????private void gun() { ?????????????// double increment = immidate(); ?????????????double increment = line(); ?????????????setTurnGunRightRadians(increment); ???????} ??????? ???????private double? preHeading = 0.0;//錕斤拷錕斤拷 ???????private double preTime = 0.0;//前一錕斤拷時錕斤拷 ??????? ???????/* ???????*曲線射擊 ???????*/ ???????private double circle(){ ?????????????double t = 0.0; ?????????????double ea = Utils.normalAbsoluteAngle(getHeadingRadians() + enemy.getBearing()); ?????????????double ex = getX() + enemy.getDistance() * Math.sin(ea); ?????????????double ey = getY() + enemy.getDistance() * Math.cos(ea); ?????????????double offsetHeading = enemy.getHeading() - preHeading; ?????????????double dv = offsetHeading /(time1 - preTime); ?????????????if(Math.abs(dv)<0.00001){ ????????????????????dv+=0.00001; ?????????????} ?????????????double r = enemy.getSpeed()/dv; ?????????????double preDistance= enemy.getDistance(); ?????????????for(int i = 0; i<8;i++){ ?????????????double bulletTime = preDistance / Rules.getBulletSpeed(bPower); ?????????????double nextHeading = enemy.getHeading()+dv*bulletTime; ?????????????double nextx = ex + r * Math.cos(enemy.getHeading())- r * Math.cos(nextHeading); ?????????????double nexty = ey + r * Math.sin(nextHeading)- r * Math.cos(enemy.getHeading()); ?????????????preDistance = Point2D.distance(getX(), getY(),nextx, nexty); ?????????????t = Math.atan2(nexty - getY(), nextx - getX()); ???????} ?????????????return Utils.normalRelativeAngle((Math.PI / 2 - t - getGunHeadingRadians()) ???????????????????????????% (2 * Math.PI));??? ???????} ???????/** ??????? * 直線射擊 ??????? * ??????? * @return ??????? */ ???????private double line() { ?????????????double ea = Utils.normalAbsoluteAngle(getHeadingRadians() + enemy.getBearing()); ?????????????double ex = getX() + enemy.getDistance() * Math.sin(ea); ?????????????double ey = getY() + enemy.getDistance() * Math.cos(ea); ?????????????double s = 0; ?????????????if (enemy.getSpeed() >= Rules.MAX_VELOCITY - 0.1) { ????????????????????s = enemy.getSpeed() * time; ?????????????} else if (enemy.getSpeed() > 0.0) { ????????????????????double as = (Math.pow(Rules.MAX_VELOCITY, 2) - Math.pow( ?????????????????????????????????enemy.getSpeed(), 2)) ?????????????????????????????????/ 2 * Rules.ACCELERATION; ????????????????????double vs = (time - (Rules.MAX_VELOCITY - enemy.getSpeed()) ?????????????????????????????????/ Rules.ACCELERATION) ?????????????????????????????????* Rules.MAX_VELOCITY; ????????????????????s = as + vs; ?????????????} else { ????????????????????s = 0.0; ?????????????} ?????????????double nextx = ex + s * Math.sin(enemy.getHeading()); ?????????????double nexty = ey + s * Math.cos(enemy.getHeading()); ?????????????distance = Point2D.distance(getX(), getY(), nextx, nexty); ?????????????double t = Math.atan2(nexty - getY(), nextx - getX()); ?????????????return Utils.normalRelativeAngle((Math.PI / 2 - t - getGunHeadingRadians()) ???????????????????????????% (2 * Math.PI)); ???????} ???????public void run() { ??????? ?????????????dressing(); ??????? ?????????????severance(); ????????????? ?????????????// setTurnRadarLeft(400); ?????????????// execute(); ?????????????while (true) { ????????????????????if (!discover) { ???????????????????????????setTurnRadarLeftRadians(Math.PI * 2.1); ???????????????????????????execute(); ????????????????????} else { ??????????????????????????? ???????????????????????????movement(); ??????????????????????????? ???????????????????????????double fire = firePower(); ???????????????????? ???????????????????????????doScan(); ??????????????????????????? ???????????????????????????gun(); ???????????????????????????// if (getGunTurnRemaining() <= 0) { ???????????????????? ???????????????????????????setFire(fire); ???????????????????????????execute(); ???????????????????????????// } ??????????????????????????? ???????????????????????????loseTarget(); ???????????????????????????execute(); ????????????????????} ?????????????} ???????} ???????private void loseTarget() { ?????????????if ((getTime() - time1) >= 4) ????????????????????discover = false; ???????} } 運行界面:
運行結果:
總結
以上是生活随笔為你收集整理的Robocode 直线瞄准机器人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: threejs纹理
- 下一篇: 符号_液压图形符号识别之减压阀符号原理