社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用python写一个简单的贪吃蛇游戏

Crossin的编程教室 • 4 年前 • 234 次点击  

不知道有多少同学跟我一样,最初接触编程的动机就是为了自己做个游戏玩?



Python 虽然并不是一个“为游戏而生”的语言,但也有着自己的游戏引擎。最常用的就是 pygame另外还有一个知名游戏引擎 cocos2d,它的最初版本就是基于 python 的 cocos2d-python。这两个引擎我们都有过案例,其中 pygame 更是做过一个较为详尽的入门教程 --《打飞机》小游戏,链接见文末。


今天要给大家分享的是一个 pygame 写的“贪吃蛇”小游戏:



“贪吃蛇”这个小游戏在编程学习中的常客,因为:


1. 简单,最基本的游戏元素只需要蛇和食物两个就可以进行了。(打飞机还需要三个元素呢,想想分别是什么?)方向的话只要上下左右4个固定方向就可以了。

2. 有基本的数据结构面向对象的思想在其中。游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了。


另外比较有趣的一点是,Python 这个单词在英语里就是蟒蛇的意思,贪吃蛇可以算是“同名游戏”了。


很多学校里程序开发课程的作业都会有贪吃蛇的选题,也经常会有同学问到我们相关的代码。(诺基亚手机对这款游戏也是情有独钟。)之前我做过一个《贪吃蛇大作战》的 Python 版本,基于 cocos2d-python 开发。但那个对于初学者来说有些复杂了。这次是由我们的助教 @清风小筑 开发的一个更加适合初学者学习的简易版本。


对于整个开发过程及代码的详细说明,我们都写在了文档里,一并上传了 github。需要的同学可自行下载练习,可尝试更改蛇的速度、颜色,添加多个食物等。(获取地址请在公众号 Crossin的编程教室 里回复关键字 贪吃蛇


这里我们做个简要介绍:


此代码基于 pygame 开发,所以运行前请确保你的 Python 里已成功安装 pygame。然后直接运行代码中的 mySnake.py 即可开始游戏。


除了最终的代码外,我们还特意分解了几个过程中的 py 文件,供想要自己开发的同学参考。


开发思路


游戏开发通常都会采用面向对象的设计。这里我们有三个类:食物,另外还有背景(用来绘制格子)。


游戏的主循环里主要依次做这么几件事:

  1. 获取键盘事件

  2. 绘制背景

  3. 更新蛇的位置 

  4. 画蛇、食物

  5. 碰撞检测

  6. 屏幕刷新


蛇和食物的绘制都是通过 pygame 里的 Surface 对象实现,绘制不同颜色的格子。


蛇的身体使用 Rect 对象,通过 list 保存。


蛇的移动是这个游戏的核心操作。我们没有选择修改蛇的位置,而是每次移动时,根据蛇的前进方向增加一个头部节点,其余位置都向前移动一个节点,并删除尾端节点,这样就等于实现了蛇的移动。如果是吃到了食物,就在尾部再加上节点,就实现了增长。


游戏中要做碰撞检测,这个用 pygame 的 colliderect 就行。我们要判断:1.撞墙了没?2.撞自己了没?3.撞到食物了没?然后分别做不同的处理


游戏主循环的核心代码:

while going:    lastt = clock.tick(60) # 帧率 60    dt += lastt # 累计时间    c += 1    # 0 键盘按压等事件响应    for event in pygame.event.get():        if event.type == pygame.QUIT: sys.exit()        elif event.type == KEYDOWN:            if event.key == K_UP and validDirect != 0: direct = 1 # 按了向上 1 并且当前方向不是向下 0 ,则向上            elif event.key == K_DOWN and validDirect != 1: direct = 0 # 向上 1 ,向下 0            elif event.key == K_LEFT and validDirect != 2: direct = 3 # 向左 3, 向右 2            elif event.key == K_RIGHT and validDirect != 3: direct = 2     # 0.1 画全屏的黑色背景    screen.fill(black)    # 1 判断是否移动    if dt > interval: # 移动的时间间隔        validDirect = direct        dt = 0 # 初始化时间        endPop = s.move(snake,direct)    # 1.1 画蛇    for i in snake:        screen.blit(s.ball, i)    # 2 画线条    b.drawGrid(screen)    # 3.1 分数更新    scoret=b.scoref.render(str(score), True, (255, 255, 255)) # 实时得分    screen.blit(scoret, (0, 0)) # 实时分数    scoret2=b.scoref.render('best:'+str(best), True, (255, 255, 255)) # 最佳得分    screen.blit(scoret2, (width-6*edge, 0)) # 最佳分数    # 3.2 食物    screen.blit(f.food, foodr) # 根据 fr(Rect 对象) 更新 food(Surface 对象) 位置 ,绘图    # 4 判断撞击    clli = s.strike(snake,foodr)    if clli == 0: # 撞墙 撞自己        going = False    elif clli == 1: # 吃果实        snake.append(endPop) # 长尾巴        score += 1        if not f.get_foodpos(foodr,snake): going = False # 生成 food 新位置, 如果占满全屏,则退出    # 5 屏幕刷新    pygame.display.flip() # 显示图形


完整代码和详细说明比较长,就不都贴在这里了,大家可以下载项目到本地后查看及运行。获取项目地址请在公众号 Crossin的编程教室 里回复关键字 贪吃蛇

    

文中代码由 清风小筑 完成,码上行动的学员如有问题可直接在答疑群中找他讨论。

    

还有之前的两篇相关文章供参考:

爆款游戏《贪吃蛇大作战》的 Python 实现

【Pygame 第1课】 hello pygame(回复关键词game查看此系列文章)





其他内容回复左侧关键词获取:
python :零基础入门课程目录
新手 :初学者指南及常见问题
资源 :超过500M学习资料网盘地址
项目 :十多个进阶项目代码实例

如需了解视频课程及答疑群等更多服务,
请号内回复 码上行动
经验:选专业 | Py转行 | 我用Py |  新手建议
干货:如何debug |  一图学Py  | 知乎资源 单词表
案例:漫威API | 查天气 | 监控大V | 红包提醒



欢迎加入
Crossin的编程教室
crossincode.com

请把我们分享给身边爱学习的小伙伴 :)  


点击文末“阅读原文”,了解零基础入门课程

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/48205
 
234 次点击