|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
接上一节的python小练习继续优化我们的贪食蛇AI程序。
上一节说到还有一个功能没有实现:当蛇头与食物和蛇尾之间都没有路径的时候,怎么办?还能怎么办,既然都没有路径,那当然只能挑能走的路,走一步看一步了呗。所以我们还需要设计一个函数来实现这个目标。
- #当蛇头与食物和蛇尾之间都没有路径时,随便游走
- def go_anywhere():
- global body,dire
- head = body[0]
- for i in ddict:
- hx,hy = head[0]+ddict[i][0],head[1]+ddict[i][1]
- if 0<=hx<Height and 0<=hy<Width and [hx,hy] not in body:
- go = [hx,hy]
- break
- dx,dy = go[0]-head[0],go[1]-head[1]
- for i in ddict:
- if (dx,dy) == ddict[i]:
- change_dire(i)
- break
复制代码
这样就好了么?还不是,还有一种情况也要考虑,即当食物出现在蛇身旁边1的位置的时候,去直接吃食物还是很危险的,因为吃了食物以后,蛇会长长,很有可能就会撞上自己。这时候就需要有个函数能判断是否食物出现在自己身边,如果是,就还是去追蛇尾,如果不是,才去吃食物。
- #检查食物是否紧挨蛇身
- def near_check():
- global food,body
- near = False
- for i in ddict:
- fx,fy = food[0][0]+ddict[i][0],food[0][1]+ddict[i][1]
- if [fx,fy] in body[1:-1]:
- near = True
- return near
复制代码
这样基本上就完成了本次优化,当然优化后的蛇还做不到,如之前gif图片中的那条蛇那么智能,只是相比之前的AI有了大幅度的提高,而且食物的放置本身也有随机性,陷入死局也是时有发生的。
如果还想继续改进也还是有空间的,比如可以虚拟一条蛇去吃食物,看看吃晚食物是否还安全,如果安全就派真蛇去吃,不然就重新规划路径,这样还能再提升AI一个等级,如果有兴趣,这个优化就留给广大鱼油去做了。
为了加速测试,我还写了一个打印函数,这样每次运行可以把结果输出到文本中,方便查看。当然你也可以关闭time.sleep(),关闭show(),只显示结果,例如:
- Welcome to play Greedy Snake!
- Your score: 3931
- ----------------------
- |oooooooooooooo |
- |ooooooo o |
- |oOooooo @o |
- |ooooooo o |
- | oooooo oooo |
- | oo ooooo |
- | o oo |
- | o oo |
- |ooooooooo o |
- |oooooooooooooo |
- ----------------------
复制代码
附上带注释的完整代码:
|
评分
-
查看全部评分
|