《飞机大战游戏的设计与实现.docx》由会员分享,可在线阅读,更多相关《飞机大战游戏的设计与实现.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Python应用开发课程设计课程设计报告题 目:飞机大战游戏的设计与实现学 院:信息科学与工程学院专业班级:电子信息工程1902班学生姓名:龚永好学 号:学191106078指导教师:刘 丽20 21年12 月6日至20 21年12月 12日武昌首义学院制 来。解决方法:原来是在设计游戏进入前的背景图片,以及编写程序时,只考虑了如何 将图片排版设计得漂亮美观大方,没有考虑到自己笔记本电脑屏幕的尺寸是否可以正常 显示游戏进入前的背景图片,于是将初始化屏幕大小代码:“screen = pygame. display. set_mode(512, 768)n修改为 ascreen = pygame.
2、 display. set_mode(512, 680) ”,游戏背景图片以及图 片上的提示文字可以正常显示。问题三:游戏程序在运行时应该会播放背景音乐,玩家在发射子弹时应该会伴随着 开火声,但在实际运行时,这两种音乐均没有播放。解决方法:经过仔细检查,游戏程序在运行时没有播放背景音乐,是因为缺少一个 循环播放音乐的语句,当加上一句pygame. mixer. music, play (T) ”,问题解决,游戏 程序在运行时正常播放背景音乐;而玩家在发射子弹时没有伴随着开火声,是因为在编 写程序时疏忽,忽略了使用mixer播放音效模块之前需生成一个Sound对象,将语句修 改为effect =
3、 pygame. mixer. Sound(sounds/f ire. wav),问题解决,玩家在发射 子弹时电脑正常播放开火声。问题四:设计的前几版飞机大战游戏程序中,游戏结束,没有“选择是否重玩”的 快捷按键,玩家假设想重玩,只能重新手动再次运行程序。解决方法:经过反复试验,在程序中增加了一个collidepoint碰撞点,“if event, type = pygame. MOUSEBUTTONDOWN: M程序检测鼠标是否按下,重新开始按钮,“ if restart_rect. collidepoint (event, pos): 程序检测鼠标点击位置是否与重启rect重 叠,如果按下
4、,那么执行 astudent_plane.init_(screen) w,然后 “game = ing, 玩家就会重新开始游戏,这样就实现了玩家可快捷选择是否重玩,不用手动再次运行程 序。设计中存在的缺乏需进一步改进的设想:缺乏一:玩家飞机发射的子弹不能与敌机发射的子弹对消。改进的设想:可在程序中增加检测玩家飞机发射的子弹与敌机发射的子弹碰撞的语 句,如果碰撞,那么删除碰撞的两枚子弹。缺乏二:玩家飞机只有一条命,如果玩家飞机与任意一架敌机发生碰撞,或者与任 意一枚敌机发射的子弹发生碰撞,那么玩家失败,游戏结束。改进的设想:可以将玩家飞机设置血条,玩家飞机每碰撞一次敌机或敌机的子弹, 血条自减一
5、点,这样玩家飞机不那么容易死亡。在飞机大战游戏的设计与实现过程中,遇到了很多问题,也走了不少弯路,但锻炼 了解决问题的能力。设计飞机大战游戏不仅使得对Python有了进一步的了解,而且还 大大提高了编程能力,锻炼了逻辑思维和整体设计的能力,收获颇多!6参考文献1王颖.Python编程基础与应用.武汉:华中科技大学出版社.2021.08.2董付国.Python可以这样学.北京:清华大学出版社.2017. 02.3董付国.Python程序设计(第2版).北京:清华大学出版社.2018.01.4小甲鱼.零基础入门学习Python(第2版).北京:清华大学出版社.2019.11.5冯林.Pylhon程
6、序设计与实现.北京:高等教育出版社.2016. 05.课程设计成绩评定表成 绩 评 定项 目比例得分平时成绩(百分制记分)30%业务考核成绩(百分制记分)70%总评成绩(百分制记分)100%评定等级优 良 中 及格不及格指导教师(签名):20年 月日1课程设计的目的12总体设计13详细设计23.1 利用面向对象的思想进行设计23.2 键盘按键控制战机移动的设计33.3 玩家飞机子弹消灭敌机并计入分数的设计43.4 玩家可快捷选择是否重玩的设计54软件测试64.1 利用面向对象的思想进行设计的实现64.2 键盘按键控制战机移动的实现64.3 玩家飞机子弹消灭敌机并计入分数的实现74.4 玩家可快
7、捷选择是否重玩的实现75总结7参考文献91课程设计的目的(1)要求学生理解本学期Python课程的基础知识;(2)要求学生熟练运用Python语言的基本知识和编程技能;(3)学生在工程实践中体会Python的乐趣;(4)学生掌握并熟练运用软件工程的方法进行软件开发;(5)学生在软件工程的开发中,培养坚持不懈、精益求精的品质精神; (6)培养学生的软件开发能力、软件工程的素质和软件工程管理能力。2总体设计飞机大战游戏系统功能模块图,如图2-1所示。本系统分为两大模块,分别是 Planejnain模块与Plane, py模块。Planejnain模块中有游戏初始化、创立精灵组、创 建用户事件、显示
8、积分、开始游戏、事件监听、更新精灵组和碰撞检测八个小模块。而 Plane, py模块可分为背景精灵、敌机精灵、Boos精灵、英雄精灵和子弹精灵五个小模 块。游戏初始化包括Pygame初始化、设置游戏窗口、创立游戏时钟、创立精灵组、显 示积分和创立用户事件。开始游戏包括设置刷新帧率、事件监听、更新精灵组、显示积 分、碰撞检测和更新屏幕显示等。而其中的事件监听包括通过pygame. key获得用户按 键,以及根据按键改变英雄移动方向。整个游戏操作包括:显示玩家飞机、控制移动方 向;显示玩家飞机发射子弹;显示敌人飞机;敌人飞机发射子弹等,玩家点击“开始游 戏”图标即可进入开始界面。匕机大战游戏图2-
9、1飞机大战游戏系统功能模块图3详细设计3.1利用面向对象的思想进行设计本系统利用面向对象的思想进行设计,_init()函数用于初始化对象的属性, _init_()方法的定义中用到了 self参数。程序中让Hero类继承Plane类,这样Hero 类就拥有了从父类Plane继承来的_int_()方法。同样让Enemy类继承自Plane类,Plane 类就拥有了从父类继承而来的方法。不过,Enemy类需要增加一个表示方向的属 性,为此需要重写父类的_int_()方法,Enemy类中的launch_bullet方法,与从父类直 接继承的launch bullet方法在功能上存在着一些差异。为此,En
10、emy类需要重写从父 类继承的launch_bullct方法。在Plane类的方法中,由于图片素材的名称x 值和y值是变化的,每个子类需要单独进行调整,所以在Plane类中,把这三个属性移 动到子类Hero重写的方法中。在EnemyPlane类的方法中,同样增加这 三个属性的设置。总之,本程序利用面向对象的思想进行设计,充分使用了实例方法、 静态方法和类方法这三种类的方法,如图3-1所示。J 飞机大atpy - CAUswsGongYongHaoDeslrtopPythoni!ig飞机大幽飞机大fitpy (3.7.4) File Edit Format Run Options Window
11、Helpfire music 0: u定义的数pass s pass什么也不做,仅为了保证语法正确=设且开火音乐S播放音效使用mixer桢块,使用之前需生成一个Soyd时象.Sound对望的play。方法就是播放讦效 effect pygame. mixer. SoundC sounds/fire. wav,)pygame. mixer. Sound, play(effect)Boss (Sprite):S 定义 Boss 类f _init_(self, boss.img.name):8淮承父类的init方法样可以使用super()去继承其他方法super 0._init_0S加我BOSS图片
12、* 使用pygaM. image. load。加1 貌图像a self. image =用来存储玩向对象的灵图片self, image = pygame. image, load。图片,+boss ing nane* . png ). convert alphaO*转换BOSS大小s ftH!pygan. transform, scale调整图像大小S self, image = pygame. transform. scale(self. image, (1. 12)S牛:成BOSS矩形能架self, rect self, inage. getrectOself. blood = 1000
13、s BOSS的血初值为3 boss左右移动的速度self, speed 3. 5ief move (self):s定义移动函数口 ftniself. rect. center 在pygane中地机移动角色self. rect. centerx -512:self, speed 二-self, speedif self. rect. centerx=40: student_plane. rect. centerx -=8.5图3-2左移?: keys pygame. K_w: w设置机状态图片# wstudent_plane. set_imageC up)student_plane. set_a
14、ir (* up,)student_plane. rect. centery = 45: student_plane. rect. centery -=8. 5图3-4上移elif keyspygame. K_dJ: n设置飞机状态图片 # D一右 student_plane. set_image( right) if student_plane. rect. centerx = 478: student_plane. rect. centerx +=8. 5图3-3右移el:: keyspygame. K_sJ:#设置K机状态图片# s一下,student_plane. set_image(
15、 down)if student_plane. rect. centery -100:=如果分散超过等J100s小敌机出现的节奏rani, ran2 - 15.25max_enemies 17 2知多出现17个敌人screen, bl it (boss, image, boss, reel)boss. noveO大boss 移动for ny-bullet ir. student .plane, bullets:hit_boss = pygame. sprite, collide.rect (boss, ny_bullet)if hit_boss: 打大bossboss, blood -=1.2
16、score*1TossToIoor?=57ADossCT 也小于等于 0gaae = * success* 力成功troupli MXftll.(roup2: dokiin:发生曜检附 , 255,0.0) screen, blit (surface 1. 20.20)图3-9碰撞图3-8打大BOOS3.4玩家可快捷选择是否重玩的设计加载重玩图标,如图3-10所示。当玩家飞机牺牲时,if event, type = pygame. MOUSEBUTTONDOWN: w 程序检测鼠 标是否按下,重新开始按钮,“if restart_rect. collidepoint (event, pos):
17、 程序检 测鼠标点击位置是否与重启rect重叠,如果按下,那么执行 wstudent_plane._init_(screen) ”,然后 “game = ing ,玩家重新开始游戏,玩 家可快捷选择是否重玩,如图3-11所示。当玩家游戏成功时,程序执行退出游戏命令,if event, type = pygame. MOUSEBUTTONDOWN: 程序检测鼠标点击位置是否与重启rect重叠,“if restart_rect. collidepoint (event. pos) : v 如果鼠标点击与重启 rect 重叠,那么重启 游戏,玩家可快捷选择是否重玩,如图372所示。#加载重玩图标re
18、start_img = pygame. image, load(图片/restart, png). convert_alpha()restart_rect = restart_img. get_rect()restart_rect. centerx = 249 restart_rect. centery = 420图3-10加载重玩图标*游戏结束状专elif game - over:score = 0斗分数重置为0=最小游戏框架一个都不能省略for event in pygame. event, get 0:if event.type = pygame. QUIT: pygame. quit
19、()S检测鼠标是否按下重新开始按钮:event, type = pvgame. MOISEBUTTOXDOWN: 8检测鼠标点击位置是否与重启reel市控 if restart_rect. collidepoint(event, pos): studentlane. _init_(screen) game = ing,a游戏结束游戏画面暂停screen, blit(bg_imgl, (0, pos_yl)screen, blit(bg_img2, (0, pos_y2)S游戏结束screen.blit(gameover_img, (163, 310) screen.blit(restart_i
20、mg, restart_rect)elif game = success:3如果成功score 0boss.blood = 1000s最小游戏框架一个都不能省略for event in pygame. event, get():if event.tvpe = pygame.QUIT: 才退出游戏pygame. quit ()=检测鼠标是否按下,重新开始按你s MOCSEBITTOXDOU-N 鼠标按钮event.type = pygame. MOtSEBlTTOXDOUN: s检测夙标点击位值是否与重后rect更登# collidepoint 碰撞点-f restart rect. colli
21、depoint(event, pos):8如果鼠标煮击与虫后rect重叠,那么西点游戏 student olane. _init_(screen) game = ing,二而新开砧诲戏3游戏结束游戏画面暂停#解幕screen. blit(bg_imgl, (0. pos_yl)screen.blit(bg_img2, (0, pos_y2)3游戏成功screen.blit(gamesuccess, (170, 220)9重新启动screen, blit(restart imR. restart rect)图3-11玩家飞机牺牲,快捷选择重玩图3-12玩家成功,快捷选择重玩4软件测试4.1 利用
22、面向对象的思想进行设计的实现本程序利用面向对象的思想进行设计,充分使用了实例方法、静态方法和类方法这 三种类的方法。在实现上,首先在程序中创立GameSprite类,此类主要是飞机大战游 戏精灵类,它可以在屏幕的垂直方向上移动。其次创立Background类,该类是游戏背 景精灵类,判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕的上方。然后创立Enemy 类,该类是敌机精灵类,在这里判断是否飞出屏幕,如果是,需要从精灵组删除敌机。 再创立Hero类,该类是英雄精灵类,它可以发射子弹,控制英雄在水平方向移动。还 有一个Bullet类,该类是子弹精灵类,在这里调用父类方法,让子弹沿垂直方向飞行。
23、 最后是主类planejnain. py,这里面只用了一个类:PlaneGame类,在这里面可以实现 飞机大战的过程,通过start_ganie()这个入口函数,调用其它的函数,实现飞机大战, 说明都在注释里面,这里就不再赘述了。4.2 键盘按键控制战机移动的实现键盘按键能控制战机上下左右移动共用到了 4个键。对应关系如下:上移:W,下移:S,左下移:A,右下移:Do程序执行流程为:a)在游戏循环中,首先使用pygame. event, get ()获取到用户事件;b)然后对获取到的事件进行判断;c)如果是键盘事件,就进一步判断按下的键是哪个,并触发对应事件。4.3 玩家飞机子弹消灭敌机并计入
24、分数的实现pygame提供了非常方便的方法可以实现碰撞检测到:“pygame. sprite, groupcollide () ”两个精灵组中所有的精灵的碰撞检测的代码为“ groupco Hide (group 1, group2, doki 111, dokil 12, col 1 ided = None) - Sprite diet”,如果将 dokill 设置为 True, 那么发生碰撞的精灵将被自动移除。玩家飞机子弹假设与敌方飞机发生碰撞,那么删除被玩家 飞机子弹击中的敌机,玩家飞机分数自增10,即“玩家飞机子弹击中敌方飞机,子弹会 将其消灭并计入分数”。4.4 玩家可快捷选择是否重
25、玩的实现当游戏结束,程序执行退出游戏命令。“if event, type = pygame. MOUSEBUTTONDOWN:程序检测鼠标点击位置是否与重 启 rect 重叠,“if restart_rect. collidepoint(event. pos) : v 如果鼠标点击与重启 rect重叠,那么重启游戏,玩家可快捷选择是否重玩。5总结系统基于面向对象的思想,利用Python语言的基本知识和编程技能完成了飞机大 战游戏的设计与实现,主要完成了键盘按键能控制战机上下左右移动;玩家飞机子弹击 中敌方飞机,子弹会将其消灭并计入分数;当玩家飞机牺牲或游戏成功时,玩家可快捷 选择是否重玩等功能。本次设计实施步骤为:首先完成系统总体设计,其次选择合适的 开发工具完成系统设计工作,添加适当的注释,增加程序的可读性,然后对软件进行单 元和系统测试,做好测试记录,最后完成相关资料的整理工作,按时撰写课设报告并上 交。课程设计中遇到的主要问题及其问题解决方法:问题 一:IDLE 运行窗 口警告 a libpng warning: iCCP: known incorrect sRGB profile”。解决方法:是qq输入法的原因,换个输入法就好了。问题二:在初始化屏幕大小程序设计时,发现游戏背景图片很大,有文字显示不出