项目作业 828
等255人参与
来源: / 实现飞机大战

根据飞机大战游戏的规则,请大家动手实现该游戏的一个Demo版本,主要功能是实现我方飞机的上、下、左、右移动和子弹发射两个核心功能。

项目结构图:

//img1.sycdn.imooc.com//climg/5cd4dfae00014ce304570559.jpg

运行效果图:

演示视频
作业描述

一、语言和环境

      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分】

    入口文件中主要实现对游戏运行流程的控制,包括我方飞机初始化以及位置更新、子弹发射,游戏运行窗口的基本信息设置等功能

作业素材
下载素材

作业素材仅供学习与参考,请按要求完成作业

项目作业上传说明
第1步:上传你的作业压缩包
第2步:等待讲师一对一批复
第3步:查看讲师点评
上传作业

登录后查看更多作业,立即

意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师