Robocode 超级机器人 “波”统计瞄准算法
生活随笔
收集整理的這篇文章主要介紹了
Robocode 超级机器人 “波”统计瞄准算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
獲取當前幀的敵人的位置和自己的位置以及射擊的角度,子彈的速度
每一幀獲取一次
當有足夠多的數據后,根據當前的位置和角度,獲取之前最有可能打中地方的攻擊方式。
Robocode????模式匹配和隨機移動 波保存敵人的起始點、自己的起始點、與敵人的絕對夾角、敵人的距離、發現敵人的時間、射擊角度、速度的水平分量、速度的垂直分量
//超級機器人? 波統計瞄準算法 package com.xalead.superrobot; import java.awt.geom.Point2D; import com.xalead.superrobot.model.Battle; import robocode.AdvancedRobot; import robocode.ScannedRobotEvent; import robocode.util.Utils; public class WaveSurfing extends AdvancedRobot{ ???????private Battle battle = null; ???????//子彈能量 ???????public static double BULLET_POWER = 2; ???????public void run(){ ?????????????battle = new Battle(this); ?????????????setAdjustGunForRobotTurn(true); ?????????????setAdjustRadarForGunTurn(true); ?????????????turnRadarRightRadians(Double.POSITIVE_INFINITY); ???????} ???????public void onScannedRobot(ScannedRobotEvent e){ ?????????????//雷達鎖定 ??????????????setTurnRadarRightRadians(Utils.normalRelativeAngle((e.getBearingRadians() + getHeadingRadians() -getRadarHeadingRadians()))*2); ?????????????//更新敵人位置坐標 ?????????????battle.update(e); ?????????????//創建波 ?????????????battle.createWave(e); ?????????????movement(); ?????????????//獲得最佳匹配角并射擊 ?????????????setFire(e.getDistance()<100 ?3 : BULLET_POWER); ?????????????setTurnGunRightRadians(battle.getBestMatchFireAngle()); ???????} ???????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); ????????????????????} ?????????????} ???????} }
//戰場要素 package com.xalead.superrobot.model; import java.awt.geom.Point2D; import java.awt.geom.Point2D.Double; import com.xalead.superrobot.Wave; import com.xalead.superrobot.util.ArrayList; import com.xalead.superrobot.util.Iterator; import robocode.AdvancedRobot; import robocode.ScannedRobotEvent; import robocode.util.Utils; public class Battle { ???????private AdvancedRobot robot =null; ???????private double battleFieldWidth; ???????private double battleFieldHeight; ???????//保存射擊角度的模式庫 ???????private ArrayList? fireAngle = new ArrayList(); ???????public Battle(){} ???????public Battle(AdvancedRobot robot) { ?????????????this.robot = robot; ?????????????this.battleFieldHeight = robot.getBattleFieldHeight(); ?????????????this.battleFieldWidth = robot.getBattleFieldWidth(); ???????} ???????public AdvancedRobot getRobot() { ?????????????return robot; ???????} ???????public void setRobot(AdvancedRobot robot) { ?????????????this.robot = robot; ???????} ???????public double getBattleFieldWidth() { ?????????????return battleFieldWidth; ???????} ???????public void setBattleFieldWidth(double battleFieldWidth) { ?????????????this.battleFieldWidth = battleFieldWidth; ???????} ???????public double getBattleFieldHeight() { ?????????????return battleFieldHeight; ???????} ???????public void setBattleFieldHeight(double battleFieldHeight) { ?????????????this.battleFieldHeight = battleFieldHeight; ???????} ???????//敵人最新的所在的位置 ???????private Point2D.Double ePos = null; ???????/* ??????? * 敵人速度的水平分量 ??????? * */ ???????private double dist;//距離 ???????//敵人速度的垂直分量 ???????private double velSeg; ???????//敵人速度的水平分量 ???????private double adSeg ; ???????private double absBearing;//敵人的所在方向的絕對夾角 ???????public void update(ScannedRobotEvent e) { ?????????????absBearing? = e.getBearingRadians();//夾角 ?????????????dist = e.getDistance();//距離 ?????????????compute(dist,absBearing += robot.getHeadingRadians()); ?????????????velSeg = e.getVelocity() * Math.cos(e.getHeadingRadians() - absBearing); ?????????????adSeg = e.getVelocity() * Math.sin(e.getHeadingRadians() - absBearing); ???????} ???????public void createWave(ScannedRobotEvent e) { ?????????????Wave wave = new Wave(this); ?????????????//雷達鎖定敵人 ?????????????if(robot.getGunHeat() <= 0){ ????????????????????wave.setStartTime(robot.getTime());//記錄創建波的時間 ????????????????????wave.setVelSeg(velSeg);//記錄敵人速度的水平分量 ????????????????????wave.setAdSeg(adSeg);//記錄敵人速度的垂直分量 ????????????????????wave.setMyStartPos(new Point2D.Double(robot.getX(),robot.getY()));//記錄創建波時我們的起始位置 ????????????????????wave.setDist(dist);//敵人的距離 ????????????????????wave.setAbsBearing(absBearing);//敵人所在方向的絕對夾角 ????????????????????robot.addCustomEvent(wave); ?????????????} ???????} ???????/* ??????? * 獲得最佳匹配射擊角 ??????? * */ ???????public double getBestMatchFireAngle(){ ?????????????double aim =0; ?????????????double distance;//存儲歐幾里德距離 ?????????????//定義一個匹配,初始化成一個非常大的值 ?????????????double maxMatch = java.lang.Double.POSITIVE_INFINITY; ?????????????Iterator iter = fireAngle.iterator(); ?????????????while(iter.hasNext()){ ????????????????????Wave w = iter.next(); ????????????????????//計算歐幾里德距離,匹配信號相似度 ????????????????????distance = Math.pow(velSeg - w.getVelSeg(),2)+Math.pow((adSeg - w.getAdSeg()),2)+Math.pow((w.getDist() - dist)/200,2); ????????????????????if(distance < maxMatch){ ???????????????????????????maxMatch = distance; ???????????????????????????aim = w.getAngle(); ????????????????????} ?????????????} ?????????????return Utils.normalRelativeAngle(absBearing - robot.getGunHeadingRadians() + aim); ???????} ??????? ???????/*計算敵人坐標位置 ??????? * dist 敵人的距離 ??????? * d 敵人方向的絕對角 ??????? * return 敵人的位置 ??????? * */ ???????public Point2D.Double compute(double dist, double d) { ?????????????return this.ePos = new Point2D.Double(robot.getX() + dist * Math.sin(d),robot.getY() + dist *Math.cos(d)); ???????} ???????public ArrayList getFireAngle() { ?????????????return fireAngle; ???????} ???????public void setFireAngle(ArrayList fireAngle) { ?????????????this.fireAngle = fireAngle; ???????} ???????public Point2D.Double getePos() { ?????????????return ePos; ???????} ???????public void setePos(Point2D.Double ePos) { ?????????????this.ePos = ePos; ???????}? }
//迭代器 package com.xalead.superrobot.util; import com.xalead.superrobot.Wave; public interface Iterator { ???????public boolean hasNext(); ???????public Wave next(); }
//集合 package com.xalead.superrobot.util; import com.xalead.superrobot.Wave; public class ArrayList { ???????private Wave[] waves = new Wave[10]; ???????private int size = 0; ???????public int size(){ ?????????????return size; ???????} ???????public boolean add(Wave wave){ ?????????????if(size < waves.length){ ????????????????????waves[size] = wave; ?????????????} ?????????????if(size >= waves.length){ ????????????????????Wave[] temp = new Wave[waves.length * 2]; ????????????????????for(int i=0; i<waves.length;i++){ ???????????????????????????temp[i]=waves[i]; ????????????????????} ????????????????????temp[size] = wave; ????????????????????waves = temp; ?????????????} ?????????????size++; ?????????????return true; ???????} ???????public boolean remove(Wave wave){ ?????????????for(int i=0;i<size;i++){ ????????????????????if(waves[i] == wave){ ???????????????????????????for(int j =i;j<(size -1);j++){ ?????????????????????????????????waves[j] = waves[j+1]; ???????????????????????????} ???????????????????????????waves[size - 1] =null; ???????????????????????????size--; ???????????????????????????return true; ????????????????????} ?????????????} ?????????????return false; ???????} ???????public Iterator iterator(){ ?????????????return new LIr(); ???????} ???????private class LIr implements Iterator{ ?????????????private int cursor = 0; //???????????public void offset(int offset){ //??????????????????cursor = offset; //???????????} ?????????????public boolean hasNext(){ ????????????????????return cursor < size(); ?????????????} ?????????????public Wave next(){ ????????????????????Wave w = waves[cursor]; ????????????????????if(w != null){ ???????????????????????????cursor++; ????????????????????} ????????????????????return w; ?????????????} ???????}
Robocode????模式匹配和隨機移動 波保存敵人的起始點、自己的起始點、與敵人的絕對夾角、敵人的距離、發現敵人的時間、射擊角度、速度的水平分量、速度的垂直分量
“波”統計瞄準算法進行模式匹配
直線瞄準以及圓周瞄準算法都是全匹配算法
我們將擁有超級機器人“波”統計瞄準算法與直線瞄準和圓周瞄準算法的機器人進行比拼
//傳播波的算法 package com.xalead.superrobot; import java.awt.geom.Point2D; import robocode.AdvancedRobot; import robocode.Condition; import robocode.Rules; import robocode.util.Utils; import com.xalead.superrobot.model.Battle; public class Wave extends Condition{ ???????//自己的起始點坐標 ???????private Point2D.Double myStartPos = null; ???????//創建這個波時敵人的絕對夾角 ???????private double absBearing = 0; ???????//發現敵人的時間 ???????private double startTime; ???????//敵人的距離 ???????private double dist; ???????//速度垂直分量 ???????private double adSeg; ???????//速度的水平分量 ???????private double velSeg; ???????//這個值只有當波碰到敵人時才能產生 ???????private double angle; ???????//戰場模型的引用 ???????private Battle battle = null; ???????//執有機器人的引用 ???????private WaveSurfing robot = null; ???????public Wave(){} ???????public Wave(Battle battle){ ?????????????this.battle = battle; ?????????????robot = (WaveSurfing)battle.getRobot(); ???????} ???????public Point2D.Double getMyStartPos() { ?????????????return myStartPos; ???????} ???????public void setMyStartPos(Point2D.Double myStartPos) { ?????????????this.myStartPos = myStartPos; ???????} ???????public double getAbsBearing() { ?????????????return absBearing; ???????} ???????public void setAbsBearing(double absBearing) { ?????????????this.absBearing = absBearing; ???????} ???????public double getStartTime() { ?????????????return startTime; ???????} ???????public void setStartTime(double startTime) { ?????????????this.startTime = startTime; ???????} ???????public double getDist() { ?????????????return dist; ???????} ???????public void setDist(double dist) { ?????????????this.dist = dist; ???????} ???????public double getAdSeg() { ?????????????return adSeg; ???????} ???????public void setAdSeg(double adSeg) { ?????????????this.adSeg = adSeg; ???????} ???????public double getVelSeg() { ?????????????return velSeg; ???????} ???????public void setVelSeg(double velSeg) { ?????????????this.velSeg = velSeg; ???????} ???????public double getAngle() { ?????????????return angle; ???????} ???????public void setAngle(double angle) { ?????????????this.angle = angle; ???????} ???????public Battle getBattle() { ?????????????return battle; ???????} ???????public void setBattle(Battle battle) { ?????????????this.battle = battle; ???????} ???????//傳播波的算法 ???????public boolean test() { ?????????????System.out.println(battle.getePos().getX() + ":" + battle.getePos().getY()); ?????????????//判斷當前波傳播的距離是否和敵人目前所在位置的距離接近 ?????????????if((robot.getTime() - this.getStartTime()) ???????????????????????????* Rules.getBulletSpeed(robot.BULLET_POWER) >= Point2D.distance( ????????????????????????????????????????battle.getePos().getX(),battle.getePos().getY(), ????????????????????????????????????????myStartPos.getX(),myStartPos.getY())){ ????????????????????this.angle =Utils.normalRelativeAngle(Utils. ??????????????????????????????????normalAbsoluteAngle(Math.atan2(battle.getePos().getX() ???????????????????????????????????????????????- this.myStartPos.getX(),battle.getePos().getY() ???????????????????????????????????????????????- this.myStartPos.getY())) - this.absBearing ); ????????????????????battle.getFireAngle().add(this); ????????????????????robot.removeCustomEvent(this); ?????????????} ?????????????return false; ???????} }//超級機器人? 波統計瞄準算法 package com.xalead.superrobot; import java.awt.geom.Point2D; import com.xalead.superrobot.model.Battle; import robocode.AdvancedRobot; import robocode.ScannedRobotEvent; import robocode.util.Utils; public class WaveSurfing extends AdvancedRobot{ ???????private Battle battle = null; ???????//子彈能量 ???????public static double BULLET_POWER = 2; ???????public void run(){ ?????????????battle = new Battle(this); ?????????????setAdjustGunForRobotTurn(true); ?????????????setAdjustRadarForGunTurn(true); ?????????????turnRadarRightRadians(Double.POSITIVE_INFINITY); ???????} ???????public void onScannedRobot(ScannedRobotEvent e){ ?????????????//雷達鎖定 ??????????????setTurnRadarRightRadians(Utils.normalRelativeAngle((e.getBearingRadians() + getHeadingRadians() -getRadarHeadingRadians()))*2); ?????????????//更新敵人位置坐標 ?????????????battle.update(e); ?????????????//創建波 ?????????????battle.createWave(e); ?????????????movement(); ?????????????//獲得最佳匹配角并射擊 ?????????????setFire(e.getDistance()<100 ?3 : BULLET_POWER); ?????????????setTurnGunRightRadians(battle.getBestMatchFireAngle()); ???????} ???????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); ????????????????????} ?????????????} ???????} }
//戰場要素 package com.xalead.superrobot.model; import java.awt.geom.Point2D; import java.awt.geom.Point2D.Double; import com.xalead.superrobot.Wave; import com.xalead.superrobot.util.ArrayList; import com.xalead.superrobot.util.Iterator; import robocode.AdvancedRobot; import robocode.ScannedRobotEvent; import robocode.util.Utils; public class Battle { ???????private AdvancedRobot robot =null; ???????private double battleFieldWidth; ???????private double battleFieldHeight; ???????//保存射擊角度的模式庫 ???????private ArrayList? fireAngle = new ArrayList(); ???????public Battle(){} ???????public Battle(AdvancedRobot robot) { ?????????????this.robot = robot; ?????????????this.battleFieldHeight = robot.getBattleFieldHeight(); ?????????????this.battleFieldWidth = robot.getBattleFieldWidth(); ???????} ???????public AdvancedRobot getRobot() { ?????????????return robot; ???????} ???????public void setRobot(AdvancedRobot robot) { ?????????????this.robot = robot; ???????} ???????public double getBattleFieldWidth() { ?????????????return battleFieldWidth; ???????} ???????public void setBattleFieldWidth(double battleFieldWidth) { ?????????????this.battleFieldWidth = battleFieldWidth; ???????} ???????public double getBattleFieldHeight() { ?????????????return battleFieldHeight; ???????} ???????public void setBattleFieldHeight(double battleFieldHeight) { ?????????????this.battleFieldHeight = battleFieldHeight; ???????} ???????//敵人最新的所在的位置 ???????private Point2D.Double ePos = null; ???????/* ??????? * 敵人速度的水平分量 ??????? * */ ???????private double dist;//距離 ???????//敵人速度的垂直分量 ???????private double velSeg; ???????//敵人速度的水平分量 ???????private double adSeg ; ???????private double absBearing;//敵人的所在方向的絕對夾角 ???????public void update(ScannedRobotEvent e) { ?????????????absBearing? = e.getBearingRadians();//夾角 ?????????????dist = e.getDistance();//距離 ?????????????compute(dist,absBearing += robot.getHeadingRadians()); ?????????????velSeg = e.getVelocity() * Math.cos(e.getHeadingRadians() - absBearing); ?????????????adSeg = e.getVelocity() * Math.sin(e.getHeadingRadians() - absBearing); ???????} ???????public void createWave(ScannedRobotEvent e) { ?????????????Wave wave = new Wave(this); ?????????????//雷達鎖定敵人 ?????????????if(robot.getGunHeat() <= 0){ ????????????????????wave.setStartTime(robot.getTime());//記錄創建波的時間 ????????????????????wave.setVelSeg(velSeg);//記錄敵人速度的水平分量 ????????????????????wave.setAdSeg(adSeg);//記錄敵人速度的垂直分量 ????????????????????wave.setMyStartPos(new Point2D.Double(robot.getX(),robot.getY()));//記錄創建波時我們的起始位置 ????????????????????wave.setDist(dist);//敵人的距離 ????????????????????wave.setAbsBearing(absBearing);//敵人所在方向的絕對夾角 ????????????????????robot.addCustomEvent(wave); ?????????????} ???????} ???????/* ??????? * 獲得最佳匹配射擊角 ??????? * */ ???????public double getBestMatchFireAngle(){ ?????????????double aim =0; ?????????????double distance;//存儲歐幾里德距離 ?????????????//定義一個匹配,初始化成一個非常大的值 ?????????????double maxMatch = java.lang.Double.POSITIVE_INFINITY; ?????????????Iterator iter = fireAngle.iterator(); ?????????????while(iter.hasNext()){ ????????????????????Wave w = iter.next(); ????????????????????//計算歐幾里德距離,匹配信號相似度 ????????????????????distance = Math.pow(velSeg - w.getVelSeg(),2)+Math.pow((adSeg - w.getAdSeg()),2)+Math.pow((w.getDist() - dist)/200,2); ????????????????????if(distance < maxMatch){ ???????????????????????????maxMatch = distance; ???????????????????????????aim = w.getAngle(); ????????????????????} ?????????????} ?????????????return Utils.normalRelativeAngle(absBearing - robot.getGunHeadingRadians() + aim); ???????} ??????? ???????/*計算敵人坐標位置 ??????? * dist 敵人的距離 ??????? * d 敵人方向的絕對角 ??????? * return 敵人的位置 ??????? * */ ???????public Point2D.Double compute(double dist, double d) { ?????????????return this.ePos = new Point2D.Double(robot.getX() + dist * Math.sin(d),robot.getY() + dist *Math.cos(d)); ???????} ???????public ArrayList getFireAngle() { ?????????????return fireAngle; ???????} ???????public void setFireAngle(ArrayList fireAngle) { ?????????????this.fireAngle = fireAngle; ???????} ???????public Point2D.Double getePos() { ?????????????return ePos; ???????} ???????public void setePos(Point2D.Double ePos) { ?????????????this.ePos = ePos; ???????}? }
//迭代器 package com.xalead.superrobot.util; import com.xalead.superrobot.Wave; public interface Iterator { ???????public boolean hasNext(); ???????public Wave next(); }
//集合 package com.xalead.superrobot.util; import com.xalead.superrobot.Wave; public class ArrayList { ???????private Wave[] waves = new Wave[10]; ???????private int size = 0; ???????public int size(){ ?????????????return size; ???????} ???????public boolean add(Wave wave){ ?????????????if(size < waves.length){ ????????????????????waves[size] = wave; ?????????????} ?????????????if(size >= waves.length){ ????????????????????Wave[] temp = new Wave[waves.length * 2]; ????????????????????for(int i=0; i<waves.length;i++){ ???????????????????????????temp[i]=waves[i]; ????????????????????} ????????????????????temp[size] = wave; ????????????????????waves = temp; ?????????????} ?????????????size++; ?????????????return true; ???????} ???????public boolean remove(Wave wave){ ?????????????for(int i=0;i<size;i++){ ????????????????????if(waves[i] == wave){ ???????????????????????????for(int j =i;j<(size -1);j++){ ?????????????????????????????????waves[j] = waves[j+1]; ???????????????????????????} ???????????????????????????waves[size - 1] =null; ???????????????????????????size--; ???????????????????????????return true; ????????????????????} ?????????????} ?????????????return false; ???????} ???????public Iterator iterator(){ ?????????????return new LIr(); ???????} ???????private class LIr implements Iterator{ ?????????????private int cursor = 0; //???????????public void offset(int offset){ //??????????????????cursor = offset; //???????????} ?????????????public boolean hasNext(){ ????????????????????return cursor < size(); ?????????????} ?????????????public Wave next(){ ????????????????????Wave w = waves[cursor]; ????????????????????if(w != null){ ???????????????????????????cursor++; ????????????????????} ????????????????????return w; ?????????????} ???????}
}
直線瞄準算法與超級機器人:
運行結果:
圓周瞄準算法與超級機器人:
運行界面:
運行結果:
由此可知,算法不同,機器人攻擊能力不一樣,所以全匹配性機器人直線瞄準和圓周瞄準機器人不能打過超級機器人“波”統計瞄準算法。
總結
以上是生活随笔為你收集整理的Robocode 超级机器人 “波”统计瞄准算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python sql语句生成_pytho
- 下一篇: koa --- [MVC实现之一]自定