4天废寝忘食用python解决hacker.org网上的机器人逃跑的游戏心得

国庆这几天,在 python技术交流群里,10月1日,我发现大家在讨论玩hacker.org网上的一个机器人逃跑的小游戏,开始几关试玩了一下,就明白了玩的原理,手动玩到了26关。本来没有打算用编程的方式来解决这个游戏,因为我根本没有想到和注意到这个网页上的flash游戏还可以编程来解答。后来听群里的高手解说了一下,他们还发了自己解决问题时的截图,我就也开始尝试使用python来编程解决这个问题。


最初,想到的是用穷举的办法,因为没有游戏编程的经验。但是这个穷举肯定是不行的。后来就在网上搜索 游戏寻找路径等关键字,让我发现了A*(可以念A星)算法,并找到了这些资料:
我看的资料主要是:js+ajax实现的A*游戏路径算法整理第1/2页 http://www.jb51.net/article/10130.htm
js+ajax实现的A*游戏路径算法整理第2/2页 http://www.jb51.net/article/10130_2.htm
python Astar A* A星 http://www.cnblogs.com/kdy71107216/archive/2011/08/06/2129139.html
用Astar(A*)算法 实现的迷宫最短路。代码比较规范 http://www.cnblogs.com/kdy71107216/archive/2010/08/06/1794447.html
-----
还有很多就是关于list tuple 的操作的基础资料和例子。 
 
用Astar(A*)算法 实现的迷宫最短路。代码比较规范  http://www.cnblogs.com/kdy71107216/archive/2010/08/06/1794447.html
这个是java版的A星算法,会Java的可以看看。 


我的程序是用python实现的,就是照着上面所的那个 js +ajax 版的改的。
整个过程应该分为3个阶段:

1,网上查资料,看资料,消化资料,主要是理解A星算法和把那个js程序改编成python版的。改的时候,主要是解决A星算法中介绍的那个经典例子。


2。开始用编好的python程序,解决最开始的几关游戏,地图不用大,用个6X6就行,通过用纸笔画图,和程序推演,用程序打印运行信息不断的调试和排错,同时也加深对A星算法的理解。直到解决几个小地图的问题并取得路径。我最开始的路径是个坐标值列表,后来又想了个办法把它转化成类似RDRDRD字符串形式逃跑指令。然后又查阅了一些怎么用python下载和保存网页,分析网页链接中的参数等资料,最后就开始驱动程序过关了。


3,程序运行的过程中,需要调优,开始的时候意识不到,以为反正让计算机忙,自己等结果就行了。后来才意识到速度很重要,不然要等到哪年哪月啊。

开始的时候,轻轻松松玩到260多关,200关之前还是很快的,但后来过关时间越来越长,后来过一关就要10多分钟,我以为别人也都是差不多这个时间,就让电脑在那里运行了一个晚上直到天亮,结果程序早就运行出错停在那里了。具体的错误就是什么网页下载错误,无服务等。上午再一问机哥,他说我的太慢了,我就大改了一次,减少了很多循环过程。终于从295关开始只要1分多钟,不过后来慢慢地图大了 ,到460关的时候又跑到10多分钟一关,然后又改动了程序,从460直到500关都是10几秒钟解决了。只有后面的500-513关又到了几分钟,十几分钟。
-----------------------------
python中运行效率的几个瓶颈小函数。
以下的seq指的是list,tuple等序列。
1。seq.count()函数
实际运行中,count函数耗费了很多时间,尤其是seq比较大的时候。如果在循环中用了count函数,那么你的循环将会耗费大量时间。
例如,去除列表中的重复元素的一个函数小片段:
#清除 重复的炸弹,减少循环
# 保持排序
 noDupes = []
 [noDupes.append(i) for i in seq if not noDupes.count(i)]
这一小段,在后面的400多关的时候,总的耗费时间可以达到250多秒,后来我不用count函数,整个程序运行的时间立马降下来了。


2 some in seq,这个in的判断也会耗费很多时间,尤其是seq比较大的时候,具体原因我不知道。反正你可以使用for 循环,在seq中找到了 some后可以break来中断for循环,这个 some in seq,这次在解决这个游戏的时候, 我的seq中是一大串tuple(),就是坐标用(x,y)来表示。结果花的时间很长。

-------------------

这次学习了的资料有:

1.A星算法寻找路径

2.list,tuple的一些操作例子

3.下载网页的函数

4.简单使用python的profile来查看哪些函数耗时间最多.这个对我调优起到了最大的帮助

--------------------

目前对A星算法的理解:

1.主要是计算每个节点的F值,F值=G+H

2.算法中主要做的一件事就是维护2个列表,一个开启列表openlist,里面保存的是还没有测试的节点,一个关闭列表,里面保存的是已经测试过了的点.

3.最终路径,可以通过终点反推到起点得到路径.

4.起始条件可以归到两个重要参数,一个是地图范围,简化点说就是一个矩形范围(简化后,起点和终点变成矩形的两个角),一个是炸弹或者障碍物的列表,有了这两个参数,其他的任何寻找路径的问题都可以使用各种方法转化为A星算法来解决.

-------------

体会主要有:

1、化整为零的解决问题的方法、把不熟悉的问题转化为熟悉的问题的方法。

2、遇到问题,不断学习,触类旁通,从小处着眼解决问题的的思考方法。

3、吸收他人想法,但立足于用自己的代码解决问题,通过自己实践,培养独立解决问题的能力。

-----
2011-10-6


总的来说,这个游戏,以后再回顾,应该是好些人令人难以忘怀的编程经历。我发现群里好几个人都过了。高山仰止,景行行止,我忽然有了正在与高手同行的感觉, 在无边无际的网络世界中, 这种感觉让人觉得 你不是一个人在战斗,你不是孤独的。 希望和大家共勉。


你可能感兴趣的:(java,游戏,编程,算法,list,python)