资源描述
深圳信息职业技术学院深圳信息职业技术学院计算机学院计算机学院毕业设计报告毕业设计报告题目:用 python 实现贪吃蛇小游戏学生姓名:学号:专业班级:指导教师:2020 年5 月27 日1摘摘要要:如今,生活的步伐加快,工作、学习和生活的复杂性使得人们的生活干涸,没有新的思想,休息时间减少。面对这种生活,人们希望找到娱乐活动,使他们能够在一段时间内身体和精神上放松。给他们的休息时间“贪吃蛇”这款游戏已进入公众视野。这次毕业设计的主题便是“贪吃蛇”的设计。游戏的主要内容分为两部分:游戏界面设计和游戏功能设计。基于原始蛇游戏的基本功能,该游戏的功能设计增添了一些其它功能。本次毕业设计所使用的开发语言是 python,它有丰富的函数库和模块库,该设计主要使用 Pygame 模块。关键词:关键词:贪吃蛇;游戏;Python;函数库;pygame2目录摘要:.2一、概述.4(一)中国游戏产业的现状.4(二)贪吃蛇游戏的发展状况.4(三)开发工具的简介.51.Python3.8&PyCharm 简介.52.Python 3.8 开发过程.5二、需求分析.6(一)可行性分析.61.技术可行性.62.经济可行性.63.运行可行性.6(二)功能性分析.61.简单性.62.趣味性.7三、设计展示.8(一)功能介绍.8(二)框架设计图.8(三)画面展示.8(一).开始.8(二)运行.9(三)游戏结束.9四、详细设计.10(一)主要函数及模块.101.主要模块.102.主要函数.10(二)主要功能.101.关于贪吃蛇.102.关于食物.11五、心得体会.13致谢.14参考文献.15附录一.16蛇的绘制.16蛇的移动.16判断蛇是否死亡.16蛇是否吃到食物.17食物随机出现.17画出食物.173一、一、概述概述近年来,“游戏”像雨后春笋般出现。有些“游戏”幸存下来,显得与众不同。有些“游戏”耗尽了精力,藏在灰尘中。但是,不管玩什么“游戏”,都会给人带来欢乐。在工作和学习之余,大多数人会选择使用“游戏”来放松和消除疲劳;在闲暇时间亦会使用游戏来打发时间。当然阅读和旅游同样是人们的娱乐方式,但随着社会发展的加速,这些传统的娱乐方式不再适合人们的娱乐需求,“游戏”便理所当然的进入人们的视野。可以说,“游戏”已经成为生活的一个不可或缺的组成部分,它为生活带来了许多快乐和满足。“贪吃蛇”是许多年轻人,甚至是青少年的出发点,现在受到各阶层人民的赞赏和追捧。(一)中国游戏产业的现状(一)中国游戏产业的现状由于中国拥有庞大的人口基数和较大产业自由,再加上中国的市场开放度高,因此游戏产业在中国的市场上取得了令人瞩目的发展成果。根据中国产业信息网发布的2019 年中国游戏行业发展现状及未来发展趋势分析指出,社会对游戏娱乐消费支出不断增加,有效带动了游戏娱乐行业和游戏实体产品行业的快速发展。通过数据来看,2019 年,移动游戏市场实际销售收入 1581.1 亿元,占比68.5%;客户端游戏市场实际收入 615.1 亿元,占比 26.6%;网页游戏市场实际销售收入 98.7 亿元,占比 4.3%;移动游戏收入占据游戏市场主要份额。2019 年,中国移动游戏市场实际销售收入增速有所上升。移动设备由于易于携带等便利成为休闲的首选,并且随着 5G 及云游戏的发展,移动游戏面临更为稳定的市场上升空间。2019 年,中国移动游戏市场实际销售收入达到 1581.1亿元,同比 2018 年增长 241.5 亿元,同比增长率 18.0%。2019 年,中国移动游戏用户规模达到 6.2 亿人,在固定人口空间下,使用移动设备的游戏用户基本处于饱和,较 2018 年增加 0.2 亿人,增速有所放缓,同比增长率 3.2%。(二)贪吃蛇游戏的发展状况(二)贪吃蛇游戏的发展状况1997 年,诺基亚工程师 Taneli Armanto 为诺基亚 N6610 手机编写了一个名为 Snake 的程序,中译贪吃蛇后来,在更著名的诺基亚 3310 和其他型号上,安装了改进版本的 SnakeII。2000 年,诺基亚重写了 Snake EX 程序,并将其安装在同年发布的诺基亚9200 上。在过去的十年中,贪吃蛇游戏以各种形式出现在主大游戏平台上,它们具有新颖的设计和无穷无尽的信息流,吸引了数亿游戏爱好者前来玩。2016 年,贪吃蛇大作战诞生并广受欢迎。同年,腾讯游戏推出了下载量很高的在线游戏“疯狂蛇”。所有这些使“贪吃蛇”成为国内外游戏史上最广泛的作品之一。4(三)开发工具的简介(三)开发工具的简介1.Python3.8&PyCharm1.Python3.8&PyCharm 简介简介本次毕业设计中,开发平台 为 windows10(64bit),语言使用为 Python,版本为 3.8.Python 是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。PyCharm 是一个 Python IDE,带有一整套可以帮助用户在使用 Python 语言开发时提高其效率的工具,比如调试、语法高亮、Project 管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该 IDE 提供了一些高级功能,以用于支持 Django 框架下的专业 Web 开发。2.Python 3.82.Python 3.8 开发过程开发过程Python 是一种解释型语言。它不需要像 C 或 C+等被编译成二进制码,它可以直接从源代码执行程序。当执行 Python 文件程序时,文件源代码首先编译为字节代码。然后发送到 Python 字节代码虚拟机解释这些字节代码,最后,Python执行并导出结果。5二、二、需求分析需求分析(一)可行性分析(一)可行性分析可行性分析,也称可行性研究,是在对新系统进行系统研究的基础上衍生的。从经济和技术以及运行等方面研究了新系统的必要性和可能性:通过调查、分析和比较,成功地确保新系统。可行性研究的目的是确定问题是否能够以最快的成本得到解决。该系统的可行性分析包括以下三个方面。1.1.技术可行性技术可行性此次设计的贪吃蛇游戏使用 Python 语言作为该系统的主要开发工具,并使用丰富的库函数以及 pygame,random 和其他 Python 语言模块来完成构建地图过程。它具有高级和低级语言的优点,并且是一种面向对象的编程语言。它保证了模块化代码要求,并且模块化代码的改进对于新系统的将来扩展和修改非常有益。简而言之,在现有技术和材料条件下该系统的设计和开发符合要求,因此该系统在技术上是可行的。2.2.经济可行性经济可行性该系统本质是一个小型自主游戏。对软硬件所需的条件较少,可以在个人电脑上完成,因此该系统在经济上可行。3.3.运行可行性运行可行性该系统本质是一个小型自主游戏,所消耗的资源非常少,数年前所生产的硬件性能较低的电脑上也能满足编写和运行的基本条件,因此,这个系统在运行上是可行。(二)功能性分析(二)功能性分析游戏是人们生活中不可或缺的一部分。在人们成长的过程中,游戏常常伴随着我们,并在我们的生活中占据不可动摇的地位。无论是玩具还是可以与朋友一起玩的小游戏,它都能带给我们美好的回忆。因此,无论哪种类型的游戏,只要能满足人们的一些美好需求,它的市场就会非常好。1.1.简单性简单性贪吃蛇是款十分简单的小游戏,无须复杂的学习就能够知道如何游玩。同时,所占用的运算资源少,容易在各大游戏平台上安装便于流传。对于那些整日忙于工作的人来说,他们显然不能花很多时间在大型游戏上,但是小型游戏就可以满足他们的娱乐需求,并且随着游戏进程的加快,对游戏的刺激也越来越强。您6可以说这个游戏的优势不仅简单易学,而且可以正确快速地运行。但是它的缺点主要是由于其简单性。游戏本身太简单了,无法与大型游戏的丰富性和乐趣相提并论,但是这款小游戏的主要目的是为需要小玩意来协调生活的人们带来更多的乐趣。2.2.趣味性趣味性当人们开始玩这个游戏时,蛇的身体最初比较 duan4,运动空间也比较大,但是随着蛇不断地进食,身体会缓慢生长,活动空间越来越小,您无法触摸墙壁,障碍物和身体,这自然会增加游戏的操作性,同时在吃东西后会显示分数,吸引人们追逐分数。7三、设计展示三、设计展示(一)功能介绍(一)功能介绍主要是在屏幕区域绘制一条小蛇,且在蛇不重合的区域随机出现食物,通过上下左右键来操纵蛇去吃到食物,当吃到食物后蛇会增长一节,同时在其他区域在刷新新的食物。倘若在吃食物的过程中蛇碰到边界或撞到自己的身体,则游戏结束。(二)框架设计图(二)框架设计图通过对贪吃蛇的需求分析和功能设计,我们设计出游戏框架图如下图所示:(三)画面展示(三)画面展示(一)(一).开始开始打开“snake”文件中的 main.py 文件(可直接双击运行或使用 Pycharm 打开再点 Run 运行),生成开始界面。在界面设计中 还添加了开始界面和结束界面。开始会显示一张可自定义的图片,以及显示“按任意键开始”的字体,游戏结束后同样会弹出可定义的图片。8(二)运行(二)运行点任意按键进入游戏界面,按上下左右键控制蛇移动,蛇会从左边出现且自动向右方前进,此时若吃到食物便会在右上角得分处增加 1 分游戏的界面构造主要包括游戏运行界面尺寸的定义,背景幕布的覆盖;(三)游戏结束(三)游戏结束若不小心碰到边界,碰到蛇的身体,发生以上两种情况其中之一便会结束游戏,出现结束界面,此时按除 Q 键或者 ESC 键外,任意按键可重新游戏,否则便会结束游戏关闭程序。9四、详细设计四、详细设计(一)主要函数及模块(一)主要函数及模块1.1.主要模块主要模块模块pygameRandomsys2.2.主要函数主要函数函数main()作用主函数,控制游戏的所有进程pygame.time.Clock()控制帧速率pygame.display.set_mode生成 windows 窗口()move_snake()移动贪吃蛇snake_is_alive()判断蛇死了没snake_is_eat_food()判断贪吃蛇是否吃到食物draw_snake画出贪吃蛇draw_food画出食物draw_score画成绩pygame.image.load()加载图片pygame.display.update()刷新屏幕pygame.surface.fill()对 surface 对象填充某一种颜色get_random_location()食物随机生成作用Python内置模块,游戏设计模块生成随机数系统相关的信息模块(二)主要功能(二)主要功能注:各功能的主要代码请查看附录一1.1.关于贪吃蛇关于贪吃蛇(1 1).蛇的绘制蛇的绘制这里采用一个元组存储贪吃蛇身体各个部分的坐标(一条贪吃蛇不是由很多节组成的嘛)。10最后获取相应坐标然后调用 pygame.draw.rect()画出身体的各个部分(2 2).蛇的移动蛇的移动监听键盘,玩家按下键盘只是改变 direction 的值,再用 move_snake()函数更新贪吃蛇坐标。如果不按,那 direction 值一直不变,贪吃蛇就一直向前走。在这过程中贪吃蛇必须从蛇的头部开始移动,所以蛇不能反方向移动,也就是尾巴不能变成蛇头。如果你不按任何键,蛇就会以当前的方向向前移动。当玩家按下有效的箭头键时,蛇头按指定的方向移动,一次移动身体一部分。我们利用监听键盘,根据用户按键,用 direction 变量记录移动方向。然后更新贪吃蛇元组里面的坐标(其实每次移动只用更新头尾就行)。最后统一画出来。移动做法具体是,我们把每次头部移动的新坐标插入贪吃蛇元组,然后删掉尾部一节(在没有吃到食物的情况下!)(3 3).贪吃蛇相关判断贪吃蛇相关判断判断蛇是否死亡判断蛇是否死亡“蛇”的死亡需要满足两个条件:1.蛇与身体碰撞 2.蛇与墙壁碰撞。当“蛇”的头部坐标等于蛇身体的任意坐标时,便满足“蛇”死亡条件,蛇与身体碰撞。当“蛇”的头部坐标超出的地图坐标时,便满足“蛇”死亡条件,蛇与墙壁碰撞。蛇吃到食物蛇吃到食物当“蛇”头部坐标等于食物坐标,那么吃到食物。这时候注意,不需要删尾部一节了,因为吃到食物变长了,如果没有吃到食物,那么是正常移动,删掉尾部一节坐标。2.2.关于食物关于食物(1 1)食物随机出现)食物随机出现比较简单只使用到 random 模块,将 x 和 y 都设定成 random,以及限定随机数起始在地图的坐标内,防止超出地图玩家看不见。11(2 2)画出食物)画出食物采用一个元组将食物出现的位置记录下来,之后再获取位置,调用pygame.draw.rect()画出来即可。12五、心得体会五、心得体会毕业设计是对学生进行知识利用培训的一个重要组成部分,从发现问题到分析问题,解决问题以及实践培训方面,这是一个具体的考试和实践技能培训过程。随着社会科学和技术的迅速发展,计算机在生活的各个方面都被使用。“Python”是近年来最先进的编程语言之一,被排在 2017 年 IEEE 编程语言排名的前列,被列为最受欢迎的语言之一。有了良好的发展前景,认真研究蟒蛇和完成学业计划是非常重要的。回顾这次设计毕业设计的过程,我仍然非常感动。实际上,从一开始,我就决定完成该课程,从理论概念到实际完成,我在 4 个月内学到了很多东西,不仅巩固了我以前学过,同时也学到了很多新知识。我已经掌握了一种新的编程语言,加深了对模块化编程思想的理解,对 Python 函数库有了更全面的了解,对函数调用有了更深刻的理解。这些都是我得益于此次毕业设计结束所取得的成就。我相信这些知识将使我现在和将来受益。在这个毕业设计中,虽然我学到了很多知识,得到了很好的实践练习,但也遇到了很多问题。毕竟,这是我第一次进行毕业设计。Python 语言也是一种新的编程语言,我之前仅接触过 C 语言。在此过程中遇到一种或多种困难是正常的。从开始在互联网上查找 Python 教程,在库中查找与 Python 相关的材料以学习 Python,到程序的编写开始,最后的测试以发现错误,在中间很多次,程序是各种各样的我想放弃所有的错误,但是由于种种压力,我终于坚持了下来,终于匆匆完成了。贪婪的蛇游戏是一个简单的游戏,但是对于像我这样的初学者来说,它充满了困难。我记得当我刚决定这个科目时,老师提醒我我的科目太简单了。我应该如何写毕业论文,最后与导师讨论之后,我决定使用原始贪婪蛇的基本功能。但是对我来说依然是份困难的挑战。幸运的是,皇天不负有心人,最终自己完成了该程序。在两个半月内,这 200 行代码,这是我给这个毕业设计项目的所交出的答卷。13致谢从最初选择主题到收集相关材料以及学习 Python 语言,用了两个半月的时间。从开题报告,初步程序设计,中期检查,提交论文的初稿到最终稿,这一步已经很多了。坚持不懈,学到很多东西,思考了很多,心情从简单变成了复杂,然后又从复杂中脱颖而出.但是随着毕业论文的完成,我的内心充满了成就感实在令人难以置信,让我感到所有这些努力都是值得的。在写这篇谢谢的时候,我想了很多。从选题的开始到开题报告,再到毕业论文的撰写,我都想到了我的导师蔡剑宁,蔡老师给了我很多建议和帮助,并且我被程序错误折磨了很多次。当我不想继续学习时,蔡老师经常时机恰到好处的给与我提醒和警示。在此,我要对宋炯老师表示衷心的感谢。刚开始,我对 Python 语言了解不多。后来,我找到了小甲鱼老师。他的视频教学使我有机会从零开始学习 Python。在他的逐步指导下,我对 Python 的理解越来越深入,最后编写了程序。因此,我想对在屏幕上教我的老师说“谢谢”。感谢您在 CSDN 博客和博客园中提供的巨大帮助。当我遇到各种我无法用自己的能力解决的问题时,正是你们,略显幼稚的提问下耐心地向我一一解释。在论文即将结束时,我的情绪不再平静。我想说的是,有了你们的帮助,论文和程序才能顺利完成。在此,我向你们表示最诚挚的谢意!14参考文献1 嵩天,礼欣,黄天羽.Python 语言程序设计基础 M.北京:高等教育出版社,2017.2 小甲鱼.零基础入门学习 PythonM.北京:清华大学出版社,2016.3 新华网.2019 年中国游戏行业发展报告 R.北京:新华网,2019.4(乌拉圭)Fernando,Doglio 著,陶俊杰,陈小莉译.Python 性能分析与优化 M.北京:人民邮电出版社,2016.5 MarkLutz 著,侯荣涛译.Python 袖珍指南 M.北京:中国电力出版社,2015.6 杨年华.Python 程序设计教程 M.北京:清华大学出版社,2017.7(美)Al Sweigart 著,李强译.Python 游戏编程快速上手 M.北京:人民邮电出版社,2017.8(美)JonathanS.Harbour 著,李强译.Python 游戏编程入门 M.北京:人民邮电出版社,2015.9 唐姜明.基于 C 语言的贪吃蛇游戏开发与设计 D.南京:南京工程学院,2014.15附录一附录一蛇的绘制蛇的绘制#将贪吃蛇画出来def draw_snake(screen,snake_coords):for coord in snake_coords:x=coordx*cell_sizey=coordy*cell_sizewormSegmentRect=pygame.Rect(x,y,cell_size,cell_size)pygame.draw.rect(screen,dark_blue,wormSegmentRect)wormInnerSegmentRect=pygame.Rect(#蛇身子里面的第二层亮绿色x+4,y+4,cell_size-8,cell_size-8)pygame.draw.rect(screen,blue,wormInnerSegmentRect)蛇的移动蛇的移动#移动贪吃蛇def move_snake(direction,snake_coords):if direction=UP:newHead=x:snake_coordsHEADx,y:snake_coordsHEADy-1 elif direction=DOWN:newHead=x:snake_coordsHEADx,y:snake_coordsHEADy+1 elif direction=LEFT:newHead=x:snake_coordsHEADx-1,y:snake_coordsHEADy elif direction=RIGHT:newHead=x:snake_coordsHEADx+1,y:snake_coordsHEADysnake_coords.insert(0,newHead)判断蛇是否死亡判断蛇是否死亡def snake_is_alive(snake_coords):tag=Trueif snake_coordsHEADx=-1 or snake_coordsHEADx=map_width or snake_coordsHEADy=-1 or 16snake_coordsHEADy=map_height:tag=False#蛇碰壁啦for snake_body in snake_coords1:if snake_bodyx=snake_coordsHEADx andsnake_bodyy=snake_coordsHEADy:tag=False#蛇碰到自己身体啦return tag蛇是否吃到食物蛇是否吃到食物#判断贪吃蛇是否吃到食物def snake_is_eat_food(snake_coords,food):#如果是列表或字典,那么函数内修改参数内容,就会影响到函数体外的对象。if snake_coordsHEADx=foodx andsnake_coordsHEADy=foody:foodx=random.randint(0,map_width-1)foody=random.randint(0,map_height-1)#实物位置重新设置else:del snake_coords-1#如果没有吃到实物,就向前移动,那么尾部一格删掉食物随机出现食物随机出现food=get_random_location()def get_random_location():return x:random.randint(0,map_width-1),y:random.randint(0,map_height-1)画出食物画出食物def draw_food(screen,food):x=foodx*cell_sizey=foody*cell_sizeappleRect=pygame.Rect(x,y,cell_size,cell_size)pygame.draw.rect(screen,Red,appleRect)17
展开阅读全文