信息科学与工程学院软件实践实训报告
{ }
//鼠标控制战机,发射战机子弹
void CPlaneGameView::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: 在此添加消息处理程序代码和/或调用默认值 CView::OnLButtonDown(nFlags, point); if( is_Pause == 0) {
CBomb *BombOne=new CBomb( myplane->GetPoint().x, myplane->GetPoint().y,1); PlaySound((LPCTSTR)IDR_WAVE2, AfxGetInstanceHandle(), SND_RESOURCE // TODO: 在此添加消息处理程序代码和/或调用默认值 CView::OnMouseMove(nFlags, point); if(is_Pause == 0)
myplane->SetPoint(point.x,point.y);
|SND_ASYNC);
ListBomb.AddTail(BombOne); CBomb
*BombTwo=new
CBomb(
myplane->GetPoint().x+35,
myplane->GetPoint().y,1); }
}
ListBomb.AddTail(BombTwo);
4.4 飞机大战游戏对象之间的碰撞实现
本飞机大战游戏中的碰撞考虑了飞机子弹打中敌机、敌机炸弹打中战机、战机与敌机相撞、敌机炸弹与战机子弹相撞四种情况,根据游戏对象的矩形区域是否有交叉,而确认两者是否相撞,而产生爆炸对象,添加到爆炸链表中。以战机与敌机相撞为例:
if(myplane != NULL&& is_Pause== 0) {
POSITION enemyPos,enemyTemp;
16
信息科学与工程学院软件实践实训报告
for(enemyPos= ListEnemy.GetHeadPosition();(enemyTemp=enemyPos)!=NULL;) {
enemy =(CEnemy *) ListEnemy.GetNext(enemyPos); //获得敌机的矩形区域
CRect enemyRect = enemy->GetRect(); //获得战机的矩形区域
CRect myPlaneRect = myplane->GetRect(); //判断两个矩形区域是否有交接 CRect tempRect;
if(tempRect.IntersectRect(&enemyRect,myPlaneRect)) { }//if
CExplosion *explosion = new CExplosion( enemy->GetPoint().x+18 , enemy->GetPoint().y + 18);
PlaySound((LPCTSTR)IDR_WAVE,AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC); ListExplosion.AddTail(explosion); //战机生命值减一 lifeNum_Me--; //删除敌机
ListEnemy.RemoveAt(enemyTemp); delete enemy; if(lifeNum_Me == 0) { }//if break;
//删除战机对象 delete myplane; myplane=NULL;
}//for
17
信息科学与工程学院软件实践实训报告
}//if
战机子弹打中敌机、敌机炸弹打中战机以及战机子弹与敌机炸弹对象的碰撞实现同上。
4.5 游戏界面输出当前信息
if(myplane != NULL&& is_Pause== 0)
{
HFONT font;
font=CreateFont(20,10,0,0,0,0,0,0,0,0,0,100,10,0); cdc.SelectObject(font); CString str;
cdc.SetTextColor(RGB(255,0,0));
str.Format(_T(\当前关卡:%d\cdc.TextOutW(10,20,str);
str.Format(_T(\当前得分:%d\cdc.TextOutW(10,40,str);
str.Format(_T(\剩余生命:%d\cdc.TextOutW(10,60,str);
}//if
if(myplane !=NULL && lifeNum_Me >0) { }
if(score_Me > 10*count_Life*pass_Num) { }
lifeNum_Me++;//生命值加1 count_Life++;//已增加生命值加1
游戏进入下一关,以及结束游戏界面设计代码与上类似。
18
信息科学与工程学院软件实践实训报告
5. 项目程序测试
5.1战机移动及子弹发射模块测试
用例 点击A键或鼠标左移 点击D键或鼠标右移 点击W键或鼠标上移 点击S键或鼠标上移 预期结果 战机向左移动 战机向右移动 战机向上移动 战机向下移动 实际结果 战机向左移动 战机向右移动 战机向上移动 战机向下移动 问题描述 修改方案 5.2敌机及炸弹模块测试 用例 玩家得分<50(未通过第一关) 玩家得分>50(通过第一关后) 预期结果 实际结果 问题描述 修改方案 敌机只从上方飞出,速度固定 敌机只从上方飞出,速度固定 敌机从上下两方向均可飞出,敌机从上下两方且速度不断增加 向均可飞出,且速度不断增加 5.3爆炸模块测试 用例 战机子弹打中敌机 预期结果 敌机位置处爆炸,敌机消失,战机生命-1 敌机炸弹打中战机 敌机战机相撞 战机位置处爆炸,战机生命-1 敌机位置处爆炸,敌机消失,战机生命-1 战机子弹与敌机炸弹相撞 战机生命值==0
敌机炸弹处爆炸,子实际结果 敌机位置处爆炸,敌机消失,战机生命-1 战机位置处爆炸,战机生命-1 敌机位置处爆炸,敌机消失,战机生命-1 敌机炸弹处爆炸,子弹 问题描述 修改方案 弹与炸弹均消失消失 与炸弹均消失消失 战机消失,GameOver或者过关 战机消失,GameOver或者过关 19
信息科学与工程学院软件实践实训报告
6. 实训中遇到的主要问题及解决方法
(1)由于对C++的面向对象的思想和逻辑思路不熟悉,不明白其中的封装之类的以及多态的思想,致使开始真正的进入实训接触到项目时没有开发思路,通过逐步查询书籍整理C++面向对象编程思路,才逐步理清项目的开发步骤。
(2)本飞机大战的游戏要求使用链表实现各游戏对象的存储和释放,由于链表知识掌握的不牢固,使用起来总是出现这样那样的错误,给整个游戏开发带来了很大的障碍,通过不断的调试修改,最终使程序正确运行。
(3)在绘制各种游戏对象—敌机和敌机炸弹时,开始使用随机函数,画出敌机时而很少,总是打不到预定的效果,后来经过修改使用定时器产生敌机和敌机炸弹,使整个游戏更加人性化。
7. 实训体会
(1)在本次飞机大战游戏项目的开发过程中遇到很多问题,大部分是因为对MFC编程的不熟悉以及链表掌握不牢固所导致的。
(2)MFC编程中有很多可以直接调用的函数,由于之前缺乏对这方面编程的经验,以至于本次项目开发过程中走了很多弯路。
(3)通过寻求老师和同学的帮助,解决了开发中遇到的很多问题,也提升了自己调试错误的能力。
(4)通过本次实训,使我熟悉了MFC编程技术、巩固了链表的使用方法并加深了对面向对象编程思想的理解,对以后程序的编写打下了良好的基础。
20