(深信息)用python实现贪吃蛇小游戏毕业设计报告

发布时间:2020-11-11 14:42:34

深圳信息职业技术学院

计算机学院

毕业设计报告

python实现贪吃蛇小游戏

学生姓名:

号:

专业班级:

指导教师:

2020 5 27



如今,生活的步伐加快,工作、学习和生活的复杂性使得人们的生活干涸,没有新的思想,休息时间减少。面对这种生活,人们希望找到娱乐活动,使他们能够在一段时间内身体和精神上放松。给他们的休息时间“贪吃蛇这款游戏已进入公众视野。这次毕业设计的主题便“贪吃蛇”的设计。游戏的主要内容分为两部分:游戏界面设计和游戏功能设计。基于原始蛇游戏的基本功能,该游戏的功能设计增添了一些其它功能。本次毕业设计所使用的开发语言是python,它有丰富的函数库和模块库,该设计主要使用Pygame模块。

关键词 贪吃蛇;游戏 ; Python ;函数库; pygame

概述

近年来,“游戏像雨后春笋般出现。有些“游戏”幸存下来,显得与众不同。有些“游戏”耗尽了精力,藏在灰尘中。但是,不管玩什么“游戏”,都会给人带来欢乐。在工作和学习之,大多数人选择使用“游戏”来放松和消除疲劳;在闲暇时间亦会使用游戏来打发时间。当然阅读和旅游同样是人们的娱乐方式,但随着社会发展的加速,这些传统的娱乐方式不再适合人们的娱乐需求,“游戏”便理所当然的进入人们的视野。可以说,“游戏”已经成为生活的一个不可或缺的组成部分,它为生活带来了许多快乐和满足。

“贪吃蛇”是许多年轻人,甚至是青少年的出发点,现在受到各阶层人民的赞赏和追捧。

(一)中国游戏产业的现状

由于中国拥有庞大的人口基数和较大产业自由,再加上中国的市场开放度高,因此游戏产业在中国的市场上取得了令人瞩目的发展成果。根据中国产业信息网发布的《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和其他型号上,安装了改进版本的Snake II。

2000年,诺基亚重写了Snake EX程序,并将其安装在同年发布的诺基亚9200上。

在过去的十年中,贪吃蛇游戏以各种形式出现在主大游戏平台上,它们具有新颖的设计和无穷无尽的信息流,吸引了数亿游戏爱好者前来玩。

2016年,《贪吃蛇大作战》诞生并广受欢迎。 同年,腾讯游戏推出了下载量很高的在线游戏“疯狂蛇”。 所有这些使“贪吃蛇”成为国内外游戏史上最广泛的作品之一。

开发工具的简介

1.Python3.8 & PyCharm简介

本次毕业设计中,开发平台 为windows10(64bit),语言使用为Python,版本为3.8.

Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。

PyCharm是一个Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

2.Python 3.8开发过程

Python是一种解释型语言。它不需要C或C++等被编译成二进制码,它可以直接从源代码执行程序。当执行Python文件程序时,文件源代码首先为字节代码。然后发送到Python字节代码虚拟机解释这些字节代码,最后,Python执行并导出结果。



需求分析

(一)可行性分析

可行性分析,也称可行性研究,是在对新系统进行系统研究的基础上衍生的。经济和技术以及运行等方面研究了新系统的必要性和可能性通过调查、分析和比较,成功地确保新系统。可行性研究的目的是确定问题是否能够以最快的成本得到解决。

该系统的可行性分析包括以下三个方面。

1.技术可行性

此次设计的贪吃蛇游戏使用Python语言作为该系统的主要开发工具,并使用丰富的库函数以及pygame,random和其他Python语言模块来完成构建地图过程它具有高级和低级语言的优点,并且是一种面向对象的编程语言。它保证了模块化代码要求,并且模块化代码的改进对于新系统的将来扩展和修改非常有益。简而言之,在现有技术和材料条件下该系统的设计和开发符合要求,因此该系统在技术上是可行的。

2.经济可行性

该系统本质是一个小型自主游戏。 对软硬件所需的条件较少,可以在个人电脑上完成,因此该系统在经济上可行。

3.运行可行性

该系统本质是一个小型自主游戏,所消耗的资源非常少,数年前所生产的硬件性能较低的电脑上也能满足编写和运行的基本条件,因此,这个系统在运行上是可行。

(二)功能性分析

游戏是人们生活中不可或缺的一部分。 在人们成长的过程中,游戏常常伴随着我们,并在我们的生活中占据不可动摇的地位。 无论是玩具还是可以与朋友一起玩的小游戏,它都能带给我们美好的回忆。 因此,无论哪种类型的游戏,只要能满足人们的一些美好需求,它的市场就会非常好。

1.简单性

贪吃蛇是款十分简单的小游戏,无须复杂的学习就能够知道如何游玩。同时,所占用的运算资源少,容易在各大游戏平台上安装便于流传。对于那些整日忙于工作的人来说,他们显然不能花很多时间在大型游戏上,但是小型游戏就可以满足他们的娱乐需求,并且随着游戏进程的加快,对游戏的刺激也越来越强。可以说这个游戏的优势不仅简单易学,而且可以正确快速地运行。 但是它的缺点主要是由于其简单性。 游戏本身太简单了,无法与大型游戏的丰富性和乐趣相提并论,但是这款小游戏的主要目的是为需要小玩意来协调生活的人们带来更多的乐趣。

2.趣味性

当人们开始玩这个游戏时,蛇的身体最初比较duan4,运动空间也比较大,但是随着蛇不断地进食,身体会缓慢生长, 活动空间越来越小,您无法触摸墙壁,障碍物和身体,这自然会增加游戏的操作性,同时在吃东西后会显示分数 ,吸引人们追逐分



设计展示

(一)功能介绍

主要是在屏幕区域绘制一条小蛇,且在蛇不重合的区域随机出现食物,通过上下左右键来操纵蛇去吃到食物,当吃到食物后蛇会增长一节,同时在其他区域在刷新新的食物。倘若在吃食物的过程中蛇碰到边界或撞到自己的身体,则游戏结束。

(二)框架设计图

通过对贪吃蛇的需求分析和功能设计,我们设计出游戏框架图如下图所示:

(三)画面展示

(一).开始

打开“snake”文件中的main.py文件(可直接双击运行或使用Pycharm打开再点Run运行),生成开始界面在界面设计中 还添加了开始界面和结束界面。开始会显示一张可自定义的图片,以及显示“按任意键开始”的字体,游戏结束后同样会弹出可定义的图片。

(二)运行

点任意按键进入游戏界面,按上下左右键控制蛇移动,蛇会从左边出现且自动向右方前进,此时若吃到食物便会在右上角得分处增加1分游戏的界面构造主要包括游戏运行界面尺寸的定义,背景幕布的覆盖;

游戏结束

若不小心碰到边界碰到蛇的身体,发生以上两种情况其中之一便会结束游戏,出现结束界面,此时按除Q键或者ESC键外,任意按键可重新游戏,否则便会结束游戏关闭程序。

详细设计

(一)主要函数及模块

1.主要模块

模块

作用

pygame

Python

内置模块,游戏设计模块

Random

生成随机数

sys

系统相关的信息模块

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()

食物随机生成

(二)主要功能

注:各功能的主要代码请查看附录一

1.关于贪吃蛇

(1).蛇的绘制

这里采用一个元组存储贪吃蛇身体各个部分的坐标(一条贪吃蛇不是由很多节组成的嘛)。最后获取相应坐标然后调用 pygame.draw.rect() 画出身体的各个部分

(2).蛇的移动

监听键盘,玩家按下键盘只是改变direction的值,再move_snake()函数更新贪吃蛇坐标。如果不按,那direction值一直不变,贪吃蛇就一直向前走。

在这过程中贪吃蛇必须从蛇的头部开始移动,所以蛇不能反方向移动,也就是尾巴不能变成蛇头。如果你不按任何键,蛇就会以当前的方向向前移动。 当玩家按下有效的箭头键时,蛇头按指定的方向移动,一次移动身体一部分。我们利用监听键盘,根据用户按键,用direction变量记录移动方向。然后更新贪吃蛇元组里面的坐标(其实每次移动只用更新头尾就行)。最后统一画出来。移动做法具体是,我们把每次头部移动的新坐标插入贪吃蛇元组,然后删掉尾部一节(在没有吃到食物的情况下!)

3.贪吃蛇相关判断

判断蛇是否死亡

的死亡需要满足两个条件:1. 蛇与身体碰撞2. 蛇与墙壁碰撞

当“蛇”的头部坐标等于蛇身体的任意坐标时,便满足“蛇”死亡条件,蛇与身体碰撞。

当“蛇”的头部坐标超出的地图坐标时,便满足“蛇”死亡条件,蛇与墙壁碰撞。

蛇吃到食物

当“蛇”头部坐标等于食物坐标,那么吃到食物。这时候注意,不需要删尾部一节了,因为吃到食物变长了,如果没有吃到食物,那么是正常移动,删掉尾部一节坐标。

2.关于食物

(1)食物随机出现

比较简单只使用到random模块,将x和y都设定成random,以及限定随机数起始在地图的坐标内,防止超出地图玩家看不见。

2画出食物

采用一个元组将食物出现的位置记录下来,之后再获取位置,调用pygame.draw.rect()画出来即可。



心得体会

毕业设计是对学生进行知识利用培训的一个重要组成部分,从发现问题到分析问题解决问题以及实践培训方面,这是一个具体的考试和实践技能培训过程。随着社会科学和技术的迅速发展,计算机在生活的各个方面都被使用。“Python”是近年来最先进的编程语言之一,被排在2017年IEEE编程语言排名的前列,被列为最受欢迎的语言之一。有了良好的发展前景,认真研究蟒蛇和完成学业计划是非常重要的。

回顾这次设计毕业设计的过程,我仍然非常感动。实际上,从一开始,我就决定完成该课程,从理论概念到实际完成,我在4个月内学到了很多东西,不仅巩固了我以前学过,同时也学到了很多新知识。我已经掌握了一种新的编程语言,加深了对模块化编程思想的理解,对Python函数库有了更全面的了解,对函数调用有了更深刻的理解这些都是我得益于此次毕业设计结束所取得的成就。我相信这些知识将使我现在和将来受益。

在这个毕业设计中,虽然我学到了很多知识,得到了很好的实践练习,但也遇到了很多问题。 毕竟,这是我第一次进行毕业设计。 Python语言也是一种新的编程语言,我之前仅接触过C语言。 在此过程中遇到一种或多种困难是正常的。 从开始在互联网上查找Python教程,在库中查找与Python相关的材料以学习Python,到程序的编写开始,最后的测试以发现错误,在中间很多次, 程序是各种各样的我想放弃所有的错误,但是由于种种压力,我终于坚持了下来,终于匆匆完成了。

贪婪的蛇游戏是一个简单的游戏,但是对于像我这样的初学者来说,它充满了困难。我记得当我刚决定这个科目时,老师提醒我我的科目太简单了。我应该如何写毕业论文,最后与导师讨论之后,我决定使用原始贪婪蛇的基本功能。但是对我来说依然是份困难的挑战。幸运的是,皇天不负有心人,最终自己完成了该程序。在两个半月内,这200行代码,这是我给这个毕业设计项目的所交出的答卷



致谢

从最初选择主题到收集相关材料以及学习Python语言,用了两个半月的时间。从开报告,初步程序设计,中期检查,提交论文的初稿到最终稿,这一步已经很多了。坚持不懈,学到很多东西,思考了很多,心情从简单变成了复杂,然后又从复杂中脱颖而出...但是随着毕业论文的完成,我的内心充满了成就感实在令人难以置信,让我感到所有这些努力都是值得的。

在写这篇谢谢的时候,我想了很多。从选题的开始到开题报告,再到毕业论文的撰写,我都想到了我的导师蔡剑宁,蔡老师给了我很多建议和帮助,并且我被程序错误折磨了很多次。当我不想继续学习时,蔡老师经常时机恰到好处的给与我提醒和警示。在此,我要对宋炯老师表示衷心的感谢。

刚开始,我对Python语言了解不多。后来,我找到了小甲鱼老师。他的视频教学使我有机会从开始学习Python。在他的逐步指导下,我对Python的理解越来越深入,最后编写了程序。因此,我想对在屏幕上教我的老师说“谢谢”。感谢您在CSDN博客和博客园中提供的巨大帮助。当我遇到各种我无法用自己的能力解决的问题时,正是你们,略显幼稚的提问下耐心地向我一一解释。

在论文即将结束时,我的情绪不再平静。我想说的是,有了你们的帮助,论文和程序才能顺利完成。在此,我向你们表示最诚挚的谢意!



参考文献

[1] 嵩天, 礼欣, 黄天羽. Python 语言程序设计基础 [M] . 北京:高等教育出版社, 2017.

[2] 小甲鱼. 零基础入门学习 Python[M] . 北京:清华大学出版社, 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.



附录一

蛇的绘制

#将贪吃蛇画出来

def draw_snake(screen, snake_coords):

for coord in snake_coords:

x = coord['x'] * cell_size

y = coord['y'] * cell_size

wormSegmentRect = 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_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] - 1}

elif direction == DOWN:

newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] + 1}

elif direction == LEFT:

newHead = {'x': snake_coords[HEAD]['x'] - 1, 'y': snake_coords[HEAD]['y']}

elif direction == RIGHT:

newHead = {'x': snake_coords[HEAD]['x'] + 1, 'y': snake_coords[HEAD]['y']}

snake_coords.insert(0, newHead)

判断蛇是否死亡

def snake_is_alive(snake_coords):

tag = True

if snake_coords[HEAD]['x'] == -1 or snake_coords[HEAD]['x'] == map_width or snake_coords[HEAD]['y'] == -1 or \

snake_coords[HEAD]['y'] == map_height:

tag = False # 蛇碰壁啦

for snake_body in snake_coords[1:]:

if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:

tag = False # 蛇碰到自己身体啦

return tag

是否吃到食物

#判断贪吃蛇是否吃到食物

def snake_is_eat_food(snake_coords, food): #如果是列表或字典,那么函数内修改参数内容,就会影响到函数体外的对象。

if snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']:

food['x'] = random.randint(0, map_width - 1)

food['y'] = 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 = food['x'] * cell_size

y = food['y'] * cell_size

appleRect = pygame.Rect(x, y, cell_size, cell_size)

pygame.draw.rect(screen, Red, appleRect)

(深信息)用python实现贪吃蛇小游戏毕业设计报告

相关推荐