/** * 当检测到对方bot,触发事件 * @param e */ 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的威力如何?呵呵,我去测试一下先~
好了,就说到这里了,欢迎各大高手来踩……
关于其它的一些"编程游戏" 有许多软件是基于这种思想的,robocode它自己就是来源于机器人大战robot battle()这款软件。其它的编程游戏还包括: · ai fleet commander · ai wars · at-robots · bolo · botwarz · c-robots · cadaver · codedwombat · colobot · corewars · cybwar · grobots · droidbattles · karel the robot · mindrover · intellibots · omega · realtimebattle · robot wars · robowar · srobots · vbrobots 就我所看过的"编程游戏",robocode是最简单上手的。
· 它非常容易上手,是特别为教学而设计的 · 它具有平滑且吸引人的图形 · 它完全地将编辑器,编译器和运行环境集成在了一起。 · 它是由java编写的,且java非常适合当作初学语言
(责任编辑:laiquliu)
|