摘要本次Python语言程序设计主要使用了Python中的Pygame模块创建了一个简单的又充满童年回忆的游戏——贪吃蛇。编写这个游戏用到了一个游戏都具备有的框架,在这个贪吃蛇的游戏中,游戏窗口里会随机生成目标小方块作为贪吃蛇的食物,通过键盘的上下左右的按键控制贪吃蛇的方向去“吃”食物,每“吃”进一个食物就会增加分数,并显示在界面右上方,同时还设置了最高得分,显示在界面的顶端。当贪吃蛇接触到界面的边缘,游戏结束,弹出“PlayAgain”的按钮,玩家可以选择重新开始游戏或者退出游戏,重新开始游戏将保持最高分纪录直至打破。1.引言在通过一学期的Python学习之后,我初步的了解到Python的语法以及它在各方面的应用:Web和Internet开发、科学计算和统计、人工智能、桌面界面开发、软件开发、后端开发、网络爬虫等。Python相对于其他语言更为简洁易懂,有严格的格式要求,在接触Python时是通过小游戏开始的,所以在本次Python的期末项目中,我使用了Pygame模块编写了一个经典贪吃蛇的游戏。Pygame是被设计用来写游戏的Python模块集合,Pygame是在优秀的SDL库之上开发的功能性包。使用Python可以导入Pygame来开发具有全部特性的游戏和多媒体软件,Pygame是极度轻便的并且可以运行在几乎所有的平台和操作系统上。Pygame包已经被下载过成千上万次,并且也被访问过成千上万次。可见Pygame是多受人欢迎,虽然使用Python做游戏项目并不是Python的主要作用,但是是初学者用来进一步掌握Python的不错的选择,Python的循环语句,条件语句,以及面向对象编程在一个游戏项目中都需要用到,熟悉掌握这些之后,对以后在其他方面的应用奠定了基础。本次论文介绍了我编写游戏项目——贪吃蛇的过程,详细介绍了这个项目的架构,各个函数,实现方法,以及编写完成后如何操作和演示结果。关键字:Python,Pygame,面向对象,贪吃蛇2.系统结构2.1设计框架每一个项目都拥有它的设计框架,图1为贪吃蛇的设计框架:图1贪吃蛇的设计框架①相关设置:里面包含了这个游戏中所需要的固定设置,方便下面的函数调用;②初始化:初始化Pygame这个游戏库;③欢迎信息:运行程序后出现的界面,包含“Play”的按钮,点击能开始游戏;④游戏运行主体:开始游戏后进入的循环;④-①蛇、食物的位置初始化:对这些位置进行初始化;④-②监听键盘、移动蛇位置:通过对键盘的监听,控制蛇的运动;④-③判断游戏状态:如果触发死亡,则结束游戏,没有则继续游戏;④-④分数更新:蛇的长度增加则分数更新;④-⑤更新画面:蛇每次移动都更新一次画面;⑤结束信息:触发死亡游戏结束时出现的界面,包含“PlayAgain”的按钮,点击重新进入游戏循环。2.2程序流程图图2所示为贪吃蛇游戏的程序流程图图2贪吃蛇游戏的程序流程图3.实现代码代码实现按照设计框架分为五大部分,其中第四部分游戏主体分五小部分介绍。3.1相关设置定义颜色的设置和游戏界面的大小图33.2初始化初始化Pygame游戏库,定义变量控制游戏速度以及最高得分初始化。创建游戏窗口。图43.3欢迎信息定义一个show_start_info函数,里面包含了“Play”按钮的定义,并使按钮在屏幕中央显示出来,还设置了鼠标监听事件,当按下按钮之后,结束函数,游戏开始。图5图6图73.4游戏运行主体3.4.1蛇、食物的位置初始化设定蛇和食物在屏幕上的初始化位置,以及蛇的初始化方向。图83.4.2监听键盘、移动蛇位置设置一个循环,监听键盘的按键是否按下,通过设定各按键对应的方向,控制蛇头的方向改变。图9图103.4.3判断游戏状态判断蛇头是否与目标方块重合,是则继续游戏,如果蛇头碰触到屏幕边缘,则结束游戏。图11图123.4.4分数更新设定一个draw_score和一个draw_high_score函数表示在屏幕上绘制分数。在main函数中调用此函数。图13图14图153.4.4更新画面图163.4结束信息在触发游戏结束的条件后,出现游戏结束的界面。图17图183.4完整代码#导入程序所需要的模块importpygameimportrandomimportsysfrompygame.localsimport*#定义颜色的变量#目标方块的颜色红色redColour=pygame.Color(255,0,0)#背景颜色黑色blackColour=pygame.Color(0,0,0)#贪吃蛇的颜色白色whiteColour=pygame.Color(255,255,255)#游戏界面大小windows_width=800windows_height=600#定义游戏结束的函数defgameOver():pygame.quit()sys.exit()#主函数defmain():#初始化Pygame这个游戏库pygame.init()#定义一个变量控制游戏的速度fpsClock=pygame.time.Clock()#创建一个窗口图形界面playSurface=pygame.display.set_mode((windows_width,windows_height))pygame.display.set_caption(贪吃蛇)#游戏名称写在窗口标题#初始化最高分(不可修改)high_score=0show_start_info(playSurface)#打印欢迎信息whileTrue:#初始化变量#贪吃蛇起始坐标位置(100,100)snakePosition=[100,100]snakeBody=[[100,100],[80,100],[60,100]]#目标方块的起始位置targetPosition=[300,300]#目标方块的标记目的:用来判断是否吃掉了这个目标方块targetflag=1#初始化方向--往右direction='right'#定义一个方向变量changeDirection=directionwhileTrue:foreventinpygame.event.get():ifevent.type==QUIT:pygame.quit()sys.exit()elifevent.type==KEYDOWN:ifevent.key==K_RIGHT:changeDirection='right'ifevent.key==K_LEFT:changeDirection='left'ifevent.key==K_UP:changeDirection='up'ifevent.key==K_DOWN:changeDirection='down'#对应该键盘上的Esc键ifevent.key==K_ESCAPE:pygame.event.post(pygame.event.Event(QUIT))#确定方向ifchangeDirection=='left'andnotdirection=='right':direction=changeDirectionifchangeDirection=='right'andnotdirection=='left':direction=changeDirectionifchangeDirection=='up'andnotdirection=='down':direction=changeDirectionifchangeDirection=='down'andnotdirection=='up':direction=changeDirection#根据方向移动蛇头坐标ifdirection=='right':snakePosition[0]+=20ifdirection=='left':snakePosition[0]-=20ifdirection=='up':snakePosition[1]-=20ifdirection=='down':snakePosition[1]+=20#增加蛇的长度snakeBody.insert(0,list(snakePosition))#如果我们贪吃蛇的位置和目标方块的位置重合了目标方块的标记为0ifsnakePosition[0]==targetPosition[0]andsnakePosition[1]==targetPosition[1]:targetflag=0else:snakeBody.pop()iftargetflag==0:#随机生成目标方块x=random.randrange(1,32)y=random.randrange(1,24)targetPosition=[int(x*20),int(y*20)]targetflag=1playSurface.fill(blackColour)#填充背景为黑色forpositioninsnakeBody:#在屏幕上创建一条蛇pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20))#在屏幕上创建目标方块pygame.draw.rect(playSurface,redColour,Rect(targetPosition[0],targetPosition[1],20,20))pygame.display.flip()#显示得分信息score=len(snakeBody)*50-150draw_score(playSurface,score)draw_high_score(playSurface,high_score)#出现更高分数把分数更新ifscorehigh_score:high_score=scorepygame.display.update()#游戏结束ifsnakePosition[0]800orsnakePosition[0]0:breakelifsnakePosition[1]600orsnakePosition[1]0:break#控制游戏速度fpsClock.tick(8)#显示再玩一次按钮show_gameover_info(playSurface)defshow_start_info(playSurface):#设置按钮的尺寸和其他属性width,height=200,50button_color=pygame.Color(0,255,0)text_color=pygame.Color(255,255,255)font=pygame.font.SysFont(None,48)#创建按钮的rect对象,并使其居中rect=pygame.Rect(0,0,width,height)playSurface_rect=playSurface.get_rect()rect.center=playSurface_rect.center'''将msg渲染为图像,并使其在按钮上居中'''msg=Playmsg_image=font.render(msg,True,text_color,button_color)msg_image_rect=msg_image.get_rect()msg_image_rect.center=rect.center#绘制一个用颜色填充的按钮,再绘制文本playSurface.fill(button_color,rect)playSurface.blit(msg_image,msg_image_rect)pygame.display.update()whileTrue:#鼠标监听事件foreventinpygame.event.get():#eventhandlingloopifevent.type==pygame.QUIT:gameOver()#终止程序elifevent.type==pygame.MOUSEBUTTONDOWN:mouse_x,mouse_y=pygame.mouse.get_pos()return#结束此函数,开始游戏de