嵌入式robocode实训-任务三
文章目錄
- 前言
- 源碼1
- 源碼2
- 源碼1+2
前言
老板的任務罷了-----解讀源碼,闡明原理,自定義展示。
源碼1
以下為我負責的代碼闡明部分,其中的函數均可從robocodeAPI查詢,如INDEX方法
package lyx;//為方便做實驗從sample的Tracker復制例程到我自己包里,僅作小部分修改 import robocode.HitRobotEvent; import robocode.Robot; import robocode.ScannedRobotEvent; import robocode.WinEvent; import static robocode.util.Utils.normalRelativeAngleDegrees; import robocode.*;import java.awt.*;public class Testor extends AdvancedRobot {int count = 0; // 計數器,確切來說是標置double gunTurnAmt; String trackName;//為體現追蹤特點,會記住掃描到的第一個敵人(冤種)public void run() {setBodyColor(new Color(255, 0, 0));//車體顏色稍作更改setGunColor(new Color(0, 0, 250));setRadarColor(new Color(0, 250, 0));setScanColor(Color.blue);setBulletColor(Color.white);trackName = null; // 剛開始沒有目標,目標名字為nullsetAdjustGunForRobotTurn(true); // 炮和身體分離,此外還有setAdjustRadarForGunTurn(true),雷達炮管分離gunTurnAmt = 15; // 每輪炮管旋轉15度while (true) {//循環體,每次都會來一遍對于cout大小的判斷,具體表現為在cout足夠大時,一定先左再右turnGunRight(gunTurnAmt);count++; if (count >18) {trackName =null;//如果超過12了,則會重置目標,再次找一個第一個掃描的敵人為目標,類似饑不擇食}if (count > 10) {gunTurnAmt = 30;//在count在3-11之間時,炮管轉向為左,超過后以更快速度右轉掃描}else if (count > 2) {gunTurnAmt = -20;//右邊轉完45沒找到就左邊轉,轉的快點}}}public void onScannedRobot(ScannedRobotEvent e) {if (trackName != null && !e.getName().equals(trackName)) {//有目標且掃描到的不是當前鎖定目標則不作理會,選擇returnreturn;}if (trackName == null) {//如果沒有目標,則令目標名字等于檢測到的目標,e.getName 推測為獲取檢測到的目標名字trackName = e.getName();out.println("Tracking " + trackName);}// 每次檢測目標都會讓cout歸0,使得下次坦克尋找目標可以讓scan線左右晃動快速搜索count = 0;//重置搜索標志,使scan能有左右掃描找到目標// 如果目標太遠,適當接近目標if (e.getDistance() > 150) {//這個應該讀的掃描瞬間的位置gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading()-getRadarHeading()));//稍后會作該部分解答。turnGunRight(gunTurnAmt); turnRight(e.getBearing());//在本函數范圍內是車體和雷達的相對角度,范圍-180-180度ahead(e.getDistance() - 140);//保持距離150以內return;}//先接近再開火gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));//turnGunRight(gunTurnAmt);fire(3);//彈丸大也是一種優勢,但目前沒考慮彈丸問題,日后會考慮smartfire算法if (e.getDistance() < 150) {//在150單位范圍內根據敵人方位適當進行調整if (e.getBearing() > -90 && e.getBearing() <= 90) {//這代表敵人前方back(40);//敵人在前半部分就后退一定距離} else {ahead(40);//敵人在屁股后就往前開,也是遠離敵人}}scan();}public void onHitRobot(HitRobotEvent e) {//撞別的坦克了trackName = e.getName();//撞擊坦克也會設定目標值gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));//Returns the bearing to the robot you hit, relative to your robot's heading, in degrees (-180 <= getBearing() < 180),不同事件中getBearing代表的意義不同 //這個可以認為是炮臺先跟車體前方對齊再按著車子的姿態角度轉過去,在之前的事件中都是靠雷達發現目標,那個時候e.getBearing() + (getHeading() - getRadarHeading())對應值應該為0turnGunRight(gunTurnAmt);fire(3);back(50);//打完就跑}//嘲諷以下(doge)public void onWin(WinEvent e) {for (int i = 0; i < 50; i++) {turnRight(30);turnLeft(30);}} }源碼2
//為做實驗將crazy例程復制一份并稍作修改 package lyx; import robocode.*; import java.awt.*; import static robocode.util.Utils.normalRelativeAngleDegrees; public class Crazyor2 extends AdvancedRobot {boolean movingForward;double amt=0;public void run() {// Set colorssetBodyColor(new Color(0, 200, 0));setGunColor(new Color(0, 150, 50));setRadarColor(new Color(0, 100, 100));setBulletColor(new Color(255, 255, 100));setScanColor(new Color(255, 200, 200));//顏色和原sample中crazy例程一個色while (true) {setAhead(40000); //設置一個大的前進路程,40000,這樣以后車子會在一段時間內處于前進或者后退狀態 //如果setAhead(40000)在循環之外會存在由于沒撞墻撞車進入reverseDirection()重置前進后退路程情況 //所以我選擇放死循環里面movingForward = true;turnRight(90);//右轉90度,在setahead較小時候才會原地轉,否則就表現為邊走邊轉turnLeft(180);turnRight(180);//setTurnRight(180);//Sets the robot's body to turn right by degrees when the next execution takes place.}}public void onHitWall(HitWallEvent e) {reverseDirection();//撞墻則觸發轉向函數并重置前進的路程,也就是40000}public void reverseDirection() {if (movingForward) {//如果movingforward為true,則前進變后退setBack(40000);movingForward = false;} else {setAhead(40000);movingForward = true;}}public void onScannedRobot(ScannedRobotEvent e) {fire(1);}public void onHitRobot(HitRobotEvent e) {amt=normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));//計算轉向角turnRight(amt);//添加撞車會轉過來開炮功能fire(1);if (e.isMyFault()) {//這個英文意思是--這是我的錯,字面上不好理解具體作用reverseDirection();}}以上兩個例程均有這一行代碼
normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()))getHeading() 與getRadarHeading()
在不同的函數,如onHitRobot-和其他坦克相撞,onScannedRobot-掃描到其他機器人,e.getBearing()返回值具有不同意義:
onHitRobot:
Returns the bearing to the robot you hit, relative to your robot’s heading, in degrees (-180 <= getBearing() < 180),即返回你的機器人正方向,與和你相撞機器人之間的夾角
onScannedRobot:
Returns the bearing to the robot you scanned, relative to your robot’s heading, in degrees (-180 <= getBearing() < 180),返回你的機器人與掃描到的機器人方向之間的夾角
(生怕老板看不懂)
源碼1+2
抱著想嘗試將兩者優點合起來的想法,我把上邊的代碼放在一起試試,并作適當修改讓效果好點
package lyx; import robocode.HitRobotEvent; import robocode.Robot; import robocode.ScannedRobotEvent; import robocode.WinEvent; import static robocode.util.Utils.normalRelativeAngleDegrees; import robocode.*;import java.awt.*;public class Testor2 extends AdvancedRobot {int count = 0;double gunTurnAmt; String trackName;boolean movingForward;public void run() {setBodyColor(new Color(255, 0, 0));setGunColor(new Color(0, 0, 250));setRadarColor(new Color(0, 250, 0));setScanColor(Color.blue);setBulletColor(Color.white);trackName = null;setAdjustGunForRobotTurn(true); gunTurnAmt = 90;movingForward = true;while (true) {setAhead(40000);turnGunRight(gunTurnAmt);count++; turnRight(30);if (count >18) {trackName =null; }turnLeft(30);if (count > 10) {gunTurnAmt = 90;}else if (count > 4) {gunTurnAmt = -90;}turnRight(30);}}public void onHitWall(HitWallEvent e){reverseDirection();}public void reverseDirection(){if (movingForward) {setBack(40000);movingForward = false;} else {setAhead(40000);movingForward = true;} }public void onScannedRobot(ScannedRobotEvent e) {if (trackName != null && !e.getName().equals(trackName)) {return;}if (trackName == null) {trackName = e.getName();}count = 0;gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));turnGunRight(gunTurnAmt); fire(3);scan();}public void onHitRobot(HitRobotEvent e) {trackName = e.getName();gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));turnGunRight(gunTurnAmt);fire(3);if (e.isMyFault()) {reverseDirection();}}public void onWin(WinEvent e) {for (int i = 0; i < 50; i++) {turnRight(30);turnLeft(30);}} }//如你所見就是放在一起了而已,沒想象的絲滑 //此外,編程期間遇見如:public void非法的表達式開始 需要‘;’的錯誤,這里的原因是花括號不一一對應出現問題
以下為battle節選,其中三個機器人對應情況如下:源碼1-Testor ,源碼2-Crazyor2,源碼1+2-Testor2
錄屏
(原來這么糊?!非常抱歉)
從中看出,源碼1Testor的表現其實很穩定,但是為啥源碼1+2的分數最高(如下),剛上手我也不清楚
##總結
robocode平臺在調試和投入使用上還是很方便快捷有意思的,不過對于機器人如何設計以獲得高分這一問題需要一步步尋找答案。同時,也希望能夠就robocode多交流,以提升自身的思維和變成水平。
(老板,如果你看到這里記得給個好評,孩子還有好多事,盡力了5555)
總結
以上是生活随笔為你收集整理的嵌入式robocode实训-任务三的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go 区分指针
- 下一篇: aix oracle监听配置_AIX系统