网易首页 > 网易号 > 正文 申请入驻

保姆级教程!用 Python 写个贪吃蛇

0
分享至

本文基于 Windows 环境开发,适合 Python 新手

HelloGitHub 推出的《讲解开源项目》系列,本期介绍 Python 练手级项目——贪吃蛇!

原本想推荐一个贪吃蛇的开源项目:python-console-snake,但由于该项目最近一次更新是 8 年前,而且在运行的时候出现了诸多问题。索性我就动手用 Python 重新写了一个贪吃蛇游戏。

下面我们就一起用 Python 实现一个简单有趣的命令行贪吃蛇小游戏

本文包含设计和讲解,整体分为两个部分:第一部分是关于 Python 命令行图形化库 curses 接着是 snake 相关代码。

一、初识 curses

Python 已经内置了 curses 库,但是对于 Windows 操作系统我们需要安装一个补丁以进行适配。

Windows 下安装补全包:

pip install windows-curses

curses 是一个应用广泛的图形函数库,可以在终端内绘制简单的用户界面。

在这里我们只进行简单的介绍,只学习贪吃蛇需要的功能

如果您已经接触过 curses,请跳过此部分内容。
1.1 简单使用

Python 内置了 curses 库,其使用方法非常简单,以下脚本可以显示出当前按键对应编号:

您也可以尝试把 nodelay(True) 改为 nodelay(False) 后再次运行,这时候程序会阻塞在 stdscr.getch() 只有当您按下按键后才会继续执行。
1.2 整点花样

您也许会觉得上面的例子太菜了,随便用几个 print 都能达到相同的效果,现在我们来整点花样以实现一些使用普通输出无法达到的效果。

1.2.1 新建一个子窗口

说再多的话也不如一张图来的实际:

如果我们想要实现图中 Game over! 窗口,可以使用 newwin 方法:

除了 curses.newwin 新建一个独立的窗口,我们还能在任意窗口上使用 subwin 或者 subpad 方法新建子窗口,例如 stdscr.subwin、 stdscr.subpad、new_win.subwin、new_win.subpad 等等,其使用方法与本节中创建的 new_win 或者 stdscr 没有区别,只是新建窗口使用独立的缓存区,而子窗口和父窗口共享缓存区。

如果某个窗口会在使用后删除,最好使用 newwin 方法新建独立窗口,以防止删除子窗口造成父窗口的缓存内容出现问题。
1.2.2 上点颜色

白与黑的搭配看久了也会显得单调,curses 提供了内置颜色可以让我们自定义前后背景。

在使用彩色模式之前我们需要先使用使用 curses.start_corlor() 进行初始化操作:

需要注意的是,0号 位置颜色是默认黑白配色,无法修改

1.2.3 给点细节

在此部分最后的最后,我们来说说如何给文字加一点文字效果:

二、贪吃蛇

前面说了这么多,现在终于到了我们的主菜。在这部分,我将一步步教给大家如何从零开始做出一个简单却又不失细节的贪吃蛇。

2.1 设计

对于一个项目来讲,相比于尽快动手写下第一行代码不如先花点时间进行一些必要的设计,毕竟结构决定功能,一个项目没有一个良好的结构是没有前途的。

snake 将贪吃蛇这个游戏分为了三大块:

  1. 界面:负责显示相关的所有工作
  2. 游戏流程控制:判断游戏输赢、游戏初始化等
  3. 蛇和食物:移动自身、判断是否死亡、是否被吃等

每一块都被做成了单独的对象,通过相互配合实现游戏。下面让我们来分别看看应该如何实现。

2.2 蛇语者

对于贪吃蛇游戏里面的蛇来讲,它可以做的事情有三种:移动,死亡(吃到自己,撞墙)和吃东西

围绕着这三个功能,我们可以首先写出一个简陋的蛇,其类图如图所示:

这个蛇可以检查自己是不是死亡,是不是吃了东西,以及更新自己的位置信息。

其中,body 和 last_body 是列表,分别存储当前蛇身坐标和上一步蛇身坐标,默认列表第一个元素是蛇头。direction 是当前行进方向,window_size 是蛇可以活动的区域大小。

rest 方法用于重置蛇的状态,它与 __init__ 共同负责蛇的初始化工作:

Position 是我自定义的类,只有 x, y 两个属性,存储一个坐标点
在最开始我们可能只是模糊的感觉应该有这几个属性,但是对于其中的内容和初始化方法又不完全清楚,这是正常的。我们需要做的就是继续实现需要的功能,在实践中添加和完善最初的构想。

之后,我们从继续上到下实现,对照类图,我们接下来应该实现一下 update_snake_pos 即 更新蛇的位置,这部分非常简单:

其实 last_body 可以只记录最后一次修改的身体,这里我偷了个懒

在这里有一个细节,如果我们是第一次写这个函数,为了让蛇头能够正确地按照玩家操作移动,我们需要知道蛇头元素在 x, y 方向上各移动了多少。

最简单的方法是直接一串 if-elif,判断方向再相加:

但是这样的问题在于,如果我们的需求更改(比如我现在说蛇可以一次走两个格子,或者吃了特殊道具 x, y 方向上走的距离不一样等等)直接修改这样的代码会让人很痛苦。

所以在这里更好的解决办法是使用一个 dis_increment_factor 存储蛇再 x 和 y 上各移动多少,并且新建一个函数 get_dis_inc_factor 进行判断:

当然了,这么做或许有点多余,但是努力做到一个函数只做一件事情能帮助化简我们的代码,降低写出又臭又长还难调试代码的可能性。

解决了移动问题,下一步就是考虑贪吃蛇如何吃到食物了,在这里我们用 check_eat_food 和 eat_food 两个函数完成:

在这里,foods 是一个存储着所有食物位置信息的列表,每次蛇体移动后都会调用 check_eat_food 函数检查是不是吃到了某一个食物。

可以发现,检查是不是「吃到」和「吃下去」这两个动作我分为了两个函数,以做到每个函数「一心一意」方便后期修改。

现在,我们的蛇已经能跑能吃了。但是作为一只能照顾自己的贪吃蛇,我们还需要能够判断当前自身状态,比如最基本的我需要知道我刚刚是不是咬到自己了,只需要看看蛇头是不是移动到了身体里面:

def check_eat_self(self) -> bool:

return self.body[0] in self.body[1:] # 判断蛇头是不是和身体重合

或者我想知道是不是跑得太快而撞了墙:

这些功能都是简单得不能再简单了,但是要相信自己,就是这么简单的几行代码就能实现一个听你指挥能做出复杂动作的

GitHub 完整代码:AnthonySun256/easy_games
2.3 命令行?画板!

上一节中我们实现了游戏里的第一位角色:。为了将它显示出来我们现在需要将我们的命令行改造成一块「画板」。

在动手之前我们同样思考:我们需要画哪些东西在我们的命令行上?直接上类图:

是不是觉得有些眼花缭乱以至于感觉无从下手?其实 Graphic 类方法虽多但是大多数方法只是执行一个特定的功能而已,而且每次更新游戏只需要调用 draw_game 方法即可:

遵循从上到下设计,从下到上实现的原则

可以看出 draw_game 实际上已经完成了 Graphic 的所有功能。

再往下深入,我们可以发现类似 draw_foods、draw_snake_body 实现基本一样,都是遍历坐标列表然后直接在相应位置上添加字符即可:

将其分开实现也是为了保持代码干净易懂以及方便后期修改。draw_help、draw_fps、draw_lives_and_scores 也是分别打印了不同文字信息,没有任何新的花样。

update_fps 实现了帧率的估算以及调节等待时间稳定帧率:

draw_message_window 则实现了绘制胜利、失败的画面:

这样,我们就实现了游戏动画的显示!

2.4 控制!

到目前为止,我们实现了游戏内容绘制以及游戏角色实现,本节我们来学习 snake 的最后一个内容:控制

老规矩,敲代码之前我们应该先想一想:如果要写一个 control 类,它应该都包含哪些方法呢?

仔细思考也不难想到:应该有一个循环,只要没输或者没赢就一直进行游戏,每轮应该更新画面、蛇移动方向等等。这就是我们的 start:

只要我们写出了 start 对于剩下的结构也就能轻松地实现,比如读取按键控制就是最基本的比较数字是不是一样大:

更新蛇的状态时只需要判断是不是死亡、胜利、吃到东西就可:

2.5 直接使用

为了让这个包能够直接使用 python snake 就能直接开始游戏,我们来看一下 __main__.py:

import game

g = game.Game()

g.start()

g.quit()

当我们尝试直接运行一个包时,Python 从 __main__.py 中开始执行,对于我们写好的代码,只需三行即可开始游戏!

三、结尾

到这里如何编写一个贪吃蛇游戏就结束啦!实际上编写一个小游戏不难,对于新手来讲难点在于如何去组织程序的结构。我所实现的只是其中的一种方法,每个人对于游戏结构理解不同所写出的代码也会不同。但无论怎样,我们都应该遵循一个目标:尽量遵循代码规范,养成良好的风格。这样不仅利于别人阅读你的代码,也利于自己排查 bug、增加新的功能。

最后,感谢您的阅读。这里是 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。您的每个点赞、留言、分享都是对我们最大的鼓励!

- END -

HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
难怪特朗普急着下令,封锁霍尔木兹海峡仅一天,国内就传来好消息

难怪特朗普急着下令,封锁霍尔木兹海峡仅一天,国内就传来好消息

云上乌托邦
2026-04-14 14:19:24
中央候补委员新职务明确!七个省级党委组织部部长调整

中央候补委员新职务明确!七个省级党委组织部部长调整

上观新闻
2026-04-14 11:58:06
特朗普封锁霍尔木兹海峡,美国石油出口或创纪录,但国内汽油价格恐大幅上涨

特朗普封锁霍尔木兹海峡,美国石油出口或创纪录,但国内汽油价格恐大幅上涨

汇通网
2026-04-14 10:09:35
布雷切尔赛后一番感慨 道出他为何是四大莽夫 常冰玉能接替赵心童

布雷切尔赛后一番感慨 道出他为何是四大莽夫 常冰玉能接替赵心童

郝小小看体育
2026-04-14 09:16:17
国务院4月13日新政落地,基层卫生院不再闲置,家门口就医更方便

国务院4月13日新政落地,基层卫生院不再闲置,家门口就医更方便

复转这些年
2026-04-14 12:21:52
长公主被家暴流产了

长公主被家暴流产了

毒舌扒姨太
2026-04-08 22:29:19
医生告诫:每天睡前玩手机的人,不用半年时间,睡眠或有这6变化

医生告诫:每天睡前玩手机的人,不用半年时间,睡眠或有这6变化

白话电影院
2026-04-05 15:34:47
危急!伦敦赛国乒阵容藏隐患,5大主力4人带伤,38岁马龙临危受命

危急!伦敦赛国乒阵容藏隐患,5大主力4人带伤,38岁马龙临危受命

罗纳尔说个球
2026-04-13 21:01:37
买整本只为抽个1000元红包,结果刮出100万

买整本只为抽个1000元红包,结果刮出100万

体育硬核说
2026-04-13 18:02:39
云南最有名的十位医生

云南最有名的十位医生

王晓爱体彩
2026-04-14 08:11:00
美军打击伊朗,动用多少实力及总占比?

美军打击伊朗,动用多少实力及总占比?

高博新视野
2026-04-12 08:00:17
狐狸尾巴藏不住!以为能“毁掉”全红婵,没想自己先被扒个底朝天

狐狸尾巴藏不住!以为能“毁掉”全红婵,没想自己先被扒个底朝天

晓帝爱八卦
2026-04-14 12:20:57
水花兄弟要重聚?独行侠专家证实:克莱买断回归勇士,方案已清晰

水花兄弟要重聚?独行侠专家证实:克莱买断回归勇士,方案已清晰

夜白侃球
2026-04-14 10:41:51
许家印,当庭认罪!

许家印,当庭认罪!

梳子姐
2026-04-14 13:19:01
中国女篮集训大名单解读!张茹落选原因曝光,李梦再次被弃惹争议

中国女篮集训大名单解读!张茹落选原因曝光,李梦再次被弃惹争议

曹说体育
2026-04-14 12:38:15
无戏可拍的文章开饭店,爆火不到3天,担心的事发生,还不止一件

无戏可拍的文章开饭店,爆火不到3天,担心的事发生,还不止一件

八斗小先生
2026-04-14 14:26:29
原温州银监局局长赵秀乐主动投案,系易会满、沈荣勤校友

原温州银监局局长赵秀乐主动投案,系易会满、沈荣勤校友

观察者网
2026-04-14 13:45:06
斯诺克世锦赛:中国14人晋级32强,决胜轮一步之遥

斯诺克世锦赛:中国14人晋级32强,决胜轮一步之遥

阿嚼影视评论
2026-04-14 07:10:18
巴基斯坦也没想到,跟着中国混来混去,结果自己也混了一个霸主

巴基斯坦也没想到,跟着中国混来混去,结果自己也混了一个霸主

荷兰豆爱健康
2026-04-14 12:34:02
文章转行开饭店,人气火爆,凌晨4点排队,曾经影帝走出新的人生

文章转行开饭店,人气火爆,凌晨4点排队,曾经影帝走出新的人生

东方不败然多多
2026-04-14 10:14:22
2026-04-14 15:32:49
HelloGitHub
HelloGitHub
带你玩GitHub开源社区
190文章数 5242关注度
往期回顾 全部

游戏要闻

Bongo Cat站起来了!快来《敲敲打宝》扮演猫猫英雄拯救世界

头条要闻

恒大集团、恒大地产及许家印案开庭 许家印认罪悔罪

头条要闻

恒大集团、恒大地产及许家印案开庭 许家印认罪悔罪

体育要闻

他做对了所有事,却被整个职业网坛放逐了八年

娱乐要闻

宋祖儿刘宇宁恋情大反转 正主火速辟谣

财经要闻

许家印受审当庭表示认罪悔罪

科技要闻

离职同事"炼化"成AI?这届公司不需要活人了

汽车要闻

长城欧拉5限定版纯电版上市 限量99台售价13.38万元

态度原创

时尚
数码
旅游
健康
教育

今年科切拉的风吹向了谁?

数码要闻

TCL T7M Pro体验:SQD-Mini LED技术加持,客厅换代首选

旅游要闻

申然:塞班军舰岛,一眼沦陷的蓝绿秘境

干细胞抗衰4大误区,90%的人都中招

教育要闻

2026高考考生注意!7所高校全部启动

无障碍浏览 进入关怀版