软件开发与创新第一周作业——软件反向开发
一、原始软件介绍
原始软件使用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; } } } } } }
以下为优化后的软件结构:

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

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

浙公网安备 33010602011771号