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