根据飞机大战游戏的规则,请大家动手实现该游戏的一个Demo版本,主要功能是实现我方飞机的上、下、左、右移动和子弹发射两个核心功能。
项目结构图:
运行效果图:
一、语言和环境
1、开发环境和版本:Python3.6及以上版本
2、集成开发环境(IDE): Pycharm
二、程序整体要求
1、 根据功能划分进行模块化开发,并添加适当注释,使程序结构清晰、层次分明,具有良好的可读性;
2、 程序运行效果与提供的页面效果、结构保持一致 ;
三、思路分析
由项目结构图和运行效果,可知项目主要有四大模块,分别为静态资源管理目录(assets)、常量配置文件(constants.py)、game包模块、游戏入口文件(main.py)。
步骤一:在assets文件夹中创建images、sounds两个文件夹,储存项目中的图片和声音。
步骤二:在根目录下新建constants.py文件,游戏中用到的图片、声音资源路径存到指定的变量中,便于模块间的调用。
1、项目文件夹路径 BASE_DIR
2、静态资源文件夹路径 ASSETS_DIR
3、游戏背景图片路径 BG_IMG
4、飞机大战标题图片路径 IMG_GAME_TITLE、
5、游戏开始图片路径 IMG_GAME_START_BTN
6、获取游戏运行时背景音乐路径 BG_MUSIC、
7、发射子弹时背景音乐路径 BULLET_SHOOT_SOUND
8、获取我方飞机图片资源路径 OUR_PLANE_IMG_1和OUR_PLANE_IMG_2
9、子弹图片资源路径 BULLET_IMG
步骤三:在根目录文件夹下新建game包结构,并创建plane.py和bullet.py文件实现对飞机类、子弹类的封装
依据游戏中飞机的实际效果,完成对飞机类的封装。因考虑到代码的扩展性,抽取一个飞机类的基类,我方飞机类继承该基类:
1、飞机基类:
(1)飞机类基类Plane,继承自(pygame.sprite.Sprite)
(2)设置飞机图片plane_images、存活状态active、子弹发射精灵组bullets三个类属性
(3)自定义初始化方法:
参数--为屏幕对象(screen)、移动速度(speed=None);
实例属性--屏幕对象screen、飞机图片静态资源列表img_list、飞机速度speed、飞机位置rect;
通过飞机位置rect和屏幕对象screen获取飞机的宽plane_w高plane_h及游戏窗口宽width高height;
设置飞机初始化位置处于游戏窗口左边距(width-plane_w)/2和上边距height/2的距离;
(4)静态资源加载方法load_src,加载飞机图片资源并保存至img_list;
(5)以属性访问方式定义方法image,返回img_list中保存的第一个元素;
(6)飞机绘制方法blit_me,将飞机图片绘制在rect位置;
(7)飞机上移方法move_up、下移方法move_down、左移方法move_left、右移方法move_right,根据飞机速度重新设置距离游戏窗口上边框和左边框的距离;
(8)子弹发射方法shoot,创建子弹对象并添加至类属性bullets中;
2、我方飞机类:
(1)我方飞机类OurPlane,继承自飞机类Plane;
(2)设置类属性plane_images,值为constants.py中我方飞机图片资源路径(2个);
(3)更新飞机动画效果方法update,参数为播放帧数frame,当frame能5整除时,屏幕绘制飞机图片资源列表中的第一个;反之,屏幕绘制飞机图片资源列表中的第二个;
(4)重写飞机上移方法move_up、下移方法move_down、左移方法move_left、右移方法move_right,确保飞机在移动时不会超出游戏窗口
3、 创建bullet.py文件,实现对子弹类的封装
(1)子弹类Bullet,继承自(pygame.sprite.Sprite),设置类属性active记录存活状态,默认为True;
(2)自定义初始化方法,参数为屏幕对象screen、飞机plane、移动速度(speed=None),设置实例属性屏幕对象screen、子弹运行速度speed、飞机plane、子弹图片静态资源列表image、子弹位置rect。通过rect获取子弹的中心点rect.centerx和距离上边距距离rect.top,并设置属性shoot_sound获取加载的子弹发射音效资源,最终进行播放;
(3)自定义子弹位置更新方法update,参数为(*args),根据子弹运行速度更新其位置,当子弹运行超出游戏窗口时,从精灵组中进行移除;
步骤四:自定义游戏入口文件main.py,完成对游戏运行逻辑的控制
1、正确导入相关的包与模块
2、定义程序入口函数main()
(1) 初始化pygame
(2) 设置游戏屏幕宽width和高height、屏幕窗口标题“飞机大战”
(3) 加载游戏背景图片bg
(4) 加载游戏标题的图片img_game_title,并获取其宽t_width、高t_height
(5) 获取img_game_title的矩形区域,记录为img_game_title_rect,并设置img_game_title_rect使其位于游戏屏幕的正中央
(6) 加载游戏开始按钮btn_start,并设置其宽btn_width、高btn_height
(7)获取btn_start的矩形区域,记录为btn_start_rect,并设置btn_start_rect使其位于游戏屏幕的中央且在img_game_title的矩形区域下面
(8) 加载游戏背景音乐,设置无限播放模式
(9) 设置记录游戏状态的status变量、播放帧数frame变量
(10) 初始化我方飞机(OurPlane)对象,传入<2>中的屏幕对象
(11)开启while循环,设置帧速率为60,播放帧数frame循坏于(1到60之间),监听键盘事件(游戏退出、进入,游戏过程中控制飞机上下左右移动)并根据游戏状态值status分别绘制对应status下的游戏窗口中的元素
(12) 在__name__ == “__main__”结构中调用程序入口函数main( )
注意:
1、项目中所使用的静态文件包括图片资源、声音资源文件名切勿修改
2、项目的组织结构请参考文件中的项目结构图
一、规范【8分】
1、项目结构划分明确、清晰;
2、核心方法、功能添加适当注释;
二、程序整体运行效果【3分】
游戏正常运行,画面、音效与要求一致,基本功能全部实现。
三、常量配置文件constants【10分】
根据项目中静态资源存储位置,将游戏中所需资源进行常量配置,从而达到项目优化的目的。
四、飞机类基类Plane【27分】
根据面向对象编程的思想,将游戏中的飞机进行封装,使其实现游戏中的基本功能:
1、定义飞机类的父类Plane,抽取飞机对象的共同点扩展至飞机类的父类中;
2、自定义我方飞机类OurPlane,继承自1中的父类,完善该类的内容使达到游戏的运行效果;
五、我方飞机类OurPlane【15分】
依照面向对象中继承的特点,自定义继承自飞机类基类的我方飞机类,以满足游戏中我方飞机的功能实现。
六、子弹类Bullet【12分】
正确定义子弹类,使在游戏过程中我方飞机可正常发射子弹,当子弹飞出屏幕时,手动对子弹对象进行移除。
七、游戏入口文件【25分】
入口文件中主要实现对游戏运行流程的控制,包括我方飞机初始化以及位置更新、子弹发射,游戏运行窗口的基本信息设置等功能
作业素材仅供学习与参考,请按要求完成作业