语言选择
Life is short, use python! 所以,根本就没多想,直接上python。
最初版本
先让你的程序跑起来
一开始我的目标仅仅是让程序去控制贪吃蛇运动,让它去吃食物,仅此而已。现在让我们来陈述一下最初的问题:
在一个矩形中,每一时刻有一个食物,贪吃蛇要在不撞到自己的条件下,
找到一条路(未必要最优),然后沿着这条路运行,去享用它的美食
我们先不去想蛇会越来越长这个事实,问题基本就是,给你一个起点(蛇头)和一个终点( 食物),要避开障碍物(蛇身),从起点找到一条可行路到达终点。我们可以用的方法有:
BFS
DFS
A*
为了尽量保持简单,我用的是curses模块,直接在终端进行绘图。
S形运动也是无法让贪吃蛇避免死亡的命运。贪吃蛇可以靠S形运动多存活一段时间,可是由于它的策略是:
while没有按下ESC键:if蛇与食物间有路径:走起,吃食物去else:Wander一段时间
为了能让蛇活得久一些,它还要更高瞻远瞩才行。
高瞻远瞩版本
我们现在已经有了一个比较低端的版本,而且对问题的认识也稍微深入了一些。现在可以进行一些比较慎密和严谨的分析了。
把思路理一理 蛇在运动的过程中,消耗蛇身, 蛇尾后面总是不断地出现新的空间,蛇一长, 就会发现,要想活下来,基本就只能追着蛇尾跑了。(下图 0代表食物,数字代表该位置到达食物的距离,+号代表蛇头,*号代表蛇身, -号代表蛇尾,#号代表空格,外面的一圈#号代表围墙)
## # # # # ##0 1 2 3 4##1 2 3# 5 ##2 3 4 - 6##3 + * * 7##4 5 6 7 8### # # # # #
OK,继续。真蛇派出虚拟蛇去探路后,发现吃完食物后的布局是安全的。那么, 真蛇就直奔食物了。
上面列的好几个问题里都涉及到蛇的行走策略,蛇的行走策略主要分为两种:
1. 目标是食物时,走最短路径2. 目标是蛇尾时,走最长路径
那第三种情况呢?与食物和蛇尾都没路径存在的情况下, 这个时候本来就只是挑一步可行的步子来走,最短最长关系都不大了。
上面还提到一个问题:因为食物是随机出现的,有没可能出现无解的局面?答案是:有。我运行了程序,然后把每一次布局都输出到log,发现会有这样的情况:
## # # # # ##* * * * *##* * - 0 *##* *# + * ##* * * * *##* * * * *### # # # # #
其中,+号是蛇头,-号是蛇尾,*号是蛇身,0是食物,#号代表空格,外面一圈# 号代表墙。这个布局上,食物已经在蛇头面前了,可是它能吃吗?不能!因为它吃完食物后,长度加1,蛇头就会把0的位置填上,布局就变成:
## # # # # ##* * * * *##* * - + *##* *# * * ##* * * * *##* * * * *### # # # # #
由于食物是随机出现的,所以有可能出现上面这种无解的布局。当然了, 你也可以得到完满的结局,贪吃蛇把整个矩形都填充满。
矩形大小10*20,除去外面的边框,也就是8*18。Linux下录完屏再转成GIF格式的图片, 优化前40多M,真心是没法和Windows的比。用下面的命令优化时, 有一种系统在用生命做优化的感觉:
convertoutput.gif-fuzz10%-layersOptimizeoptimised.gif
最后还是拿到Windows下用AE,三下五除二用图片序列合成的动态图片 (记得要在format options里选looping,不然图片是不会循环播放的)
有什么问题欢迎大家评论区留言讨论,支持小编的可以关注一下,以后还会分享更多的好玩的东西给大家,也欢迎大家一起学习哦~
网友评论