当前位置: 首页 > 后端技术 > Python

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

时间:2023-03-25 19:36:32 Python

我不知道有多少学生喜欢我。第一次接触编程的动机是为了给自己做一个游戏?Python虽然不是一门“为游戏而生”的语言,但它也有自己的游戏引擎。最常用的是pygame。还有一个著名的游戏引擎cocos2d,它的初始版本是基于python的cocos2d-python。这两个引擎我们都有过案例,其中pygame甚至还做了比较详细的入门教程——《打飞机》小游戏,见文末链接。今天要给大家分享的是一款pygame写的小游戏《贪吃蛇》:《贪吃蛇》是编程学习中的常客,因为:1.简单,最基本的游戏元素只需要蛇和食物两个就可以了。(驾驶飞机需要三个要素,想想它们是什么?)方向,你只需要上、下、左、右4个固定方向。2.里面有基本的数据结构和面向对象的思想。游戏开发本身会用到很多面向对象的概念,而蛇身是天然的“链表”结构,非常适合练习数据结构。还有一点有意思的是,Python这个词在英文中是蟒蛇的意思,SnakeSnake可以看作是“同名游戏”。很多程序开发课程的学校作业都会有吃蛇的话题,经常会有同学问到我们相关的代码。(诺基亚手机也对这款游戏情有独钟。)之前做了一个Python版的《 贪吃蛇大作战 》,是基于cocos2d-python开发的。但这对初学者来说有点复杂。这次是我们助教@清风小树更简单更适合初学者学习的版本。对于整个开发过程和代码的详细描述,我们已经写在了文档中,并上传到了github。需要的同学可以自行下载练习,尝试改变小蛇的速度和颜色,多加食物等。(获取地址请在公众号Crossin的编程课堂回复关键词贪吃蛇)看这里简单介绍一下:本代码是基于pygame开发的,所以运行前请确保pygame已经成功安装在你的Python中。然后在代码中直接运行mySnake.py即可开始游戏。除了最后的代码,我们在过程中还特意分解了几个py文件,以供想自己开发的同学参考。开发思路游戏开发通常采用面向对象设计。这里我们有三个类:Snake、Food和Background(用于绘制网格)。游戏主循环主要依次做了以下事情:获取键盘事件,绘制背景,更新蛇的位置,绘制蛇,刷新食物碰撞检测画面,通过Surface对象绘制蛇和食物在pygame中,绘制不同颜色的网格。蛇的身体使用了一个Rect对象,它存储在一个列表中。蛇的移动是这款游戏的核心操作。我们没有选择修改snake的位置,而是每次移动的时候,根据snake前进的方向增加一个head节点,其余位置向前移动一个节点,删除tail节点,即相当于实现了蛇的移动。如果食物被吃掉,则在末尾添加节点以实现增长。要在游戏中进行碰撞检测,只需使用pygame的colliderect。我们要判断:1、你撞墙了吗?2.你打自己了吗?3、有没有撞到食物?然后做不同的核心代码来处理游戏的主循环:whilegoing:lastt=clock.tick(60)#framerate60dt+=lastt#accumulatedtimec+=1#0keyboardpressandothereventresponsesforevent在pygame中.event.get():ifevent.type==pygame.QUIT:sys.exit()elifevent.type==KEYDOWN:ifevent.key==K_UPandvalidDirect!=0:direct=1#pressedup1且当前方向不为down0,则upelifevent.key==K_DOWNandvalidDirect!=1:direct=0#up1,down0elifevent.key==K_LEFTandvalidDirect!=2:direct=3#左3,右2elifevent.key==K_RIGHTandvalidDirect!=3:direct=2#0.1绘制全屏黑色背景screen.fill(black)#1判断是否移动ifdt>interval:#MovingTimeintervalvalidDirect=directdt=0#初始化时间endPop=s.move(snake,direct)#1.1画一条蛇foriinsnake:screen.blit(s.ball,i)#2画一条线b.drawGrid(screen)#3.1分数更新score=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))#bestscore#3.2foodscreen.blit(f.food,foodr)#根据fr(Rectobject)更新food(Surfaceobject)的位置,绘图#4判断影响clli=s.strike(snake,foodr)ifclli==0:#撞墙撞到自己going=Falseelifclli==1:#吃水果snake.append(endPop)#longtailscore+=1ifnotf.get_foodpos(foodr,snake):going=False#为食物生成一个新位置,如果占满屏幕,则退出#5屏幕刷新pygame.display.flip()#显示图形完整代码和详细描述比较长,所以我这里就不贴了,大家可以自己下载项目到本地后,查看并运行,获取项目地址。请在CrossinSnake的编程课堂回复关键字。讨论。还有之前的两篇相关文章可以参考:Crossin:热门游戏《贪吃蛇大作战》的Python实现Crossin的编程课堂-PyGame------一起学习,走的更远!欢迎搜索:Crossin的编程课堂