VC++打飞机游戏.docx
- 文档编号:29483712
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:14
- 大小:28.92KB
VC++打飞机游戏.docx
《VC++打飞机游戏.docx》由会员分享,可在线阅读,更多相关《VC++打飞机游戏.docx(14页珍藏版)》请在冰豆网上搜索。
VC++打飞机游戏
面向对象方法及程序设计
课程设计报告
题目:
飞机大战
分组:
第3组
组员姓名:
岳洋、李梦婷、周鹏
班级:
计本1203班
**********************************
完成日期:
2014年6月22日
一、游戏概述…………………………………………………………2
(一)实训项目简介…………………………………………………2
(二)游戏功能介绍…………………………………………………2
二、相关技术……………………………………………………………2
(一)Windows定时器………………………………………………2
(二)OnKeyDown……………………………………………………2
(三)OnRButtonDblClk……………………………………………2
三、代码清单…………………………………………………………3
四、问题及解决方法…………………………………………………9
五、尚未解决的问题…………………………………………………11
六、游戏截图…………………………………………………………11
七、实践感言…………………………………………………………11
参考文献………………………………………………………………12
飞机大战
一、游戏概述
(一)实训项目简介
本次实训项目是做一个飞机大战的游戏,完成一个界面简洁流畅、游戏方式简单,玩起来易于上手的桌面游戏。
该飞机大战项目运用的主要技术即是MFC编程中的一些函数等技术完成。
(二)游戏功能介绍
主机为游戏者操控的飞机,可自由移动并发射子弹。
敌机为随机出现的飞机,当敌机与主机子弹发生碰撞,敌机与子弹就会爆炸并消失。
主机每击破一架敌机就会得10分,持续累加无上限。
当主机与敌机发生碰撞时,就会跳到游戏结束的图片。
二、相关技术
(一)Windows定时器
Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。
程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。
本程序中使用多个定时器,分别控制不同的功能。
在MFC的API函数中使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。
(二)OnKeyDown
KeyDown的功能是检查用户是否按了键盘上的键。
触发过程如下:
当按钮被按下时,发生keydown事件,keydown()方法触发keydown事件或当发生keydown事件时运行该函数。
(三)OnRButtonDblClk
只有具有CS_DBLCLKSWNDCLASS风格的窗口才接收OnRButtonDlbClk调用。
这是微软基础类窗口的缺省状态。
当用户按下、释放,然后在系统规定的双击时间限制之内再次按下鼠标右键时,Windows就调用OnRButtonDblClk。
三、代码清单
Cshot1View
public:
intx,y,i,m,shuliang;
structZIDAN//构建结构体ZIDAN
{
intx;
inty;
}zidan[18];
structDIJI//构建结构体DIJI
{
intx;
inty;
intn;
}diji[13];
//shot1View.cpp:
implementationoftheCShot1Viewclass
//
#include"stdafx.h"
#include"shot1.h"
#include"shot1Doc.h"
#include"shot1View.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CShot1View
IMPLEMENT_DYNCREATE(CShot1View,CView)
BEGIN_MESSAGE_MAP(CShot1View,CView)
//{{AFX_MSG_MAP(CShot1View)
ON_WM_KEYDOWN()
ON_WM_TIMER()
ON_WM_RBUTTONDBLCLK()
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
:
OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CShot1Viewconstruction/destruction
CShot1View:
:
CShot1View()
{
//TODO:
addconstructioncodehere
x=600;//初始化数据
y=550;
i=shuliang=m=0;
for(intj=0;j<20;j++)
zidan[j].y=zidan[j].x=0;
for(j=0;j<13;j++)
diji[j].x=diji[j].y=0;
}
CShot1View:
:
~CShot1View()
{
}
BOOLCShot1View:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCView:
:
PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
//CShot1Viewdrawing
voidCShot1View:
:
OnDraw(CDC*pDC)
{
CShot1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
}
/////////////////////////////////////////////////////////////////////////////
//CShot1Viewprinting
BOOLCShot1View:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//defaultpreparation
returnDoPreparePrinting(pInfo);
}
voidCShot1View:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addextrainitializationbeforeprinting
}
voidCShot1View:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addcleanupafterprinting
}
/////////////////////////////////////////////////////////////////////////////
//CShot1Viewdiagnostics
#ifdef_DEBUG
voidCShot1View:
:
AssertValid()const
{
CView:
:
AssertValid();
}
voidCShot1View:
:
Dump(CDumpContext&dc)const
{
CView:
:
Dump(dc);
}
CShot1Doc*CShot1View:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShot1Doc)));
return(CShot1Doc*)m_pDocument;
}
#endif//_DEBUG
///////////////////////////////////////////////////////////////////////////
//CShot1Viewmessagehandlers
voidCShot1View:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)//上下左右移动的代码
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CDC*pDC=GetDC();
CDCdc;
CBitmapbit,bit1;
bit.LoadBitmap(IDB_BITMAP3);
bit1.LoadBitmap(IDB_BITMAP1);
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&bit);
pDC->BitBlt(x,y,50,60,&dc,0,0,SRCCOPY);//贴一张空白位图,消去上一张战机的图像
switch(nChar)
{
caseVK_LEFT:
if(x>=220)
x-=30;
dc.SelectObject(&bit1);
pDC->BitBlt(x,y,50,60,&dc,0,0,SRCAND);//贴一张战机的图片
break;
caseVK_RIGHT:
if(x<=950)
x+=30;
dc.SelectObject(&bit1);
pDC->BitBlt(x,y,50,60,&dc,0,0,SRCAND);
break;
caseVK_UP:
y-=30;
dc.SelectObject(&bit1);
pDC->BitBlt(x,y,50,60,&dc,0,0,SRCAND);
break;
caseVK_DOWN:
if(y<=550)
y+=30;
dc.SelectObject(&bit1);
pDC->BitBlt(x,y,50,60,&dc,0,0,SRCAND);
break;
}
CView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
}
voidCShot1View:
:
OnTimer(UINTnIDEvent)//计时器的响应函数
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CDC*pDC=GetDC();
CDCdc;
CBitmapbit,bit1,fei,fei1;
dc.CreateCompatibleDC(pDC);
bit.LoadBitmap(IDB_BITMAP2);
bit1.LoadBitmap(IDB_BITMAP4);
fei.LoadBitmap(IDB_BITMAP5);
fei1.LoadBitmap(IDB_BITMAP6);
zidan[i].x=x+17;
zidan[i].y=y-32;//初始化战机坐标
i++;
i=i%20;//i计算子弹的数量
for(intj=0;j<20;j++)
if(zidan[j].x!
=0)
{
dc.SelectObject(&bit1);
pDC->BitBlt(zidan[j].x,zidan[j].y,15,36,&dc,0,0,SRCCOPY);//清空上一张子弹
}
for(j=0;j<20;j++)
if(zidan[j].x!
=0)
zidan[j].y-=30;
elsebreak;
for(j=0;j<20;j++)
if(zidan[j].x!
=0)
{
dc.SelectObject(&bit);
pDC->BitBlt(zidan[j].x,zidan[j].y,15,36,&dc,0,0,SRCAND);//贴子弹图
}
diji[m].x=200+rand()%800;
diji[m].y=0;
m++;
m=m%13;
for(j=0;j<13;j++)
if(diji[j].x!
=0)
{
dc.SelectObject(&fei1);
pDC->BitBlt(diji[j].x,diji[j].y,27,38,&dc,0,0,SRCCOPY);
}
for(j=0;j<13;j++)
if(diji[j].x!
=0)
{
diji[j].y+=50;
}
for(j=0;j<13;j++)
if(diji[j].x!
=0)
{
dc.SelectObject(&fei);
pDC->BitBlt(diji[j].x,diji[j].y,27,38,&dc,0,0,SRCAND);
}
CView:
:
OnTimer(nIDEvent);
}
//以下OnRButtonDblClk为李梦婷所设计
voidCShot1View:
:
OnRButtonDblClk(UINTnFlags,CPointpoint)//双击右键开始游戏
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CDC*pDC=GetDC();
CDCdc;
CBitmapbit;
bit.LoadBitmap(IDB_BITMAP1);
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&bit);
pDC->BitBlt(x,y,50,60,&dc,0,0,SRCAND);
pDC->MoveTo(200,0);
pDC->LineTo(200,700);
pDC->MoveTo(1025,0);
pDC->LineTo(1025,700);
pDC->TextOut(1100,300,"游戏说明:
");
pDC->TextOut(1100,350,"方向键控制上下左右");
pDC->TextOut(1100,400,"子弹为自动发射:
");
SetTimer(1,1000,NULL);
CView:
:
OnRButtonDblClk(nFlags,point);
}
/*说明:
岳洋:
主设计OnKeyDown函数为主设计。
周鹏:
主设计编辑OnTimer函数及实验报告。
李梦婷:
主设计OnRButtonDblClk。
有些地方都有三人合作商量所写*/
四、问题及解决方法
1、子弹不能从飞机的正中间发出?
初始化子弹的位置坐标时添加zidan[i].x=x+17;zidan[i].y=y-32;两句就能使子弹从飞机的正中间出发,原理为zidan[i].x、zidan[i].y为飞机矩形区域左上角坐标,令此分别等于x+17、y-32就完成了。
2、敌机如何才能随机从屏幕上方出现?
敌机随机出现只要添加随机函数rand即可,函数rand()为随机数生成器。
五、尚未解决的问题
1、子弹与敌机相撞消失?
2、主机与敌机相撞如何结束游戏?
六、游戏截图
单机鼠标右键游戏开始
七、实践感言
确定实训项目的时候,觉得对于大概的框架、功能、构想都比较清楚,所以就选了这个题目。
结果事实并非如此,一开始的时候就遇到了很大的困难,确定主机的功能的时候还比较简单一点,到设计敌机、子弹,就遇到了麻烦。
特别是最后确定敌机与子弹相撞爆炸消失的时候遇到了很大的阻碍,设计了很多算法,也在网上找了很多资料,也都没能完成,眼看着最后期限就快到了还是没能编好游戏,令人沮丧。
虽然这次实训我们组没能按照预想的计划完成任务,但在这个过程中还是收获了很多东西,对VC++游戏特别是MFC的使用有了大概的了解,暑假回家前准备到图书馆借几本相关的书籍资料,假期好好对VC做更加深入的认知。
参考文献
[1]VisualC++.NET编程教程,作者:
彭明伟,出版社:
北京希望电子出版社。
[2]VISUALC++从入门到精通,出版社:
化学工业出版社;第2版(2011年9月1日)
作者:
刘锐宁,宁坤等编著出版社:
清华大学出版社出版。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 飞机 游戏
![提示](https://static.bdocx.com/images/bang_tan.gif)