飞机大战实训报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计综合实践报告
姓名学号
飞机大战
班级项目名称
11.22—12.4
实习地点实习时间
实习成绩指导教师签字
信息科学与工程学院
2015年12月04日
目录
1概述 (3)
2相关技术 (3)
3需求分析 (7)
3.1功能需求分析 (7)
3.2数据需求分析 (8)
3.3行为需求分析 (8)
3.4其他需求 (9)
4总体设计与详细设计 (10)
4.1系统模块划分 (10)
4.2主要功能模块 (10)
4.3扩展功能设计思路 (12)
4.4软件结构设计体会 (13)
5编码实现 (13)
6测试情况说明 (19)
6.1战机移动及子弹发射模块测试 (19)
6.2爆炸模块测试 (19)
7. 实训中遇到的主要问题及解决方法 (20)
8. 实训收获与体会 (21)
9.济南参观体会 (21)
1. 概述
这次实训主要做的项目是飞机大战,主要实现的功能包括:
战机敌机BOSS可以发射导弹,其中战机发射导弹通过键盘上的空格键发射,敌机的导弹通过判断与战机的距离来自动发射,BOSS的导弹是一直产生的,对战机进行扫射。
战机导弹与敌机相撞,战机与敌机相撞,敌机导弹与战机相撞,战机导弹与BOSS相撞,战机与BOSS相撞都能实现爆炸效果。
战机通过方向键控制自由移动且不飞出程序边界,战机具有一定的初始左右上下移动的速度,玩家可以设置战机的速度控制战机的移动。
敌机可根据随机函数随机产生,且屏幕的上下方飞入,大Boss可以随着战机移动,或者是实现自己的移动,客机从屏幕的右方向左移动,客机上载着小人,战机攻打客机可以打死小人,小人将从客机上坠落。
战机具有吃生命值的功能,游戏过程中会随机往下掉落生命值,战机吃了之后,生命值会上升。
战机具有一定的大招,使用大招时战机可以发射导弹,但是其他的不能来攻打战机,战机可以通过使用大招来进行破关。
游戏背景可以移动,这样战机相对于背景来说是相对运动的,结束界面包括游戏胜利的界面和失败的界面。
游戏有各个关卡的划分,实现达到一定的条件可以实现升级,最后到达一定程度游戏结束。
添加游戏的无敌模式,即战机具有无限的生命打不死,可以持续玩。
添加游戏game over之后可以按键重玩的功能。
在游戏界面输出当前游戏进行信息,包括当前得分、战机生命值、敌机生命值、大Boss的生命值、当前关卡,以及当前的游戏模式。
2. 相关技术
2.1定时器的使用
Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。
程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。
本程序中使用多个定时器,分别控制不同的功能。
在MFC 的API函数中使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。
同时使用完成后要在OnDestroy中使用KillTimer()将定时器进行删除,否则会有内存的泄露导致程序运行时速度会越来越慢
在OnInitialUpdate()函数中设置
this->SetTimer(10,100,0);//背景图片的产生
在OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数中设置
this->SetTimer(1,10,0);//飞机的//飞机导弹的//客机的移动
this->SetTimer(2,60,0);//敌机的产生//敌机的移动,敌机与战机挨近时敌机产生炸弹//BOSS 的产生//敌机的导弹
this->SetTimer(3,50,0);//敌机与战机爆炸//生命值与战机相撞//战机与飞机导弹相撞爆炸//BOSS与飞机导弹相撞//敌机的导弹与战机相撞
this->SetTimer(4,100,0);//生命值的产生//生命值的移动//BOSS导弹的移动
2.2双缓冲技术
双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。
当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。
所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。
因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。
CBitmap MemBitmap;
CDC MemDC; //在view中定义一个位图对象
在view中定义的CDC*pDC都可以用&hMemDC来进行替换
添加WM_ERASEBKGND响应函数,并清除响应函数
BOOL OnEraseBkgnd(CDC* pDC)
{//return CDialog::OnEraseBkgnd(pDC);
return FALSE;
}
在绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
2.3获取窗口大小
利用this->GetClientRect(&rect1);函数取得屏幕窗口的大小,这样在程序运行时窗口才会正常的尺寸,否则战机可以处于窗口的外面,两一方面设置战机移动的条件限制战机使其不能一处当前窗口尺寸的范围,通过比较当前战机的位置与屏幕的位置进行比较CRect rect;
CPlane pl1;
满足pl1.pos.y>=rect1.top 战机才可以向上移动
pl1.pos.y<=rect1.Height()-战机的高度战机才可以向下移动
pl1.pos.x>=rect1.left 战机才可以往左移动
pl1.pos.x<=rect1.Width()-战机的宽度战机才可以往右移动
2.4透明贴图技术
透明贴图并不是真正意义上的透明,而是图像不需要显示的部分显示出的颜色是当前对话框的背景色,也就是说把图像不需要显示的颜色当成背景色,显示的部分作为前景色,透明就是把背景换成对话框背景。
绘制透明位图是指在绘制位图时只绘制除了指定颜色外的其余部分,而指定的颜色就被称为“透明色”。
通过将位图的背景色指定成“透明色”,在绘制时不绘制带“透明色”的这部分背景,仅绘制图像,这样就可以将图像透明地绘制到窗口上。
先在PS中或者是其他的可以进行抠图的软件中将所需要的图片抠出来,在资源视图中添加上然后图片展示时使用BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);来进行确认图片的位置将图片的背景色改成透明色,或者是利用TransparentBlt(int x, int y, int nWidth, int nHeight, &memDC,0,0,int nWidth, int nHeight,RGB(0,0,0));来进行实现。
TransparentBlt()函数从指定源设备上下文中的矩形区域中像素的色彩信息转化为目标设备上下文中。
TransparentBlt()函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接Msimg32.lib。
消除图片背景还可以CImageList类中的Draw()函数,该函数最后一个参数设置为ILD_TRANSPARENT,这样就可以在绘制图片时轻松消去图片背景。
2.5 MFC类库的使用
MFC,是一个微软公司提供的类库,以c++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。
其中包含的类包含大量Windows 句柄封装类和很多Windows的内建控件和组件的封装类。
在界面开发方面,MFC提供对消息循环的封装,使用消息映射来避免虚函数的开销。
MFC也提供常用WINDOWS通用控件的封装类。
MFC的主要优点是可以用面向对象的方法来调用Windows API,以及应用程序开发的边界。
MFC将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。
同时,在Visual C++内部也内建了很多对MFC的例如类向导这样的支持以减少软件开发的时间,使用类向导可以生成从Hello World这样的简单程序到活动文档这样的复杂程序。
MFC的消息映射机制也避免了使用性能较低的庞大虚函数表。
在本程序主要使用了Object类。
2.6 COblist链表
MFC类库中提供了丰富的CObList类的成员函数,此程序主要用到的成员函数如下:
(1) 构造函数,为CObject指针构造一个空的列表。
(2)AddHead()在列表头添加一个或一列新元素。
在操作前该列表可以为空。
返回新插入元素的POSITION值。
(3)GetHead(),访问链表首部,返回列表中的首元素(列表不能为空)。
(4) GetNext(),返回列表中尾元素的位置。
(5)GetHeadPosition(),返回列表中首元素的位置。
返回用于循环或使用对象指针获取的POSITION值,如果列表为空,那么返回NULL。
(6)RemoveAt(),从列表中删除指定位置的元素。
(7) RemoveAll(),删除列表中所有的元素。
2.7 CImageList链表
CImageList 类提供Windows普通图象列表控件的功能。
CImageList主要是用于设置两个爆炸的类中,主要使用的函数如下:
(1)Create()如果成功,则返回非零值,否则为0。
需要两步构造一个CImageList。
首先调用构造函数,然后调用Create,创建图象列表并附加给CImageList对象。
(2)Add()如果成功,则为第一个新图象的基于零的索引,否则为-1。
调用此函数来添加一个或多个图象或图标到图象列表中。
(3)Draw( CDC* pdc, int nImage, POINT pt, UINT nStyle );返回值:如果成功,则返回非零值,否则为0。
说明:调用此函数绘制在拖放操作中正在被拖动的图象。
2.8 CRect获得矩形区域
IntersertRect ( LPCRECT lpRect1, LPCRECT lpRect2 );此函数使CRect等于两个现有矩形的交。
交是同时包含在两个现有矩形中的最大矩形,如果两个源矩形是否有重合的部分。
如果有不为空,则返回非零值;否则,返回0
2.9添加背景
实现当前游戏界面背景的动态化
添加了一个Beijing的类,所有的图片都放在这个类中,包括游戏的开始图片,结束图片,game over的图片以及胜利的图片,在使用时调用这个类中的各类draw函数bool CBeijing::drawbj(CDC* pDC,CRect rect)
bool CBeijing::drawksbj(CDC* pDC,CRect rect)
bool CBeijing::drawjsbj(CDC* pDC,CRect rect)
bool CBeijing::drawwin(CDC* pDC,CRect rect)
2.10静态数据成员的使用
静态数据成员的使用,同时要进行声明
如在CEnemy类中
s tatic CImageList imglist;
s tatic bool loadimage(void);
声明
CImageList CEnemy::imglist;
2.11程序运行窗口添加对话列表设置速度
在资源视图中插入Dialog在工具箱中添加所有的输入框,在Menu菜单中设置,利用右键中的添加事件处理程序进行添加编辑,消息类型是command类列表选择view类
3. 需求分析(用面向对象方法给出系统的主要需求模型,略写)
3.1功能需求分析
1、战机可根据方向键控制自由移动且不飞出程序边界
2、敌机可根据随机函数自动随机产生,同时可以从屏幕的上下方飞入
3、战机实现发射导弹(空格键发射导弹),敌机实现发射子弹
4、大Boss的存在,可以随着战机移动,或者是实现自己的移动
5、客机的存在,客机上载着小人,战机攻打客机可以打死小人,小人将从客机上坠落
6、实现六种爆炸效果:战机导弹与敌机、敌机子弹与战机、战机与敌机相撞,战机导弹与Boss相撞,Boss导弹与战机相撞,战机导弹与客机相撞
7、战机具有一定的初始左右上下移动的速度,但是玩家可以通过修改战机的速度来控制战机的移动。
8、战机具有吃生命值的功能,游戏过程中会随机往下掉落生命值,战机吃了之后,生命值会上升。
9、实现游戏背景的移动,这样战机相对于背景来说是相对运动的
10、游戏的各个等级的划分,实现达到一定的条件可以实现升级,最后到达一定程度游戏结束
11、战机具有一定的大招,使用大招时战机可以发射导弹,但是其他的不能来攻打战机,战机可以通过使用大招来进行破关
12、添加游戏的无敌模式,即战机具有无限的生命打不死,可以持续玩
13、添加游戏game over之后可以按键重玩的功能
14、在游戏界面输出当前游戏进行信息,包括当前得分、战机生命值、敌机生命值、大Boss的生命值、当前关卡,以及当前的游戏模式
15、添加结束界面包括游戏胜利的界面和失败的界面
3.2 数据需求分析
生命值的大小,成绩的大小,到达一定成绩或者是其他条件后可以升级。
(1)战机:战机位置、战机的生命值、战机的移动速度
(2)敌机:敌机随机产生位置、敌机的移动速度
(3)战机导弹:产生位置、导弹移动速度、导弹的移动速度
(4)敌机导弹:产生位置、导弹的移动速度
(5)Boss:Boss的产生位置,Boss获得当前战机的位置、Boss会随着战机的移动而移动
(6)Boss导弹:Boss导弹的产生位置、并在Boss移动时不间断的产生、导弹的移动速度
(7)客机:客机的位置
(8)客机小人:当战机打中客机的时候、小人随之产生并从客机上掉落
(9)关卡:关卡的编号、关卡的难度、关卡的得分
3.3 行为需求分析
3.3.1战机的行为:
(1)能够左右上下的移动同时不飞出游戏窗口的边框
(2)具有一定的初始生命值,生命值结束后将会game over
(3)战机可以打敌机、大Boss、客机、并产生爆炸效果
(4)战机可以吃随机掉落的生命值,吃了之后自身的生命值得以增长
(5)战机的成绩会随着打敌机,打Boss得以增长,但是如果被打中的话成绩减少
(6)战机可以使用大招,躲避开其他的攻击,同时可以攻击其他
(7)可以发射多排导弹
3.3.2敌机的行为:
(1)敌机随机产生,将从屏幕的上下方进行飞入
(2)敌机与战机的距离到达一定的值后,敌机可以针对战机发射导弹,打中后,战机的生命值下降,成绩下降
3.3.3生命值的行为:
(1)随机产生,同时随机从屏幕上方掉落,敌机吃了之后生命值会得以上升
(2)在屏幕的左上方得以显示
3.3.4大Boss的行为:
(1)在游戏的第三关时产生,并可以发射多排导弹
(2)对游戏区域进行扫射,敌机基本上躲不开,不过敌机可以使用大招(保护罩)将大Boss打死
3.3.5客机的行为:
(1)在游戏第四关时出现,上面载有乘客
(2)客机不能发射导弹
(3)客机一旦被敌机打中,上面的乘客会往下掉落
3.4 其他需求
3.4.1、游戏可重玩
3.4.2、游戏结束后的提示
3.4.3、游戏的模式,包括无敌模式的设置
3.4.4游戏的关卡
3.4.5游戏的大招
4. 总体设计与详细设计
4.1 系统模块划分
4.2 主要功能模块
4.2.1玩家控制模块
4.2.2关卡升级模块4.2.3敌机攻击模块
4.2.4BOSS攻击模块4.2.5客机飞行模块
4.3 扩展功能设计思路
4.3.1 大BOSS的实现
添加一个CBoss的类,添加Boss图片的资源,在BOSS类中的draw函数中实现了boss在游戏输出界面的产生,Boss导弹的产生在Cbomb类中设置产生,设定Boss在第二关的时候出现,Boss具有发射多排导弹扫射敌机的功能,在代码中隐去的部分实现了Boss随战机的移动而移动的功能,没有隐去输出的部分是Boss的第二种方式,Boss直接从桌面的左边一直运动到桌面的右边,导弹会不停的产生并移动,两种方式的区别在于,第一种方式实现出来会是游戏的运行相对来讲比较卡,故此输出结果中使用了第二种的方式,相对来讲这种方式对于Boss的移动比较简单,实现时Boss会通过interrect函数获得与战机导弹的交互区域和战机与Boss导弹的交互区域,如果有交互时则产生爆炸效果,由于相对于玩家来讲,这个Boss的存在对于通关来讲比较困难,所以给战机设置了大招,战机按住T和可以发射导弹的空格键时,敌机和Boss都不能对战机发射导弹,此时敌机可以抓住机会,对Boss进行扫射一段时间后得以打死Boss。
由于时间有限,游戏中尚未实现的功能包括,对于大招使用次数的限制,大招使用场合的限制还不是特别完善。
4.3.2客机的实现
设置一个CAirplane的类,在资源视图中添加资源,利用draw函数在游戏界面中输出客机的图像,客机在在第四关中出现的,在游戏界面中是从右向左移动的,客机对于战机敌机来讲是不能发射导弹的,在游戏中当战机向客机发射导弹时客机上会自动的向下掉小人,
在游戏中的图片展示是小“心”,客机的产生和移动是在定时器中产生的,找到客机的下一个位置在ondraw中实现,客机中小人的产生也是在定时器中产生,区别在于当客机与飞机导弹相撞时才会产生小人,同时小人的移动的是在一个刷新速度更快的一个定时器中存在的,一旦相撞,小人会获取当前的客机的位置,同时产生并向下移动,在实现这个功能时出现的问题是小人会产生但是会固定在一个相对的位置不能向下移动,错误出现是因为定时器的时间设置问题,小人的移动和客机的移动不能同时放在一个刷新时间相同的计时器中小人的移动的定时器需要更快一旦。
4.4 软件结构设计体会
5. 编码实现
(1)游戏的开始和结束
if(nIDEvent==10)
{
BJ.drawksbj(&hMemDC,rect1);
}
if(life<=0)
{
BJ.drawjsbj(&hMemDC,rect1);
plist.RemoveAll();
plist2.RemoveAll();
plist3.RemoveAll();
plist4.RemoveAll();
plist5.RemoveAll();
plist6.RemoveAll();
plist7.RemoveAll();
plist8.RemoveAll();
}
(2)游戏的初始参数的设置
static int life=10;
static int score=100;
static int pass=1;
static int bosslife=50;
static int wudiscore=0;
(3)游戏关卡的设置
if(score>=200)
{
hMemDC.SetBkColor(RGB(255,255,255));
hMemDC.SetTextColor(RGB(255,0,0));
hMemDC.TextOutW(0,150,L"按G进入第二关");
if(GetKeyState('G')<0)
{
pass=2;
}
}
if((pass==2))
{
BO.drawboss(&hMemDC);
POSITION bo;
for( bo = plist7.GetHeadPosition(); bo != NULL; )
{
CBomb *temp=(CBomb*)plist7.GetNext(bo);
temp->drawbossbomb(&hMemDC);
}
}
////////////////////////////////进入第二关/////////////////////////// if(bosslife==0)
{
BO.posboss.x=-255;
BO.posboss.y=-300;
hMemDC.SetBkColor(RGB(255,255,255));
hMemDC.SetTextColor(RGB(255,0,0));
hMemDC.TextOutW(0,170,L"按Q进入第三¨关");
}
if(GetKeyState('Q')<0)
{
pass=3;
}
////////////////////////////////////////进入第三关///////////////////////// if(score>=600)
{
hMemDC.SetBkColor(RGB(255,255,255));
hMemDC.SetTextColor(RGB(255,0,0));
hMemDC.TextOutW(0,190,L"按M进入¨第四关");
if(GetKeyState('M')<0)
{
pass=4;
}
}
if((pass==4))
{
AI.drawair(&hMemDC);
}
(4)游戏的各个模式
if(GetKeyState('W')<0)
{
life=9999999999999999999;
score=0;
}
if(life>0)
{
BJ.drawbj(&hMemDC,rect1);
hMemDC.SetBkMode(TRANSPARENT);
CString str1,str2,str3,str4;
hMemDC.SetTextColor(RGB(255,255,255));
str1.Format(L"战机所剩生命值: %d",life);
str2.Format(L"boss所剩生命值:%d",bosslife);
str3.Format(L"所得分数:%d",score);
str4.Format(L"当前关卡:%d",pass);
hMemDC.TextOutW(0,10,str1);
hMemDC.TextOutW(0,30,str2);
hMemDC.TextOutW(0,50,str3);
hMemDC.TextOutW(0,70,str4);
hMemDC.TextOutW(0,90,L"战机获取能源生命值UP");
hMemDC.TextOutW(0,130,L"长按T键启用保护罩");
hMemDC.TextOutW(0,230,L"按W 进入无敌模式");
}
if(life<=0)
{
if(GetKeyState('N')<0)
{
life=10;
score=100;
}
else
{
BJ.drawjsbj(&hMemDC,rect1);
plist.RemoveAll();
plist2.RemoveAll();
plist3.RemoveAll();
plist4.RemoveAll();
plist5.RemoveAll();
plist6.RemoveAll();
plist7.RemoveAll();
plist8.RemoveAll();
}
}
if(GetKeyState('T')<0)//保À¡ê护¡è罩?
{
pl1.DRAWprotect(&hMemDC);
plist3.RemoveAll();
plist4.RemoveAll();
plist7.RemoveAll();
}
(4)游戏中的各个类
(5)游戏中的定时器
在OnInitialUpdate()函数中设置
this->SetTimer(10,100,0);//背景图片的产生
在OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数中设置this->SetTimer(1,10,0);//飞机的//飞机导弹的//客机的移动
this->SetTimer(2,60,0);//敌机的产生//敌机的移动,敌机与战机挨近时敌机产生炸弹//BOSS的产生//敌机的导弹
this->SetTimer(3,50,0);//敌机与战机爆炸//生命值与战机相撞//战机与飞机导弹相撞爆炸//BOSS与飞机导弹相撞//敌机的导弹与战机相撞
this->SetTimer(4,100,0);//生命值的产生//生命值的移动//BOSS导弹的移动
(6)游戏结束后各个参数的删除
this->KillTimer(1);
this->KillTimer(2);
this->KillTimer(3);
this->KillTimer(4);
plist.RemoveAll();
plist2.RemoveAll();
plist3.RemoveAll();
plist4.RemoveAll();
plist5.RemoveAll();
plist6.RemoveAll();
plist7.RemoveAll();
plist8.RemoveAll();
6.测试情况说明。
6.1战机移动及子弹发射模块测试
6.2爆炸模块测试
7. 实训中遇到的主要问题及解决方法
(1)随着添加的对象的类越来越多,游戏会运行的越来越卡,最终甚至会停下来,解决方法是需要将一些多余的东西删除,除了按照之前老师讲的,用完定时器之后要将定时器删除,删除建立的链表之外,还要将游戏东西删除,包括游戏过程中要将飞出游戏界面的敌机和敌机导弹删除,还有飞出界面的战机的导弹,还有如果BOSS 没有被打死但是会飞出界面,这些都需要进行删除。
对于定时器将一些相同时间的定时器进行合并,只留下必要的定时器,减少定时器的数量,链表可以同时使用的就同时使用,因为设置太多游戏会卡。
(2)一开始游戏画面会非常的闪,而且刚开始没有加入游戏结束的图片,使用的刷子进行刷屏,闪的会特别的厉害,需要加入双缓冲来解决
(3)战机的移动会移动出游戏界面需要进行限制,所以对上下左右键要控制战机的移动范围,战机的坐标是以战机的左上角的坐标来记录的,所以在限制范围的时候边框
右侧要减去战机的宽,边框下侧要减去战机的长度。
这样才能保障战机完全不飞出游戏边框。
(4)碰撞时碰撞效果会特别的快,8张碰撞的图片会特别快的一闪而过,解决方式是要调整定时器的时间
(5)碰撞时如战机和敌机碰撞的话,要将敌机删除,先通过读取当前敌机的位置,通过每个类中的GetRect()函数来得到区域,通过IntersectRect(&rt1,&rt2)来判断交互区域,如果有交互的话就产生爆炸效果,将之前保存敌机位置的变量RemoveAt(pos)进行删除,同时用delete来删除临时变量
(6)背景图片的滚动设置,实际上是利用了一张图片来得以实现的,利用一个循环,同时将图片的下坐标加加,看上去的效果就是图片进行滚动,这样相对来讲的话战机就是相对移动的
(7)MFC编程中有很多可以直接调用的函数,由于之前缺乏对这方面编程的经验,以至于本次项目开发过程中走了很多弯路。
通过寻求老师和同学的帮助,解决了开发中遇到的很多问题,也提升了自己调试错误的能力。
(8)利用随机函数来设定的敌机和生命值的随机产生,游戏刚开始的时候出现的会少一点,过一会就会有大量的产生
(9)游戏会中断,中断的出现大多是因为链表设置的问题,或者是对链表使用的错误,改正之后中断的错误就会减少。
(10)有的图片的出现的次序不同,如游戏结束的时候出现了结束的背景,但是战机还是存在的,解决方法是修改出现的次序,向出现游戏开始的背景,然后出现正常游戏运行时的背景,然后再出现敌机战机等各个对象,最后再出现结束背景。
8. 实训收获与体会
在实验的过程中一开始没有太大的把握,而且当初学习C++时并没有接触到MFC,这算是对于学习MFC功能的一个很好的机会,老师说过对于MFC中的很多函数和类不用完全掌握记住,但是如果一点也不熟悉的话就不了解很多函数的功能,所以要对于这些基本的功能要了解好,对于具体的通过查表来实现。
在实训的过程中,会遇到各种各样的BUG,也会出现中断,但是耐心的不断调试和询问同学也都得到了解决,在刚开始写的时候没有使用继承没有规划好导致最后再添加类的时候都比较麻烦,导致代码写的页比较的混论,所以一开始的时候就应该先规划好,然后再添加各类功能时才相对省事。
客机的功能是在后来一天
添加的,时间比较紧,做的比较仓促,但是发现由于之前出现的这样那样的错误,才对代码的理解比较透彻,所有时间虽然紧促,但是还是把部分的功能过顺畅的实现了,虽然这个小游戏关卡比较简单,图片不过精美,也不是太炫,但是毕竟是自己通过两个周的实训时间亲自做出来的,虽然会很累,整天熬在机房,但是还是为自己的成果感到骄傲,同时也在这两个周中特别有效率的学习到了不少的MFC的知识,熟悉了MFC编程技术、巩固了链表的使用方法并加深了对面向对象编程思想的理解,对以后程序的编写打下了良好的基础。
这次实训得到的最最有用的经验,细细想来并不是学会了哪些知识,而是认识到单纯课本学习的只是理论知识,只有加上上机实践才能真正掌握一门语言。
9.济南参观体会
这次去济南虽然只有短短的两天时间,但是我们还是参观了浪潮集团,齐鲁软件园,还有山大。
参观软件工业园应该是是学习计算机的重要的实践性环节,目的在于通过接触了解计算机的基本组成结构、计算机软件的开发流程以及计算机网络的相关知识,对所学专业有一个感性认识,树立正确的专业思想,为以后学习专业课程作好准备。
在参观的过程中我了解了一些原来没有了解的东西,扩宽了自己的视野,尤其是在听讲解员讲解的过程中,了解了一些原来没有关注过的计算机的知识,没有想到现在的技术以一种超过我们预料的快速的速度向前发展着,如果我们只是局限于我们自己的小世界中而不走出去看看的话就会成为井底之蛙,以为自己了解接触学习了不少的东西,实际上我们有很多的东西需要我们去不断的学习。
在齐鲁软件园中我们去了普联公司,公司老总给我们讲解了他们所需要的专业人才的要求,我们离他们的要求还有很远的距离,我们还有太多的知识还没有掌握好,而且原来学习的东西也学习的不扎实,有不少遗忘了的,而且还大多数是理论方面的知识,同时也通过这两个周的实训,将学的理论知识真正的用到了实践中去,虽然经过了这两个周,但是我们的实践经验还是不够充足,要想达到用人的要求还需要我们更多地努力,也需要不断的开阔自己的视野接触到更多更先进的东西。
21。