美文网首页
神奇,用Python写一个AI贪吃蛇,真的可以追着你跑的那种

神奇,用Python写一个AI贪吃蛇,真的可以追着你跑的那种

作者: IT吴彦祖 | 来源:发表于2020-09-24 19:45 被阅读0次

语言选择

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,不然图片是不会循环播放的)

有什么问题欢迎大家评论区留言讨论,支持小编的可以关注一下,以后还会分享更多的好玩的东西给大家,也欢迎大家一起学习哦~

相关文章

网友评论

      本文标题:神奇,用Python写一个AI贪吃蛇,真的可以追着你跑的那种

      本文链接:https://www.haomeiwen.com/subject/rnetuktx.html