不知道有多少同学跟我一样,最初接触编程的动机就是为了自己做个游戏玩?
Python 虽然并不是一个“为游戏而生”的语言,但也有着自己的游戏引擎。最常用的就是 pygame。另外还有一个知名游戏引擎 cocos2d,它的最初版本就是基于 python 的 cocos2d-python。这两个引擎我们都有过案例,其中 pygame 更是做过一个较为详尽的入门教程 --《打飞机》小游戏,链接见文末。
今天要给大家分享的是一个 pygame 写的“贪吃蛇”小游戏:
“贪吃蛇”这个小游戏在编程学习中的常客,因为:
1. 简单,最基本的游戏元素只需要蛇和食物两个就可以进行了。(打飞机还需要三个元素呢,想想分别是什么?)方向的话只要上下左右4个固定方向就可以了。
2. 有基本的数据结构和面向对象的思想在其中。游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了。
另外比较有趣的一点是,Python 这个单词在英语里就是蟒蛇的意思,贪吃蛇可以算是“同名游戏”了。
这里我们做个简要介绍:
此代码基于 pygame 开发,所以运行前请确保你的 Python 里已成功安装 pygame。然后直接运行代码中的 mySnake.py 即可开始游戏。
除了最终的代码外,我们还特意分解了几个过程中的 py 文件,供想要自己开发的同学参考。
开发思路
游戏开发通常都会采用面向对象的设计。这里我们有三个类:蛇、食物,另外还有背景(用来绘制格子)。
游戏的主循环里主要依次做这么几件事:
- 获取键盘事件
- 绘制背景
- 更新蛇的位置
- 画蛇、食物
- 碰撞检测
- 屏幕刷新
蛇和食物的绘制都是通过 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() # 显示图形
关于Python学习指南
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
👉Python所有方向的学习路线👈
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python大厂面试资料👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码免费领取【保证100%免费
】