日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Robocode 超级机器人 “波”统计瞄准算法

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Robocode 超级机器人 “波”统计瞄准算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
獲取當前幀的敵人的位置和自己的位置以及射擊的角度,子彈的速度 每一幀獲取一次 當有足夠多的數據后,根據當前的位置和角度,獲取之前最有可能打中地方的攻擊方式。
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 超级机器人 “波”统计瞄准算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩黄色一区 | 国产成人无遮挡在线视频 | 男男黄网站| 成人中文视频 | 男男做爰猛烈啪啪高 | 97人人草 | 久久久久噜噜噜亚洲熟女综合 | 玖玖色在线 | 淫羞阁av导航 | 婷婷激情丁香 | 二区久久 | h网站在线看 | 中文字幕一区二区三区乱码人妻 | 日本55丰满熟妇厨房伦 | 日韩手机在线观看 | 天天看天天操 | 好吊一区二区三区 | 性做久久久久久久免费看 | 在线观看亚洲av每日更新 | 午夜国产精品视频 | 青青草成人在线观看 | 国产91清纯白嫩初高中在线观看 | 激情综合网五月激情 | 国产视频在线一区二区 | 国产成人av片 | 四十路av| 天天拍天天射 | 国产一区二区三区免费在线观看 | 在线色综合 | 快色av| 精品人妻一区二区三区四区在线 | 亚洲一区二区三区激情 | 亚洲综合大片69999 | 一区二区在线 | 黄色网战在线观看 | 丝袜视频一区 | 成年激情网| 国产精品精品软件视频 | 高h视频在线播放 | 欧美日韩中文国产一区发布 | 国产剧情自拍 | 国语久久 | 日韩香蕉网 | 综合色播 | 91色爱 | 欧美疯狂做受 | 亚洲国产aaa | 九一在线观看免费高清视频 | 操操操综合网 | 久久黄色影院 | 伊人最新网址 | 色花av| 国产一区二区在 | 国产乱一区二区三区 | 日本高清精品 | 97超碰国产在线 | 可以免费看的黄色 | 欧美男女动态图 | 岛国二区 | 欧美精品18videosex性欧美 | 久热这里有精品 | 999久久 | 91夜色 | 极品少妇在线 | 日韩欧美综合 | 在线观看成年人网站 | 国产视频综合在线 | 亚洲啊啊啊啊啊 | 深夜免费在线视频 | 色噜噜色狠狠 | 亚洲成a人v| 日韩伊人久久 | 岛国激情 | 欧美色一区二区三区在线观看 | 日本青草视频 | 日本精品少妇 | 亚洲综合图色40p | 国产成人无码精品久久久久 | 日韩欧美国产高清 | 三上悠亚一区二区在线观看 | 黄色羞羞网站 | 欧美激情影音先锋 | 日本在线不卡一区二区三区 | 色.www | 久久成人小视频 | 麻豆视屏 | 国产91麻豆视频 | 日本aⅴ在线观看 | 少妇太紧太爽又黄又硬又爽小说 | 亚洲综合少妇 | 一个人看的视频www 色就是色网站 | 欧美黄色免费大片 | 日产精品久久久久久久蜜臀 | 天天狠狠干 | 亚洲4p| 国产1区2区 | 手机看片1024国产 | 成人av在线网站 | 国产特黄级aaaaa片免 |