?? hanicbot.java
字號:
import robocode.*;
public class HanicBot extends AdvancedRobot{
private double eDist; //對方的距離
private double move; //移動的距離
private double radarMove = 45; //雷達(dá)移動的角度
private double dFirePower; //火力
/**
* main func run()
*/
public void run() {
eDist = 300;
while(true){
//每過一個周期,運(yùn)動隨機(jī)的距離
double period = 4*((int)(eDist/80)); //周期;敵人越接近,周期越短,移動越頻繁
//周期開始,則移動
if(getTime()%period == 0){
move = (Math.random()*2-1)*(period*8 - 25);
setAhead(move + ((move >= 0) ? 25: -25));
}
//避免撞墻
double heading = getHeadingRadians(); //取得bot方向的弧度數(shù)
double x = getX() + move*Math.sin(heading); //移動move后將要達(dá)到的x坐標(biāo)
double y = getY() + move*Math.cos(heading); //移動move后將要達(dá)到的y坐標(biāo)
double dWidth = getBattleFieldWidth(); //戰(zhàn)場的寬度
double dHeight = getBattleFieldHeight(); //戰(zhàn)場的長度
//當(dāng)(x,y)超過指定的范圍,則反向移動move
if(x < 30 || x > dWidth-30 || y < 30 || y > dHeight-30){
setBack(move);
}
turnRadarLeft(radarMove); //轉(zhuǎn)動雷達(dá)
}
}//end run()
/**
* 當(dāng)檢測到對方Bot,觸發(fā)事件
* @param e
*/
public void onScannedRobot(ScannedRobotEvent e) {
eDist = e.getDistance(); //取得對方距離
radarMove = -radarMove; //設(shè)置雷達(dá)
double eBearing = e.getBearingRadians(); //取得和對方相對角度的弧度數(shù)
//將bot轉(zhuǎn)動相對的角度,以后bot的運(yùn)動將是以對方為圓心的圓周運(yùn)動
setTurnLeftRadians(Math.PI/2 - eBearing);
//轉(zhuǎn)動炮管指向?qū)Ψ? setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(
getHeadingRadians() + eBearing - getGunHeadingRadians()));
//根據(jù)對方距離射擊
dFirePower = 400/eDist;
if (dFirePower > 3){
dFirePower = 3;
}
fire(dFirePower);
}
}
首先,為了迷惑對方,不讓對方容易的得到Bot的移動規(guī)律,Bot就要在一定的時間內(nèi)做出隨機(jī)的運(yùn)動,這個很容易辦到。并且,我給Bot的運(yùn)動改變時間規(guī)定了周期。這個周期隨離對方的距離改變,敵人越接近,周期越短,移動越頻繁。
double period = 4*((int)(eDist/80));
if(getTime()%period == 0){
move = (Math.random()*2-1)*(period*8 - 25);
setAhead(move + ((move >= 0) ? 25: -25));
}
其次,Bot的運(yùn)動不是呈直線的。而是以對方為圓心的圓周運(yùn)動。
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(
getHeadingRadians() + eBearing - getGunHeadingRadians()));
最后是如何避免撞墻。這里要用到點(diǎn)三角函數(shù)-_-!! 原理就是,計算Bot一次運(yùn)動后將要達(dá)到的坐標(biāo)是不是位于規(guī)定的危險區(qū)域。如果是,則立即反方向運(yùn)動。
double heading = getHeadingRadians();
double x = getX() + move*Math.sin(heading);
double y = getY() + move*Math.cos(heading);
double dWidth = getBattleFieldWidth();
double dHeight = getBattleFieldHeight();
if(x < 30 || x > dWidth-30 || y < 30 || y > dHeight-30){
setBack(move);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -