Python编程入门:一天学会制作贪吃蛇游戏

创始人
2024-12-24 12:03:03
0 次浏览
0 评论

Python教程:1天教你学会用Python实现「贪吃蛇」游戏~

学习Python实现贪吃蛇游戏将是你理解Python语言的一次有趣的实践。
让我们一起探讨如何将编程变成乐趣,而不仅仅是技术学习。
回顾我们的童年,动画片和游戏是我们快乐的源泉。
现在,借助Python这一强大的编程语言,我们可以重现儿时记忆中的贪吃蛇游戏。
使用第三方Python库和框架,例如freegames和turtles,我们将深入学习如何实现喂养和移动随机生成的蛇的游戏逻辑。
本课程旨在注重趣味学习,引导大家快速掌握Python的技术知识。
我们将在课程中探讨:1.如何安装Python的第三方库,为我们的游戏提供更多功能。
2.使用Turtle绘图框架可以让我们直观地在屏幕上绘制贪婪的蛇和食物。
3.Freegames游戏实现框架,通过它我们将构建一个完整的贪吃蛇游戏。
我们的主要讲师,Mr.刘老师,金牌讲师,拥有丰富的软件开发和教学经验。
他的教学风格以实践为导向,理论与实践紧密结合。
您将从他的课程中获得深入的Python知识,并在实践中提高您解决问题的能力。
赶快加入今晚的课程,一起来探索Python世界中贪吃蛇游戏的奥秘吧!

如何用Python写一个贪吃蛇AI

简介

这两天在网上看到一张让人眯眼的图片。
我想大多数人都玩过。
但如果这只是一场贪吃蛇游戏,那就没有什么令人兴奋的了。
事情的要点是,图中看到的贪吃蛇确实很贪吃。
作为一个CSer,首先想到的就是这个东西可以通过写程序来实现(因为普通人做不到,关键是让程序来做)。
如何编写程序来实现,应该使用哪种算法?既然你开始思考了,那就开始行动吧。
因为Talkischeap需要showmethecode。
(跟老鼠叔叔学的)

开始之前,我们再看一下让人站起来的贪吃蛇:(如果下面的动态图效果不太好,那么可以右键保存看看)

语言选择

LifeIsShort,使用Python!于是,我就没有多想,直接上Python了。

初步版本

让你的程序先运行

首先,我们要做的第一件事还不是分析问题。
你应该先写一个可以运行的贪吃蛇游戏,然后再考虑AI部分。
这个应该很简单,cc++只需要一百行左右的代码(如果我没记错的话,没有复杂的界面,直接在控制台下运行就可以了),Python就更简单了,去掉注释和空行5、60行代码,就这样。
而且,最重要的是,这东西绝对是它已被广泛撰写。
无需重新发明轮子,只需获取副本并根据需要进行修改即可。

简单版本

我认为直接编写正确的版本不是一个好主意。
因为理想的版本往往需要考虑的东西很多,所以直接写出来通常会充满bug。
所以,我一开始的目标只是让程序控制蛇的动作,让它吃食物,仅此而已。
现在让我们陈述基本问题:

1

2

在一个长方形里,每时每刻都有一顿饭。
贪婪的蛇必须在不伤害自己的情况下找到出路。

这不一定是最佳选择。
),然后沿着这条路跑去享受它的美味食物

我们不要考虑蛇变长的事实,好吧,问题基本上,你有一个起点(蛇的头)和一个终点(食物)。
你必须避开障碍物(蛇体)并找到一条从起点到终点的可行路径。
我们可以使用的方法有:

BFS

DFS

A*

只要有选择,大多数都会选择先简单解决,我们当前的目标是先运行程序,优化是事后的想法。
那么,让我们从BFS开始。
我们首先将蛇头的位置放入队列中,然后直到队列为空时,我们将蛇头的位置删除,然后将其四个区域中的4个点放入队列中,然后循环操作将继续直到我们到达食物情况。
在这个过程中,我们需要注意以下几点:1、访问所取得的积分将不再被访问。
2.保存每个点的原点节点(即每个位置到达它的位置,以便我们找到可行路径)。
3、蛇身和四壁的地方是难以接近的。

通过BFS找到食物后,你要做的就是让蛇沿着可能的路径走。
这个简单的版本写完之后,蛇就可以快乐的跑一段时间了。
看一下图:(丑陋的感觉来自于录屏软件@_@)

为了尽可能简单,我直接在终端来绘制。
从上面的动态图可以看出,每次都简单地使用BFS最终会导致Snake有一天因为这种粗心和短视的行为而陷入困境。
而且,即便如此,它也只会使用BFS作为策略,因为它此刻看不到目标(食物),它认为这就是它这一生的样子,最终会达到某点它的生命会在某个点停止,不再前进。
(我喜欢讲哲学。
这是一条多么愚蠢的蛇,如果你不多教它一点,它几分钟后就会死掉。
所以,顾名思义,我写了一个Wander函数,名为SnakeTrouble。
)当你陷入困境时,不要再让他成为好朋友,而要让他出去玩,放松一下,思考生活或其他事情,就像你在旅行或其他事情中感到困惑和迷失方向时去工作一样。
当你回来时,你会突然发现地面是平的,房子是可见的

漫游函数可以用任何方式编写,但一定有优点和缺点。
我写了两个版本,一种是在可行范围内向随机方向采取随机步骤。
也就是说,蛇每次移动的方向是随机的,它所走的总步数也是随机的。
逛完再去BFS看看能不能吃,大家就皆大欢喜了。
如果这不起作用,说明你没有足够的时间思考人生,所以再尝试一下流浪吧。
这个过程循环进行。
但就像“随机过程随机通过”一样,如果你“随机徘徊,你就会随机死亡”。
懂得漫步的蛇实际上可以向前移动几步。
但有一天,它会突然结束。
遇到麻烦是可以的,但是当你陷入困境时,就没有回头路了。
因此,对于漫游​​函数的第二个版本,我让贪婪蛇保持贪婪直到最后。
BFS无解后,告诉蛇若干步(步数是随机生成的),让它在空白区域以S形步态行走。
这次的行动方向不是随意的,而是有组织、有纪律的。
我们先看图,再说说它的问题:

是的,终于写完了。
即使是S形的动作也无法阻止蛇的死亡。
贪吃蛇依靠S形运动可以存活一段时间,但是因为它的策略是:

1

2

3

4

5

当未按下ESC键时:

如果有是蛇和食物之间的路径:

顶部边走边吃食物

否则:

闲逛一会儿

问题是蛇会挡在自己之间和食物,二话不说就跑去吃食物。
这还没有考虑到吃完食物后产生的位置(蛇身体的布局)可以彻底杀死你。
(比如进入一个被自己蛇身包围的狭小封闭空间)

因此,蛇要想生存得更久,就需要更有远见。

预见版本

我们现在有了一个低级版本,可以更好地理解问题。
现在是进行更仔细、更严格分析的时候了。
首先,我们列几个问题:(就像头脑风暴一样,想到什么就写下来)

如果蛇和食物之间有路径的话,不建议直接吃食物。
该怎么办?

如果蛇去吃东西并且布局安全,它应该直接吃食物吗?(是否最优?)

如何定义一个布局是否安全?

如果蛇和食物之间没有路径怎么办?

最短路径是最优的吗?(显然不是这样的)

那么,如果布局是安全的,那么最短路径是不是最优的呢?

除了最短路线我们还能怎么走?S码?最长的?

如何处理蛇不断变长的问题?

食物随机出现,难不成是布局无解?

暴力破解能否获得最优序列?(让贪吃的蛇吃尽可能多的食物)

只要你想一想,问题就很多了。
这个时候,让我们用流程化的思维,回答上面的问题来梳理一下思路。
一开始,蛇非常小(初始长度为1),它看到食物,并使用BFS找到矩形内每个位置到达食物的最短路径长度。
如果没有蛇身的阻挡,这就是到曼哈顿的距离。
然后,我必须决定蛇去那里是否安全。
所以我需要一条虚拟蛇,它负责每次寻找路径。
只有在安全的情况下才让真正的蛇逃走。
当然,虚拟蛇不会被绘制出来,它只负责模拟路径探索。
那么,如何将布局定义为安全的呢?如果你仔细观察文章开头的动态图中蛇的疯狂动作,你会发现,尽管最后蛇的身体很长,但它仍然毫无问题地让开。
而且,他还追着蛇尾巴!好吧,其实也不难解释,在蛇的运动过程中,蛇的身体被消耗,蛇尾巴后面总会出现新的地方。
蛇小的时候不要紧,但是当蛇长大的时候,你就会发现,想要生存,基本上就得追蛇的尾巴。
想想你在追蛇尾巴的同时是否可以安全地吃东西。
(下图是一定的BFS后得到的布局。
0代表食物,数字代表距离食物位置的距离,+号代表蛇头,*-号代表蛇的身体,-号代表蛇的尾巴,#号代表空间,外面一圈#号代表墙)

1

2

3

4

5

6

7

#01234#

#123#5#

#234-6#

#3+**7#

#45678#

######

经过上面的分析,我们就可以定义布局是否安全,比如是否是蛇。
可以跟随尾巴的运动,也就是蛇吃完食物后,有什么办法让蛇它位于蛇的头部和尾部之间,所以我认为它是安全的。

好的,继续。
真蛇派虚拟蛇探路,吃完后发现布局安全。
好吧,真正的蛇直接向食物走去。
等等,这是一个好的策略吗?未必。
因为每当蛇移动时,布局就会发生变化。
布局的改变意味着可能有更好的解决方案。
例如,由于蛇吃掉了自己的尾巴,原本需要绕圈才能吃的食物突然变得对蛇来说是可见的。
因此,更好的做法是在真蛇行动后重新启动BFS。
然后在离开前做出与上述相同的安全决定。

接下来让我们考虑一下如果蛇和食物之间没有路径会发生什么?方法其实上面已经解释过了,顺着蛇尾巴走就可以了。
只要蛇和食物之间没有路径,蛇就会一直追着蛇的尾巴。
同样,由于每次移动时布局都会改变,因此每次移动时都会重做BFS以获得最新的布局。

好吧,问题又来了。
如果蛇和食物如果蛇和蛇尾巴之间没有路径怎么办?我别无选择,只能选择一条可行的路。
还是一样的原理,一步一步更新布局,然后判断蛇和食物之间是否有安全路径,如果没有,蛇头和蛇尾之间是否有。
方式;,如果没有,请采取其他可行的步骤。

上面列出的许多问题都涉及蛇的运动策略。
一般我们会让蛇每次都走最短路径。
当蛇去吃东西时会发生这种情况,但当蛇追着自己的尾巴时,它就不能这样想了。
我们希望蛇头在追逐蛇尾的同时移动得尽可能慢。
这样可以在蛇头和蛇尾之间创造更多的空间。
只有拥有更大的空间才能发展。
因此,蛇的移动策略主要分为两种:

1

2

1.当目标是食物时,走最短路线

2。
当目标是蛇的尾巴时,走最长的路

怎么样?第三位置?当无法到达食物或蛇尾时,只需选择当前可行的动作即可,最短或最长并不重要。
至于人为地将蛇扭曲成S形,我认为这不是一个好的策略,它的问题在原始版本中已经分析过。
(当然,除非你想用最无损的版本,那就是完全忽略食物,让蛇继续移动,然后爬上墙。
)旁边留有一条走廊。
这样蛇总能一次性吃完所有的食物,然后就占满了整个空间,但是无聊到没有意义)

还有一个上面提到的问题。
:因为食物是随机出现的,这可能吗?那有没有解决办法呢?答案是肯定的。
我运行程序,将各个布局输出到日志中,发现情况会是这样的:

1

2

3

4

5

6

7

#####

#*****#

#**-0*#

#**#+*#

#*****#

#********#

########

其中,+号为蛇头,-号为蛇头蛇的头是蛇尾,*号是蛇的身体,0是食物,#号代表空间,#号代表外面的墙壁。
这样的布局下,食物已经到了蛇的头前,但是它能吃吗?不能!因为吃完食物后,它的长度增加1,而蛇头的长度会加0。
填充设置后,布局变成:

1

2

3

4

5

6

7

#######

#****##

#**-+*#

#**#**#

#*****#

#****#

######

此时,由于蛇的长度增加了1,所以它的尾巴不动,蛇的头自己旋转,悬在周围。
但是,我们仍然有一个空网格#尚未填充。
根据我们之前教给蛇的策略,面对这种情况,蛇的头只会一直追着蛇的尾巴,每当它和食物之间有一条路径时,它就会让虚拟蛇再次奔跑并找到它。
莱加收到的新布局没有安全感,所以他没有吃食物,而是继续追着蛇的尾巴。
然后他就继续跑。
无限循环,直到按ESC键。

由于食物是随机出现的返回,所以上面可能是一个未解决的布局。
当然,你也可以得到一个圆满的结局,蛇填满了整个矩形。

上面的最后一个问题是暴力法能否得到最优序列。
从上面的分析来看这是可以实现的,但是不能保证一定能实现。

最后看一下望远镜蛇是如何移动的:

矩形的大小为10*20,除了外边框,为8*18.Linux下录屏然后转成GIF格式图片后,优化前的大小超过40MB,这其实是和Windows无法比拟的。
当使用以下命令进行优化时,感觉系统正在用生命进行优化:

Shell

1

convertoutput.gif-fuzz10%-layersOptimizeoptimized.gif

最后得到了WindowsFound下使用AE合成的动态图像,使用图片序列3次五乘二(记得在FormatOptions中选择Looping,否则图片不会循环运行)

最后但并非最不重要的

如果您对源代码感兴趣,请查看以下点击链接:Codegoeshere

另外,本文中的snake程序使用了curses模块,类Unix系统默认安装,使用该模块的windows童鞋需要安装并发送地址:如果需要骂人请戳我

上面的代码还是可以改进的(目前注释不到300行,还可以)优化也可以少一些),也可以做到使用pygame或pyglet库,使界面更加美观,享受!

python贪吃蛇的源代码(简单的小游戏)

简单易懂的Python贪吃蛇源码示例,快速了解游戏实现细节:让我们开始编写Python贪吃蛇游戏代码,简单易懂,适合初学者参考:此HTML代码片段包含Python贪吃蛇游戏代码基本框架包括初始化pygame、处理事件、控制游戏循环和游戏结束逻辑。
有兴趣学习的朋友可以直接以这段代码为起点进行理解和拓展。
文章标签:
Python 贪吃蛇
热门文章
1
Python编程入门:全面解析Pytho... python的基本语法基本的Python语法如下:1.变量的定义。在编程语言中,...

2
Python字典操作全解析:添加、修改、... Pythondict字典基本操作(包括添加、修改、删除键...

3
Python错误处理与异常处理:构建稳定... 2.5错误处理与异常在编程领域,错误处理和异常处理是保证程序稳定性和健壮性的关键...

4
Python数据转换攻略:字符串、列表、... Python字典、字符串及列表的相互转换Python中数据转换的艺术:从字典和字...

5
Python列表相加与求和技巧解析 重温python基础:列表相加的方法(两个list[]加法)今天,我们来看看Py...

6
Python运行快捷键大揭秘:高效操作,... python运行按哪个键运行Python时的快捷键包括Ctrl+Shift+F1...

7
Python字符与数字互转攻略:轻松掌握... python 字符与数字如何转换Python是一种功能强大且结...

8
Python字符串转列表:两种常用方法解... python怎么将字符串转换为列表Python中将字符串转换为列表的方法有多种,...

9
Python字符串转列表:两种常用方法解... python怎么将字符串转换为列表在Python中将字符串转换为列表的方法有很多...

10
Python列表转字符串全攻略:掌握四种... Python列表到字符串–如何在Python中转换列表在Python中,将列表转...