VC++俄罗斯方块课程设计报告含源代码.docx
《VC++俄罗斯方块课程设计报告含源代码.docx》由会员分享,可在线阅读,更多相关《VC++俄罗斯方块课程设计报告含源代码.docx(107页珍藏版)》请在冰豆网上搜索。
VC++俄罗斯方块课程设计报告含源代码
课程设计报告文档
题目:
俄罗斯方块
一.引言
1、编写目的:
通过本课程设计,使学生稳固面向对象程序设计的根本概念、原理和技术,学会使用VisualC++开发工具进行简单面向对象程序的开发,将理论与实际相结合,完成一个小型面向对象程序的设计与实现,并在此根底上强化学生的实践意识,提高其实际动手能力和创新能力。
2、.定义:
无
3、参考资料:
郑莉.C++语言程序设计.北京:
清华大学出版社,2003
罗建军.大学VisualC++程序设计案例教程.北京:
高等教育出版社,2004
刘路放.VisualC++与面向对象程序设计教程.北京:
高等教育出版社,2000
DavidJ.VisualC++技术内幕.潘爱民印译.北京:
清华大学出版社,1999
侯俊杰.深入浅出MFC.武汉:
华中科技大学出版社,2001
二.任务的描述:
1.目标:
编写基于VC++开发工具并能通过键盘和鼠标进行人机交流俄罗斯方块游戏,界面友好,容易操作的游戏。
2.功能描述:
通过控制键盘可以进行游戏的开始、暂停、结束;能够控制方块的移动、变形;具有进行经典的俄罗斯方块游戏的一般功能。
3.性能描述
〔1〕数据精确度:
无
〔2〕时间特性:
无
4.运行环境:
windows98以上操作系统
5.条件与限制:
硬件:
装有Windows操作系统的计算机
软件:
MicrosoftVisualStudio6.0、MicrosoftVisualStudio2005
三.任务设计
1、程序的整个流程图
N
N
Y
2、键盘响应函数流程图
N
Y
NNY
Y
YN
\NY
NY
N
Y
N
Y
3、等级管理模块流程图
N
Y
4、主界面显示模块流程图
N
Y
Y
〔1〕类1:
CAboutDlg〔〕类是建立MFC程序时自动生成的类,俄罗斯方块游戏根本上用不到这个类,故不做解释。
(2)类2:
CMainFrame()框架类主要是对游戏的框架进行设计。
数据成员:
CStatusBarm_wndStatusBar;工具栏
CToolBarm_wndToolBar;状态栏
成员函数:
1、CMainFrame()构造函数:
初始化游戏;
2、~CMainFrame()析构函数:
删除游戏数据;
3、OnCreate():
工具栏的实现;
4、PreCreateWindow〔〕游戏窗口的规格实现;
(3)类3:
COptionDlg〔〕游戏状态显示类:
主要实现对游戏在进行中的一些状态显示比方:
级别、下一个方块。
数据成员:
intm_oldArea;区域大小
intm_oldLevel;等级
intm_oldBlockSytle;背景风格
BOOLm_oldDrawGrid;
成员函数:
1、COptionDlg〔〕初始化界面:
用户选择的区域大小代码,及级别代码,方块样式
2、DoDataExchange〔〕数据类型的转换:
由键盘消息转换成函数响应消息
3、Onok〔〕当用户按OK按钮〔ID是IDOK〕时调用。
覆盖该函数执行OK按钮动作。
对话框包括自动数据检验和交换,缺省方式是对应用的某些变量进行数据的检验和更新。
〔4〕CSkyblue_RectApp〔〕程序自动生成。
〔5〕CSkyblue_RectView〔〕视图类:
这是本游戏主要编写的地方:
实现方块的随机生成、方块的移动、变形。
游戏的消行、升级、速度的提升以及游戏的开始和结束。
数据成员:
intm_nWidth;子窗口的宽度
intm_nHeight;子窗口的高度
intm_iCol;
intm_iRow;列与行的数量
intm_iLarge;〔小方块的大小,它会随着行与列的不同而不同,具体为:
12行10列,30个象素的正方形
18行15列,20
24行20列,15
30行25列,12〕
intm_iLevel;当前的级别,换算成速度的算法为:
1500-m_iLevel*200
intm_iBlockSytle;当前选择的方块显示样式
intm_iStartX;
intm_iStartY;游戏区域左上角的坐标
BOOLIsLeftLimit();坠物件是否可向左移动
BOOLIsRightLitmit();
intInterFace[74][4];接触面二维数组,记录1~7种下坠物的1~4种形态的接触面信息,把该下坠物的某种形态种的4个方块,有接触面那么记录方位,无那么为-1标识。
intm_currentRect;当前的方块形状
CStringm_strArea;
CStringm_strLevel;当前的样式,下一个将会出现的样式
intm_icurrentStatus;
intm_inextStatus;
OnDraw中需要用到的设备名称
CPen*m_pBlackPen;
CBrush*m_pGrayBrush;
CBrush*m_pBlackBrush;
BOOLm_bDrawGrid;是否画网格线
intm_iPerformance;游戏总成绩
BOOLm_bGameEnd;游戏是否已结束,为FALSE表示开始,否那么为结束
成员函数1、ActiveStatusToGameStatus()将当前下坠物的位置映射到游戏区域地图数组中去;
2、CSkyblue_RectView()初始化游戏;
3、~CSkyblue_RectView()删除游戏数据;
4、CurrentAreaAndLevel()用于生成当前区域大小与级别所对应的汉字描述;
5、DCEnvClear()调取位图资源;
6、DcEnvInitial()绘图环境初始化;
7、DrawGame(CDC*pDC)绘制整个游戏所在窗口的背景;
8、InvalidateCurrent()刷新当前的区域;
9、IsBottom()判断当前方块是否已到底,并且销行等相关的工作;
10、IsLeftLimit()方块是否还可以左移;
11、IsRightLitmit()方块是否还可以右移;
12、OnCreate(LPCREATESTRUCTlpCreateStruct)创立一些设备;
13、OnDraw(CDC*pDC)承当所有绘制屏幕工作;
14、OnGameEnd()游戏结束;
15、OnGameExit()清理内存设备环境,释放资源;
16、OnGameOption()游戏设置;
17、OnGamePaush()游戏暂停;
18、OnGameStart()游戏开始;
19、OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)()处理用户的输入,方块的左,右移,加速及变形;
20、OnOptionArea()用菜单设置区域大小;
21、OnOptionLevel1()用菜单设置游戏级别:
22、OnTimer()承当所有驱开工作;
23、OnUpdateGameEnd(CCmdUI*pCmdUI)()如果游戏开始,那么此[游戏结束]按钮被开启;
24、OnUpdateGameExit(CCmdUI*pCmdUI)如果游戏开始,那么此[退出系统]按钮被屏蔽;
25、OnUpdateGamePaush(CCmdUI*pCmdUI)如游戏开始,那么[游戏暂停]按钮开启
26、Random(intMaxNumber):
产生一个最大值不大于指定值的随机正整数(Random);
27、RectArrow(intm_Type):
当前方块下降加速,左移,右移
28、RectChange():
方块的变形
29、RectDown()当前方块下降
30、RectStatusToActiveStatus(intm_which)初始掉落时,将根据方块的样式决定当前动态数组的值
31、RectStatusToNextStatus(intm_which)初始掉落时,将根据方块的样式决定下一次将要掉下来的动态数组的值
3.类之间的关系:
四.编写代码
1.问题1
〔1〕问题描述:
所遇问题的描述。
〔2〕解决方法:
该问题的解决方法。
2.问题2
〔1〕问题描述:
所遇问题的描述。
〔2〕解决方法:
该问题的解决方法。
……………………………………………
五.程序运行
1、游戏主页面
:
游戏主界面,上方是开始、暂停、结束、设置按钮。
设置按钮
2、游戏开始:
注:
右上角是下一个方块
右下角分别显示分数、游戏大小和级别。
3、开始时可以按暂停按钮出现下面情况
开始按钮被激活
4、按结束按钮出现
设置按钮激活
5、消行及得分
6、升级
7、游戏结束
3.错误描述及其解决方法
〔1〕问题1:
问题描述:
所遇问题的描述。
解决方法:
该问题的解决方法。
〔2〕问题2
问题描述:
所遇问题的描述。
解决方法:
该问题的解决方法
………………………………………
六、感想认识
通过本次课程设计,谈谈对面向对象编程的体会。
七.程序代码
skyblue_Rect.cpp:
Definestheclassbehaviorsfortheapplication.
//
#include"stdafx.h"
#include"skyblue_Rect.h"
#include"MainFrm.h"
#include"skyblue_RectDoc.h"
#include"skyblue_RectView.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CSkyblue_RectApp
BEGIN_MESSAGE_MAP(CSkyblue_RectApp,CWinApp)
//{{AFX_MSG_MAP(CSkyblue_RectApp)
ON_COMMAND(ID_APP_ABOUT,OnAppAbout)
//NOTE-theClassWizardwilladdandremovemappingmacroshere.
//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!
//}}AFX_MSG_MAP
//Standardfilebaseddocumentcommands
ON_COMMAND(ID_FILE_NEW,CWinApp:
:
OnFileNew)
ON_COMMAND(ID_FILE_OPEN,CWinApp:
:
OnFileOpen)
//Standardprintsetupcommand
ON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:
:
OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CSkyblue_RectAppconstruction
CSkyblue_RectApp:
:
CSkyblue_RectApp()
{
//TODO:
addconstructioncodehere,
//PlaceallsignificantinitializationinInitInstance
}
/////////////////////////////////////////////////////////////////////////////
//TheoneandonlyCSkyblue_RectAppobject
CSkyblue_RectApptheApp;
/////////////////////////////////////////////////////////////////////////////
//CSkyblue_RectAppinitialization
BOOLCSkyblue_RectApp:
:
InitInstance()
{
AfxEnableControlContainer();
//Standardinitialization
//Ifyouarenotusingthesefeaturesandwishtoreducethesize
//ofyourfinalexecutable,youshouldremovefromthefollowing
//thespecificinitializationroutinesyoudonotneed.
#ifdef_AFXDLL
Enable3dControls();//CallthiswhenusingMFCinasharedDLL
#else
Enable3dControlsStatic();//CallthiswhenlinkingtoMFCstatically
#endif
//Changetheregistrykeyunderwhichoursettingsarestored.
//TODO:
Youshouldmodifythisstringtobesomethingappropriate
//suchasthenameofyourcompanyororganization.
SetRegistryKey(_T("LocalAppWizard-GeneratedApplications"));
LoadStdProfileSettings(0);//LoadstandardINIfileoptions(includingMRU)
//Registertheapplication'sdocumenttemplates.Documenttemplates
//serveastheconnectionbetweendocuments,framewindowsandviews.
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSkyblue_RectDoc),
RUNTIME_CLASS(CMainFrame),//mainSDIframewindow
RUNTIME_CLASS(CSkyblue_RectView));
AddDocTemplate(pDocTemplate);
//Parsecommandlineforstandardshellcommands,DDE,fileopen
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
//Dispatchcommandsspecifiedonthecommandline
if(!
ProcessShellCommand(cmdInfo))
returnFALSE;
//Theoneandonlywindowhasbeeninitialized,soshowandupdateit.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
returnTRUE;
}
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//Appcommandtorunthedialog
voidCSkyblue_RectApp:
:
OnAppAbout()
{
CAboutDlgaboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
//CSkyblue_RectAppmessagehandlers
//OptionDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"skyblue_Rect.h"
#include"OptionDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//COptionDlgdialog
COptionDlg:
:
COptionDlg(intm_iArea,intm_iLevel,intm_iBlockStyle,BOOLm_bMusic,BOOLm_bDrawGrid,CWnd*pParent/*=NULL*/)
:
CDialog(COptionDlg:
:
IDD,pParent)
{
m_oldArea=m_iArea;
m_oldLevel=m_iLevel;
m_oldBlockSytle=m_iBlockStyle;
m_oldMusic=m_bMusic;
m_oldDrawGrid=m_bDrawGrid;
//{{AFX_DATA_INIT(COptionDlg)
m_bMusic=FALSE;
m_bDrawGrid=FALSE;
//}}AFX_DATA_INIT
}
voidCOptionDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(COptionDlg)
DDX_Check(pDX,IDC_CHECK_GRID,m_bDrawGrid);
DDX_Check(pDX,IDC_CHECK_MUSIC,m_bMusic);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(COptionDlg,CDialog)
//{{AFX_MSG_MAP(COptionDlg)
ON_WM_CREATE()
//NOTE:
theClassWizardwilladdmessagemapmacroshere
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//COptionDlgmessagehandlers
intCOptionDlg:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CDialog:
:
OnCreate(lpCreateStruct)==-1)
return-1;
return0;
}
BOOLCOptionDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//参传来的参数赋初值
CComboBox*m_comboArea;
CComboBox*m_comboLevel;
CComboBox*m_comboBlockStyle;
CButton*m_btnDrawGrid;
CButton*m_btnMusic;
m_comboArea=(CComboBox