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

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

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查看此系列文章)

(0)

相关推荐

  • 不到 150 行代码写一个 Python 版的贪吃蛇

    来源:Python 技术「ID: pythonall」 相信大家小时候应该都玩过贪吃蛇这个游戏吧,反正我小时候超喜欢玩,没其他原因,因为家里的手机上只有这一个游戏可以消磨时光.后来随着移动互联网的普及 ...

  • Python简单通俗易懂的贪吃蛇小游戏,儿时童年的味道!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 今天,给大家介绍一个简单易懂的贪吃蛇小游戏 代码 如下 import pygame,sys, ...

  • 用 Python 写个消消乐小游戏

    来源:Python 技术「ID: pythonall」 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python ...

  • 熬夜怒肝,保姆级Python学习路线,起飞!

    想当初女朋友编程小白零基础,到如今在互联网大厂做算法工作,就是我带她漂进Python的海洋,从此一去不复返~ 我给她制订的学习路线十分适合萌新,总共分三步: 看视频 作项目 啃厚书 看视频 如果是零基 ...

  • 好课分享:第三期 痴海Python训练营

    我买了这个,在网盘上可看,需要私,24小时内回复 [001][第六周]6-3.1-安装Docker.mp4 [002][第六周]6-3.3-Docker基本使用.mp4 [003][第六周]6-3.2 ...

  • 【Aid Learning安卓下载手机APP】Aid Learning最新版 v0.86 中文版

    软件介绍 Aid Learning是一款专门为安卓平台开发的Linux虚拟机软件,它可以帮助用户在安卓手机上运行一个完整的Linux系统,同时提供丰富多样的编程和开发工具,方便用户随时在手机进行工作和 ...

  • 使用Opencv和Python构建贪吃蛇小游戏

    重磅干货,第一时间送达 来源丨https://blog.csdn.net/ZeroSwift/article/details/112172663 编辑丨AI算法与图像处理 导读 本文详细介绍贪吃蛇小游 ...

  • 童年记忆第四弹!!! 如何用Python写一个胖鸟快飞

    前言 写到童年游戏第四弹了,突然想到以前玩过的一个很有意思的游戏,叫胖鸟快飞,就是一只鸟,通过不断的点击调整位置,通过钢管的游戏,今天我们就来写写这个游戏吧~ 游戏开发:(胖鸟快飞)"> ...

  • 童年记忆第三弹!!!用python写一个天天酷跑

    写出来的效果图就是这样了 下面就更新一下全部的代码吧 还是老样子先定义 import pygame,sysimport random 写一下游戏配置 width = 1200 #窗口宽度height ...

  • 童年记忆第二弹!!! 如何用Python写一个植物大战僵尸

    上次写了一个俄罗斯方块,感觉好像大家都看懂了,这次就更新一个植物大战僵尸吧 植物大战僵尸的话 引入需要的模块 import pygame import random 配置图片地址 IMAGE_PATH ...

  • 用Python做一个简单的翻译工具

    编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 本文就来自编程教室一位"小"读者的投稿(互助学习1群里的同学 ...

  • 用 Python 实现一个简单的微信红包算法

    这里我给一个简单的实现方案. 基本思路就是,有多少个红包,就循环多少次,每一次,在剩下的钱里面随机出一个值作为这个红包的金额,然后把金额从总金额中扣除.这里要注意,需要保证每个人至少能拿得到 1 分钱 ...

  • 用Python写个简单但强大的人脸识别系统

    Python编程学习圈 2021-07-16 关注+星标,每天学习Python新技能 face_recognition是一个强大.简单.易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特 ...

  • 手把手教你用Python写个简单又强大的人脸识别系统

    face_recognition是一个强大.简单.易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统. face_recognition一经开源发布就得到的广泛的热捧, ...

  • 「手把手教你」用Python写一个择时策略回测

    文章来源于量化小白上分记 ,作者量化小白H. 看多了前面的铺垫,接下来写一写可以实操的.本篇给出写择时策略回测的详细步骤,并用代码展示全过程,代码用python写,数据和代码后台回复"择时& ...

  • 用Python写一个植物大战僵尸!简直一模一样

    引入需要的模块 import pygameimport random 配置图片地址 IMAGE_PATH = 'imgs/' 设置页面宽高 scrrr_width = 800scrrr_height ...