飞机射击游戏程序设计.docx
- 文档编号:2082028
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:33
- 大小:122.65KB
飞机射击游戏程序设计.docx
《飞机射击游戏程序设计.docx》由会员分享,可在线阅读,更多相关《飞机射击游戏程序设计.docx(33页珍藏版)》请在冰点文库上搜索。
飞机射击游戏程序设计
《程序设计基础》课程设计
——飞机射击游戏程序设计
一、课程设计目的和要求
课程设计是课程教学中的一项重要内容,是完成教学计划达到教学目标的重要环节,是教学计划中综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义,开设课程设计的目的:
1、深化已学的知识,完成从理论到实践的转化
通过此次课程设计,进一步加深对C++语言和运用的了解,将理论知识运用于开发的实践,并在实践中逐步掌握软件工具的使用。
2、提高分析和解决实际问题的能力
课程设计不仅是软件工程实践的一次模拟训练,同时通过此次实践,积累经验,提高分析和解决问题的能力。
3、熟悉VC集成开发环境。
4、了解简单的数据结构和算法。
5、提高学生在实际操作中收集信息、对信息进行价值判断、进行信息整理、信息加工的能力;
6、培养“开拓创新“的能力
课程设计的要求体现于整个工作的各个阶段中,可根据所选课题的特点而有所侧重,但应达到如下的基本要求:
1、根据课题任务制定合理、可行的工作计划任务;
2、制定适当的技术方案;
3、学生在老师的指导下独立完成设计过程;
4、撰写课程设计说明书;
5、通过课程设计检查评定。
二、课程设计任务内容
设计一个飞机射击小型游戏。
1.学生根据自己的兴趣爱好或专长,确定一个课程设计主题;
2.根据确定的主题,通过各种途径收集、整理、加工所需要的信息;
3.利用C++语言和其它制作软件设计制作各个模块;
4.将各个模块联系起来;
5.调试和运行完成的程序;
6.将整个制作过程用书面形式写出来。
三、详细设计说明
(1)需求说明
我所设计的这个飞机游戏,是由两部分组成。
我方飞机在下面,向上发射子弹射击敌方飞机。
敌方飞机从上方下来,向下发射子弹。
我方飞机每接到一个我方子弹后便会增加火力,敌方火力也会增强且敌方飞机熟增多。
我方飞机共五次生命,被敌方射中五次,则游戏结束。
此时可以按esc退出,也可以继续游戏。
(2)游戏说明
正方:
具有生命力(本游戏设置为5),有火力,生命力每次被炸毁就减一,而当火力值大于5时,生命力和火力强度同增。
而火力,开始是0,表示单火力,之后,每次添加一个火力值就加一。
反方:
由计算机按时地、随机地产生飞机,按时地发射子弹,按时地移动子弹的位置。
火力:
之所以把火力作为一个角色,因为它的存在,是独立的;它的作用又是为正方服务的,它的产生也是我们对程序的专门设置而实现的。
(3)功能函数设计
ClassCGame:
控制整个游戏的类
主要成员函数:
voidDrawMessage(CDC*pDC,intwidth,intheight);//显示信息
voidFireOutIf();//火力实现:
火力位图是定时地出现,位置当然是随机的。
出现时必须先判断,如果已经出现,下移;如果没有出现,才出现。
而当它的位置和我方飞机位置相同时,我方火力增强,甚至生命力增强。
voidshotmove();//敌机子弹移动,具体情况是,清除这一次的背景数组的值,移动,检查是否出界,否则赋相应的值。
接着检查我方飞机是否被炸,并做相应处理。
voidEnemyshot();//敌机发射子弹,检查前面三排,如果有敌机,如果敌机的前面三个位置有不为零的,给相应的值
voidEnemyplaneout();//敌机出现,利用随机函数,让敌机在前面三排随意出现。
其中,do~while循环语句表示必定要产生一只敌机。
voidShot();//我方射击
voidTransparentBitmap(HDChdc,HBITMAPhBitmap,
shortxStart,shortyStart,shortxadd,shortyadd,
COLORREFcTransparentColor);//设置透明位图函数的添加
ClassCMainFrame:
//把一种指定的颜色变成透明色,并可改变大小
主要成员函数:
virtual~CMainFrame();//主函数框架;
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs);//设置屏幕大小
voidOnFullScreen();//使运行游戏进入全屏显示
classCMy6_1View:
主要成员函数:
intOnCreate(LPCREATESTRUCTlpCreateStruct);//在创建结构函数
voidOnDraw(CDC*pDC)//敌机子弹的不同的值是为了下一次下移的需要。
我方飞机和火力分别用一个点表示。
virtualvoidOnDraw(CDC*pDC);//重画火力位图
voidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags);//键盘操作
voidOnTimer(UINTnIDEvent)//时间段的操作:
移动背景位图,实现对方的智能操作,清理背景数组不该再出现的位图。
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);//预创建窗口函数
(4)数据结构设计
敌方的子弹射击系统
voidCGame:
:
Enemyshot()
back[i-1][j+1]=4;//数组赋值4,表示子弹向左下方移动
back[i][j+1]=5;//数组赋值5,表示子弹向下方移动
back[i+1][j+1]=6;}//数组赋值5,表示子弹向右下方移动
位图数据设计
voidCGame:
:
TransparentBitmap
{SelectObject(hTemp,hBitmap);//选入位图
GetObject(hBitmap,sizeof(BITMAP),(LPSTR)&m_bm);
POINTptSize;//显示位图宽高
ptSize.x=m_bm.bmWidth;//取得位图的宽度
ptSize.y=m_bm.bmHeight;}//取得位图的高度
背景系统数据设计
intback[15][12];//背景数组
intxStart,yStart;//飞机出现位置
CBitmapbmfire;//火力位图
CPointpointfire//火力位置
CRectm_FullScreenRect;//全屏显示时的窗口位置
(5)主要流程
游戏主界面
我方方向键控制,空格射击,
敌方向下射击
被击中一次,生命减少一次,接住一个自己的子弹,火力增大
随着时间越长,飞机数量和子弹增多
我方生命五次为0时
按esc键退出
继续游戏
(6)参数说明:
intwidth;//屏幕宽度
intheight;//屏幕高度
intgoup;//背景位图移动大小:
10
CBitmapbackmap;//背景位图
HDChdc,//hdc显示句柄
HBITMAPhBitmap,//hBitmap要显示的位图
shortxStart,
shortyStart,//xStart,xStart显示的位置
shortxadd,
shortyadd,//xadd,yadd显示的位图的加大加小
shortnumplane;//我方飞机数量
intback[15][12];//背景数组
intxStart,yStart;//飞机出现位置
intfire;//火力强度
(7)调试和运行
程序运行结果见下图:
1.游戏开始,我方共五次生命,空格键发射子弹,方向键控制飞机。
2.每接到自方一个子弹后,自己的火力便会增加,成为双火力,子弹方向改变,敌方火力也增强。
3.当我方被击中五次后,游戏界面会提醒你:
游戏结束,退出按esc,继续点击确定。
四、课程设计心得与体会
三周的课程设计已经结束了。
回想学习C++语言的过程中,既有快乐又有烦恼。
从见到书的那一刻,我就很好奇,《C++语言程序设计》到底是学什么的,有什么用。
刚开始上课时,还在迷茫这门课程是用来做什么的。
不过,这些感受都是在对这门课程不了解的情况下产生的。
后来慢慢的接触多了,听老师讲的多了,了解多了,渐渐的产生了兴趣。
尤其是学到语句和函数时,上机操作程序,经过编译,调试和运行后,出现界面,当时想真正的学好这门课程。
通过半个学期的学习,我掌握了基本知识。
这学期快结束时,被通知要进行三周的课程设计。
当时感觉学的东西很少,很零散,不知该怎么练到一起,就要课程设计,是不是有点困难。
第一周我们每个人都选好了题,但是我基本上都是在看书,把基本知识再熟悉一边,再交进程报告时,自己两手空空,感觉什么都没弄出来。
到了第二周,我开始着手写程序。
第二周结束的时候,我感觉自己收获挺大的,从一开始的迷茫,不知道从何下手到把程序中的几个模块编写出来,心里挺开心的。
但是,到了第三周,我由不得不再次陷入困境。
在整个程序的编写过程中。
最难的就是修改和删除这两个模块,这也是我第三周要解决的重点问题。
开始编写修改和删除时,很困难,去向其他人寻求帮助,在别人的帮助和提示下,我编完了修改程序,整个程序基本上全部完成了,就剩下完善工作了。
几个类都弄好了,各个程序相互组合,互补,大功告成。
虽然设计是完成了,但是我觉得其中还是由一些不足之处:
1.在游戏界面出来后,没有让选择是否开始,而是直接开始。
2.在我方飞机生命指数为0时,虽然让选择了游戏是否继续,可是在选择的同时,游戏还在继续进行。
3.游戏中敌方的子弹和背景相像,不太明显。
整个程序完成了,还有很多不完善的地方,希望自己以后办事的时候要认真,仔细,考虑周全。
短短的三周课程设计结束了,但是这段时间里,我又学到了更多C++知识,如:
对象数组,string类,文件流,建造工程,设计和实现界面等,同时我也被提醒以后办事的时候要认真,仔细,考虑周全。
,也看到了团队精神和互帮互助的重要性。
这一点会让我终生受益。
通过三周的课程设计,我觉得自己肚子里的墨水多了,收获也挺大的,这三周过的挺充实!
附录1:
参考文献
1.作者:
,
书名:
C++大学简明教程,
出版社:
电子工业出版社,
出版日期:
2005年9月第1版。
2.作者:
谭浩强;
书名:
C++程序设计,
出版社:
清华大学出版社,
出版日期:
2004年6月第一版。
3.作者:
王明福,
书名:
vicualC++程序设计,
出版社:
高等教育出版社,
出版日期:
2003年5月第一版。
附录2:
程序清单
#include"6_1#definenewDEBUG_NEW
#undefTHIS_6-1.cpp
#include"stdafx.h"
#include"6_1.h"
#include"MainFrm.h"
Doc.h"
#include"6_1View.h"
#ifdef_DEBUG
FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
CMy6_1App:
:
CMy6_1App(){}
CMy6_1ApptheApp;
BOOLCMy6_1App:
:
InitInstance()
{AfxEnableControlContainer();
#ifdef_AFXDLL
Enable3dControls();//CallthiswhenusingMFCinasharedDLL
#else
Enable3dControlsStatic();//CallthiswhenlinkingtoMFCstatically
#endif
SetRegistryKey(_T("LocalAppWizard-GeneratedApplications"));
LoadStdProfileSettings();//LoadstandardINIfileoptions(includingMRU)
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMy6_1Doc),
RUNTIME_CLASS(CMainFrame),//mainSDIframewindow
RUNTIME_CLASS(CMy6_1View));
AddDocTemplate(pDocTemplate);
//Parsecommandlineforstandardshellcommands,DDE,fileopen
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
//Dispatchcommandsspecifiedonthecommandline
if(!
ProcessShellCommand(cmdInfo))returnFALSE;
//Theoneandonlywindowhasbeeninitialized,soshowandupdateit.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();returnTRUE;}
classCAboutDlg:
publicCDialog
{public:
CAboutDlg();
protected:
DECLARE_MESSAGE_MAP()};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD){}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{CDialog:
:
DoDataExchange(pDX);}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
END_MESSAGE_MAP()
voidCMy6_1App:
:
OnAppAbout()
{CAboutDlgaboutDlg;aboutDlg.DoModal();}
6-1.h
#if!
defined(AFX_6_1_H__AF9C10A5_D5E7_11D5_B2C4_5254AB2BD63E__INCLUDED_)
#defineAFX_6_1_H__AF9C10A5_D5E7_11D5_B2C4_5254AB2BD63E__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#ifndef__AFXWIN_H__
#errorinclude'stdafx.h'beforeincludingthisfileforPCH
#endif
#include"resource.h"//mainsymbols
classCMy6_1App:
publicCWinApp
{public:
CMy6_1App();
DECLARE_MESSAGE_MAP()};
6-1Doc.cpp
#include"stdafx.h"
#include"6_1.h"
#include"6_1Doc.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
IMPLEMENT_DYNCREATE(CMy6_1Doc,CDocument)
BEGIN_MESSAGE_MAP(CMy6_1Doc,CDocument)//{{AFX_MSG_MAP(CMy6_1Doc)
END_MESSAGE_MAP()
CMy6_1Doc:
:
CMy6_1Doc()
{}//TODO:
addone-timeconstructioncodehere
CMy6_1Doc:
:
~CMy6_1Doc(){}
BOOLCMy6_1Doc:
:
OnNewDocument()
{if(!
CDocument:
:
OnNewDocument())returnFALSE;
returnTRUE;}
voidCMy6_1Doc:
:
Serialize(CArchive&ar)
{if(ar.IsStoring()){}//TODO:
addstoringcodehere
else{}}//TODO:
addloadingcodehere
#ifdef_DEBUG
voidCMy6_1Doc:
:
AssertValid()const
{CDocument:
:
AssertValid();}
voidCMy6_1Doc:
:
Dump(CDumpContext&dc)const
{CDocument:
:
Dump(dc);}
#endif//_DEBUG
6-1Doc.h
#if!
defined(AFX_6_1DOC_H__AF9C10AB_D5E7_11D5_B2C4_5254AB2BD63E__INCLUDED_)
#defineAFX_6_1DOC_H__AF9C10AB_D5E7_11D5_B2C4_5254AB2BD63E__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
classCMy6_1Doc:
publicCDocument
{protected:
//createfromserializationonly
CMy6_1Doc();DECLARE_DYNCREATE(CMy6_1Doc)
Operations
Overrides
public:
virtualBOOLOnNewDocument();
virtualvoidSerialize(CArchive&ar);//Implementation
public:
virtual~CMy6_1Doc();
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&dc)const;
#endif
protected:
DECLARE_MESSAGE_MAP()};
#endif//!
defined(AFX_6_1DOC_H__AF9C10AB_D5E7_11D5_B2C4_5254AB2BD63E__INCLUDED_)
6-1View.cpp
#include"stdafx.h"
#include"6_1.h"
#include"6_1Doc.h"
#include"6_1View.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
IMPLEMENT_DYNCREATE(CMy6_1View,CView)
BEGIN_MESSAGE_MAP(CMy6_1View,CView)
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_KEYDOWN()
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()
CMy6_1View:
:
CMy6_1View()
{backmap.LoadBitmap(IDB_BITMAP1);//TODO:
addconstructioncodehere
goup=1000;//开始背景位图的位置
bPause=true;}//是否暂停}
CMy6_1View:
:
~CMy6_1View(){}
BOOLCMy6_1View:
:
PreCreateWindow(CREATESTRUCT&cs)
{returnCView:
:
PreCreateWindow(cs);}
voidCMy6_1View:
:
OnDraw(CDC*pDC)
{inti,j;
CMy6_1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CRectWindowRect;
GetWindowRect(&WindowRect);//TODO:
adddrawcodefornativedatahere
width=WindowRect.right-WindowRect.left;//屏幕宽度
height=WindowRect.bottom-WindowRect.top;//屏幕高度
CDCDc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can'tcreateDC");
Dc.SelectObject(backmap);//在不同位置显示位图
pDC->BitBlt((width-800)/2,0,800,height,&Dc,0,goup-2000,SRCCOPY);
pDC->BitBlt((width-800)/2,0,800,height,&Dc,0,goup,SRCCOPY);//显示两张位图使它们连接
CClientDCdc(this);
//显示
//检查背景数组
for(i=0;i<15;i++)
for(j=0;j<12;j++)
{if(game.back[i][j]==2)//显示我方子弹
game.TransparentBitmap(dc.GetSafeHdc(),game.bmshot,(width-800)/2+i*50+20,j*height/600*50,0,0,game.cTransparentColor);//利用透明显示函数
if(game.back[i][j]==3)//显示敌机
game.TransparentBitmap(dc.GetSafeHdc(),game.enemy,(width-800)/2+i*50+20,j*height/600*50,0,0,game.cTransparentColor);
if(game.back[i][j]==7||game.back[i][j]==8)//飞机炸毁
game.TransparentB
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 飞机 射击 游戏 程序设计