软件开发与创新第一周作业——软件反向开发

一、原始软件介绍

  原始软件使用C++语言、Qt软件编写,来源于去年本人参与的培训的Qt软件实例内容。

  原始软件为一款经典游戏——飞机大战,软件简单还原了游戏的基本玩法:玩家使用鼠标进行操纵我方飞机,飞机在飞行过程当中发射子弹攻击前方随机产生的敌机。该软件拥有较大的的改进空间。

二、软件改进建议

  以下为原始软件的运行效果:

 

  由以上的运行效果可以发现以下几个问题:

    1.游戏在子弹碰撞到敌机后敌机直接消失,缺少更为明显的效果

    2.游戏缺少计分方式

    3.游戏只在一张地图上进行

  针对以上的问题可对软件提出以下的优化建议:

    1.在飞机子弹碰撞到敌机时可增加一个爆炸的效果

    2.可以在游戏当中增加一个计分器,消灭一架敌机计1分

    3.游戏可增设多几个关卡,在不同关卡当中使用不同的地图

    4.可增设排行榜的系统

    ...

三、改进过程

  以下为原始软件源代码结构:

  

 

1.增加爆炸效果

  首先在config.h文件当中增加爆炸文件的配置:

#define BOOM_PATH ":/res/bomb-%1.png"
#define BOOM_NUM 20
#define BOOM_MAX 7
#define BOOM_INTERVAL 20

  而后创立boom.h文件声明并创建爆炸类:

#ifndef BOOM_H
#define BOOM_H

#include "config.h"
#include <QPixmap>
#include <QVector>

class Boom
{
public:
    Boom();

    void updateInfo();

    QVector<QPixmap> m_pixArr;
    int m_X;
    int m_Y;
    bool m_Free;
    int m_Recoder;
    int m_index;


};

  接着创建boom.cpp完善爆炸类:

#include "boom.h"

Boom::Boom()
{
    for(int i=0;i<BOOM_MAX;i++)
    {
        QString str=QString(BOOM_PATH).arg(i);
        m_pixArr.push_back(QPixmap(str));
    }
    m_X=0;
    m_Y=0;
    m_Free=true;
    m_index=0;
    m_Recoder=0;
}
void Boom::updateInfo()
{
    if(m_Free)
        return;
    m_Recoder++;
    if(m_Recoder<BOOM_INTERVAL)
        return;
    m_Recoder=0;
    m_index++;
    if(m_index>BOOM_MAX-1)
    {
        m_index=0;
        m_Free=true;
    }
}

  在mainscene.cpp的updateposition函数(更新位置数据)当中添加计算爆炸图片的代码段:

for(int i = 0 ; i < BOMB_NUM;i++)
    {
        if(m_bombs[i].m_Free == false)
        {
            m_bombs[i].updateInfo();
        }
}

  在paintEvent函数(绘制场景)当中增加绘制爆炸的代码段:

for(int i = 0;i<BOMB_NUM;i++){
        //非空闲飞机出场
        if(m_bombs[i].m_Free == false){
            //绘制出敌机
           painter.drawPixmap(m_bombs[i].m_X, m_bombs[i].m_Y,
                              m_bombs[i].m_pieArr[m_bombs[i].m_index]);
        }
}

  collisionDetection函数(碰撞检测)当中的碰撞发生语句当中增加播放爆炸效果的代码段:

//如果子弹矩形框与敌机矩形框相交,发生碰撞,同时子弹和敌机置为空闲状态即可
if(m_enemys[i].m_Rect.intersects(m_hero.m_Bullets[j].m_Rect)){
    m_enemys[i].m_Free = true;
    m_hero.m_Bullets[j].m_Free = true;
    for (int k = 0;k < BOMB_NUM;k++) {
        if(m_bombs[k].m_Free){
            //播放爆炸音效
            QSound::play(SOUND_BOMB);
            //空闲的爆炸 可以进行爆炸播放
            m_bombs[k].m_Free = false;//将需要的爆炸状态置为非空闲
           //更新爆炸坐标
            m_bombs[k].m_X = m_enemys[i].m_X;//爆炸位置就是飞机位置
            m_bombs[k].m_Y = m_enemys[i].m_Y;
            break;//推出循环 否则所有爆炸都结束
        }
}

2.增加计分器

  首先在mianscene.h中添加一个QLCDNumber控件与计分变量:

int score;
QLCDNumber *scoreDisplay;

  在mainscene.cpp的initScene函数(初始化场景)当中添加初始化内容:

scoreDisplay=new QLCDNumber(this);
scoreDisplay->show();
score=0;

  在playgame函数当中添加显示计分的代码:

scoreDisplay->display(score);

  最后在collisionDetection函数(碰撞检测)当中添加计分代码:

 

void MainScene::collisionDetection()
{
    for(int i=0;i<ENEMY_NUM;i++)
    {
        if(m_EnemyPlane[i].m_Free)
            continue;
        for(int j=0;j<BULLET_NUM;j++)
        {
            if(m_HeroPlane.m_Bullet[i].m_Free)
                continue;
            if(m_EnemyPlane[i].m_Rect.intersects(m_HeroPlane.m_Bullet[j].m_Rect))
            {
                score+=1;
                m_EnemyPlane[i].m_Free=true;
                m_HeroPlane.m_Bullet[j].m_Free=true;
                for(int k=0;k<BOOM_NUM;k++)
                {
                    if(m_Boom[k].m_Free)
                    {
                        m_Boom[k].m_Free=false;
                        m_Boom[k].m_X=m_EnemyPlane[i].m_X;
                        m_Boom[k].m_Y=m_EnemyPlane[i].m_Y;
                        //QSound::play(SOUND_BOOM);
                        break;
                    }
                }
            }
        }
    }
}

  以下为优化后的软件结构:

 

  以下为软件优化后的效果:

四、心得体会

  通过这次作业我了解到优化软件的步骤,并且亲自体验了软件优化的过程,这对于今后的软件开发和优化具有开导性的作用,此外由于时间以及技术能力的关系有些改进设想没有实现。

posted @ 2022-03-02 14:53  fei010910  阅读(96)  评论(0)    收藏  举报