Robocode 编写机器人 三
2013-04-25 17:37
337 查看
我有个更大胆的假设:因为现在我的Bot命中率还不高,那么如果我的Bot一直不开火,只是躲避对方的子弹的话,能不能拖到对方的能量为0呢?确实存在一点问题。对方子弹一发射,我的Bot就移动,并且这个移动是规律的来回移动。如果移动距离短了,就可能在回来的时候撞到对方的子弹;如果移动距离长了,就等于做一个直线运动,对方很容易计算得到Bot的运动轨迹。还有一个问题,躲避的时候很有可能撞到墙上……(撞墙是要减energy的:)
针对以上的问题,我另写了一个Bot。代码如下:
import robocode.*;
public class HanicBot extends
AdvancedRobot{
private double eDist;
//对方的距离
private double move;
//移动的距离
private double radarMove
= 45; //雷达移动的角度
private double
dFirePower; //火力
public void run() {
eDist
= 300;
while(true){
//每过一个周期,运动随机的距离
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方向的弧度数
double
x = getX() + move*Math.sin(heading); //移动move后将要达到的x坐标
double
y = getY() + move*Math.cos(heading); //移动move后将要达到的y坐标
double
dWidth = getBattleFieldWidth(); //战场的宽度
double
dHeight = getBattleFieldHeight(); //战场的长度
//当(x,y)超过指定的范围,则反向移动move
if(x
< 30 || x > dWidth-30 || y
< 30 || y > dHeight-30){
setBack(move);
}
turnRadarLeft(radarMove);
//转动雷达
}
}//end run()
public void onScannedRobot(ScannedRobotEvent
e) {
eDist = e.getDistance();
//取得对方距离
radarMove = -radarMove;
//设置雷达
double eBearing =
e.getBearingRadians(); //取得和对方相对角度的弧度数
//将bot转动相对的角度,以后bot的运动将是以对方为圆心的圆周运动
setTurnLeftRadians(Math.PI/2
- eBearing);
//转动炮管指向对方
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(
getHeadingRadians()
+ eBearing - getGunHeadingRadians()));
//根据对方距离射击
dFirePower =
400/eDist;
if (dFirePower
> 3){
dFirePower
= 3;
}
fire(dFirePower);
}
首先,为了迷惑对方,不让对方容易的得到Bot的移动规律,Bot就要在一定的时间内做出随机的运动,这个很容易办到。并且,我给Bot的运动改变时间规定了周期。这个周期随离对方的距离改变,敌人越接近,周期越短,移动越频繁。
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的运动不是呈直线的。而是以对方为圆心的圆周运动。
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle)
getHeadingRadians() + eBearing -
getGunHeadingRadians())};
最后是如何避免撞墙。这里要用到点三角函数!
原理就是,计算Bot一次运动后将要达到的坐标是不是位于规定的危险区域。如果是,则立即反方向运动。
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);
}
针对以上的问题,我另写了一个Bot。代码如下:
import robocode.*;
public class HanicBot extends
AdvancedRobot{
private double eDist;
//对方的距离
private double move;
//移动的距离
private double radarMove
= 45; //雷达移动的角度
private double
dFirePower; //火力
public void run() {
eDist
= 300;
while(true){
//每过一个周期,运动随机的距离
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方向的弧度数
double
x = getX() + move*Math.sin(heading); //移动move后将要达到的x坐标
double
y = getY() + move*Math.cos(heading); //移动move后将要达到的y坐标
double
dWidth = getBattleFieldWidth(); //战场的宽度
double
dHeight = getBattleFieldHeight(); //战场的长度
//当(x,y)超过指定的范围,则反向移动move
if(x
< 30 || x > dWidth-30 || y
< 30 || y > dHeight-30){
setBack(move);
}
turnRadarLeft(radarMove);
//转动雷达
}
}//end run()
public void onScannedRobot(ScannedRobotEvent
e) {
eDist = e.getDistance();
//取得对方距离
radarMove = -radarMove;
//设置雷达
double eBearing =
e.getBearingRadians(); //取得和对方相对角度的弧度数
//将bot转动相对的角度,以后bot的运动将是以对方为圆心的圆周运动
setTurnLeftRadians(Math.PI/2
- eBearing);
//转动炮管指向对方
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(
getHeadingRadians()
+ eBearing - getGunHeadingRadians()));
//根据对方距离射击
dFirePower =
400/eDist;
if (dFirePower
> 3){
dFirePower
= 3;
}
fire(dFirePower);
}
首先,为了迷惑对方,不让对方容易的得到Bot的移动规律,Bot就要在一定的时间内做出随机的运动,这个很容易办到。并且,我给Bot的运动改变时间规定了周期。这个周期随离对方的距离改变,敌人越接近,周期越短,移动越频繁。
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的运动不是呈直线的。而是以对方为圆心的圆周运动。
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle)
getHeadingRadians() + eBearing -
getGunHeadingRadians())};
最后是如何避免撞墙。这里要用到点三角函数!
原理就是,计算Bot一次运动后将要达到的坐标是不是位于规定的危险区域。如果是,则立即反方向运动。
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);
}
相关文章推荐
- Robocode 编写机器人
- Robocode 编写机器人 二
- Robocode 编写第一个机器人
- Robocode 游戏编程
- 用Webstorm 9编写WebGL程序,…
- Robocode 安装与运行
- LoadRunner脚本编写&lt;一&gt;--&nbsp;检查点…
- Robocode 入门
- LoadRunner脚本编写&lt;二&gt;--&nbsp;数据类…
- TED 我们都是半机器人
- 【转载】Windows下编写R pack…
- 如何在&nbsp;Eclipse中更快地编写&nbsp;Java&nbsp;…
- ios&nbsp;版得用户登录编写
- Silktest&nbsp;调用&nbsp;VC++&nbsp;编写的DLL文件
- 【转】linux库文件编写入门&nbsp;&amp;&amp;&nbsp;使…
- Linux&nbsp;bootloader&nbsp;编写方法(转)
- 编写跨浏览器兼容的 CSS 代码的金…
- Robocode 参数大揭密
- 编写自己的android&nbsp;jni程序
- LoadRunner脚本编写(6)—&nbsp;数…