正文

Robocode初探体会2007-04-20 10:33:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/freeeerf/25022.html

分享到:

今天下午终于以失败告终停止了对我的坦克的修改,几天的沉浮终于结束了,到初赛时候,坦克是被人撞死还是在角落里被人逼死,就只能听天由命了.与那个失败的坦克共度了多少时光,如今伊人始去,我得写一篇祭文,以慰坦克在地之灵. 坦克纷纭,几百像素见方的战场上我们主要做三件事,坦克运行,雷达扫瞄,炮管开火,暂以doMove(),doScan(),doFire()为实现的方法名.而代码编写在两个地方,一个是run()里的循环(我称它为主循环),一个是各个事件触发运行的函数(如onScanRobot()),这是与以前写程序最不同的地方,以前写程序大脑用一个代码寄存器就行了,此行代码运行时彼代码绝不可能同时运行,一个变量未修改之前,其后代码中的变量值绝不会变,现在一个程序的不同地方可以同时运行了(虽然究其底层实现,一个CPU同一时间只能运行一个代码,但在功能上外观上感觉上确实可以看作是同时运行).如果把doScan()放在onScanRobot()里,当扫到坦克时进入这个函数,doScan()会被立刻调用,于是雷达被调整,又扫到坦克上,于是再触发onScanRobot()这个函数,于是再调用,似乎陷入一个自我触发的递归中,我不知道如果当前onScanRobot() 没有运行完而又扫到坦克时这个函数会不会继续被调用,如果是那么岂不像传说中的分身术,同一个函数多个实例,一起来运行了.雷达可以一直扫瞄停在对方坦克身上,那么按有事件就触发就调用函数,即然事件恒在发生,那么函数是不是恒在调用呢?游戏分给每个坦克的时间是有限的,那么在这有限的时间是运行事件触发函数还是运行主循环呢?当前是同时运行,但如何同时呢?有次我把doScan()放在onScanRobot()里,然后扫瞄线终于成了一个稳定的扇形(以前把它放在主循环里,扫虛线会跳动闪烁),但坦克却不动了,而主循环里明明有控制运行的doMove(),我在主循环每行代码中间加一个打印变量的语句,结果发现主循环在一个变量赋值处停止了,也就是说一个普通的变量赋值陷入了无限循环的境地!这种问题如果出现在以前写的程序中,那真的得砸电脑了(这样的事都发生那天下岂不是要大乱了),但现在它却实实在在地发生了.难道doScan把时间都抢去了?多线程,我忽然想到,在网上搜了一下,原来是线程互斥的问题,onScanRobot()超快地一遍一遍修改某个全局变量(类的属性),而主循环里也要修改这个值,于是它只能等待了,等它等到机会的时候我的坦克已经被炸成灰了. 解决方法要么不访问全局变量,要么往onScanRobot()时多加点东西让它多运行一点时间,或者还有更好的方法.但如果onScanRobot() 运行时间太长,雷达来不及调整,扫瞄线就会闪烁,或者把doScan()放在主循环里,但我见过一个蛮牛逼的坦克的代码,它把运行,扫瞄,开火都放在onScanRobot()里面,而函数里竟还有个 “for ( double a = 0 ; a < 500 ; a++ ) “,500 次的循环啊,雷达的扫瞄线居然还是一个标准的扇形.谁知道是怎么弄出来的.          坦克的运行和开火也不好做.我不喜欢随机运行(虽然大多数高级特高级的坦克就是用这种移动方式),用代码玩坦克就在用代码控制啊,看着它按照你设定的路线运行多爽,但是无论什么有规则的运行,对方都可能探测到,于是就不得不接受随机运行,还是随到哪里去我想了半天也得不出好的结论,虽然有几个现在的优秀的随机运行机器人的代码可以参考,我还是放弃了.一心想控制随机就不是随机了,而随机不控制就会乱撞,撞到墙不要紧,撞到敌人炮口就麻烦了,敌人的炮口可以探测到,敌人发出去的子弹却探测不到, ,几乎所有的随机运行都会有一二次精确地英勇地撞向敌人的子弹, 随机撞到子弹上也是随机啊.想控制随机运行的坦克不随机撞到子弹上但不知飞行中的子弹在何方,明明知道它可能随机撞到子弹上怎么还好心让它做随机运行.        控制坦克开火的一大乐趣就是看着它将那个叫Walls的坦克枪枪命中打得落花流水,但实际对战中对方不可能一个劲地做直线运行,但又实在舍不得直线预测,于是解决办法只有记录对方信息,算出它的轨迹或者规律然后预测瞄准射击,但实现起来太复杂,这世上有多少种有规则的运行?谁知道. 有种网格统计瞄准是将平面分成网络,然后选择出现概率最高的区域去射击,但这种高级算法对付像Walls这样的低级坦克恐怕一点用处都没有.而高级的虚拟子弹统计或波统计瞄准算法,如此对方是做随机运行,那基本上又是白实现了,谁知道随机运行的坦克下一秒在哪.而大多数的高级坦克又是采用随机运行,怎么好瞄.        不好扫瞄不好运行也不好瞄准,坦克Fun终于带着深深的遗憾在阳光明媚的春天离开了人间.          常常看着两个做随机运行的坦克互相弹来炮往,谁也不想打到对方,最终一个坦克随机地撞上对方的子弹就把自己结果了.恰好其分地证明了那句老话,最大的敌人不是别人而是自己.但是这样岂不是一点玩游戏的快感都没有了?把二只斗牛的眼睛蒙上然后让他们在斗牛场上随机乱撞,一只偶尔撞到对方的利角上死了,那只赢了的公牛估计也会郁闷死.这样一点看头都没有,斗牛场的生意下滑,所以才出现了现在人和牛斗的习惯?估计以前蒙牛的眼睛的布都是红色的,所以公牛们对特别愤恨红颜色的布,于是一看到那东西就朝那个方向准确地冲过去,一扫过去看不敌人的压抑,斗牛场上充满了撕杀的畅快,蓝天上飘浮着悠闲的白云,哈哈哈.

阅读(3174) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册