基于MFC的拼图游戏设计
宋富冉 操梦雅
摘要:拼图游戏是一个广受欢迎的智力游戏,按人数参与个数可分为单人游戏和多人游戏,按拼图规则它可分为摆放式和挪动式两种类型。本设计是基于Visual C++ 6.0和MFC的拼图游戏设计,设计了一个操作简单的挪动式单人拼图游戏。本游戏主要包括游戏界面设计、难易度选择、游戏图片选择、游戏系统设计、判断拼图是否成功等几个模块,程序设计中应用了类、数组、鼠标响应、菜单消息响应等元素和语句。此游戏的设计主要以学习和熟悉Visual C++ 6.0和MFC软件开发为主要目的。
关键词:拼图; Visual C++ 6.0; MFC
1.任务描述
1.1 拼图简单介绍
拼图游戏是广受欢迎的一种智力游戏,它的变化多端,难度不一,让人百玩不厌。
个性化的拼图,拼凑的不仅仅是一张照片,而是一个故事,一段回忆,一段温情。每一片的单片都有属于它自己的位置,就像每段回忆都有属于它的故事,你要将它放在专属的地方。你可以把你记忆中最深刻的片段,你挚爱的照片,你最难忘的一瞬间,做成拼图,在你想起的时候一一拼起。
拼图游戏不仅能增强思维能力,提高智力,而且富含哲理,有助于加强我们的动手能力和我们的洞察能力。
1.2 基本设计要求
我们设计的拼图游戏是一个具有简单的系统界面,操作简单易行,上手快,适用于广大用户的小游戏。此游戏分散的小图片的移动规则是小图片会朝着空位置方向移动,玩家在界面上先通过鼠标点击“游戏图片选择”选择要拼的图片,然后通过鼠标左键点击要移动的小图片,小图片会自动移动到原来没有图片的位置,移动时,预备移动的图片旁边必须要有可供移动的位置,直到拼合出原来的图片,并且成功拼成图片后会出现“看来这对你来说太简单了,挑战更高难度吧!”一句话。具体设计要求如下:
(1)可以打开并显示.bmp任意大小的图片;
(2)游戏开始之后,可以自动随机打乱图片;
(3)用户可以点击方块进行上下左右的交换,直到拼出原图片;
(4)系统能够自动检测用户是否拼出原图,并提示用户拼图是否成功。
2.系统需求分析
2.1 功能需求分析
(1)用户能用鼠标控制系统界面上各个菜单选项的选择。
(2)游戏难度选择功能:用户可以通过参数设置自定义选择游戏的难度,系统开始默认的是9块,如果用户想挑战更困难的,可以在设置参数设置中进行相应的参数修改,比如4*4=16块、5*5=25块、3*4=12块等。
(3)游戏音乐播放功能:用户可以根据自己的喜好进行选择是否播放音乐,所播放的音乐也是用户根据喜好自己来选择的。
(4)游戏原图显示功能:当玩家在玩游戏过程中忘记各个小图片的整体排列位置时能够进入原图显示功能查看完整图片,参考原图进行拼图游戏,以提高游戏的趣味性。
(5)游戏判断功能:用户通过移动每一小块图片,最终拼出和导入的图片一致时,系统则会判断你拼图成功,并提示“看来这对你来说太简单了,挑战更高难度吧!”这句话。
图2-1 系统功能模块
2.2 界面设计需求
该拼图游戏是以对话框的形式显示出来,顶部为标题栏,接着是菜单栏,菜单栏上是五个菜单选项:主菜单、游戏图像选择、参数设置、原图设置、帮助。然后接下来就是拼图游戏的拼图部分主界面。
2.3 系统其他需求分析
(1)性能要求
可靠性强、实时性好
(2)设计约束
开发工具:VC++ 6.0、 运行环境:windows 2000以上
(3)软硬件要求
在windows平台上运行、应用程序用C++语言开发、客户端使用普通个人计算机。
2.4系统流程图
图2-2系统流程图
流程图说明:
(1)启动程序,进入游戏界面。
(2)用户根据自己的想法和意愿选择游戏图片,并进行游戏参数设置后,程序有相应的操作,对应程序根据参数设置进行图片的分割,游戏区域均分,将分割后的子图片填充到游戏区域相等面积的方格内,并记录初始各个子图片的原始坐标,然后随机走动200步。(这个过程执行只在一瞬间即可完成)显示出游戏界面。
(3)用户开始游戏,使用鼠标或者键盘上下左右键来进行拼图,在此过程中,程序会实时刷新画面,并全盘对比各个子图片的坐标和原始坐标是否相同,若相同则游戏结束,系统提示拼图成功,若不同,则用户继续游戏,继续移动子图片,判断程序循环执行,直到拼图成功。
(4)若在游戏过程当中,想要参照原图,则点击原图显示菜单选项,原图像显示子程序被调用,并将原图像显示在游戏区域一侧,供游戏者参考,不想参考可再次点击原图显示不显示原图像。
(5)参数设置选项,可以进行拼图的难度设置,即图块的行列数设置,以及游戏背景音乐的设置,在此过程中程序将执行相应的子函数进行响应用户操作。
(6)中途可以随时重新开始新游戏,退出游戏,参数设置,原图显示与否,调换游戏图片等,不必关闭程序重新打开。并且确保每次拼图必定会成功,不会出现拼图不成功的情况。
3.函数功能设置
(1)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ //切换"文本提示形式"菜单选项为"图像提示形式"
HMENU hmenu;
hmenu=::GetMenu(m_hWnd); //获取主菜单控制权
//获取图片选取菜单选项所在的子菜单栏目的控制权
hmenu=::GetSubMenu(hmenu,1);
char * hbmp;
UINT ITEM_ID;
HINSTANCE hinst = AfxGetInstanceHandle();//获取实例的句柄
//载入相关的缩小预览型的位图图片,并进行相关选项的属性修改
hbmp=(char *)LoadBitmap(hinst,MAKEINTRESOURCE(IDB_PIC1));
//图片的载入
ITEM_ID = ::GetMenuItemID(hmenu,1); //相应菜单选项的ID获取
//属性修改--切换成图像显示方式
::ModifyMenu(hmenu,1,MF_BYPOSITION|MF_BITMAP,ITEM_ID,hbmp);}
(2)BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT,CCreateContext* pContext){ //创建1行2列的分裂视图,设定出游戏界面(参见图3-1) m_wndSplitter.CreateStatic(this,1, 2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CSFRCMYPINTUView), CSize(300,0), pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(COrgView), CSize(0,0), pContext);
m_wndSplitter.SetActivePane(0,0); //将第一个作为当前激活状态的视图}
图3-1 游戏初始界面
(3)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{ //设置对应图3-1的初始界面窗口显示的大小
cs.cx = 600;
cs.cy = 400;
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
| WS_THICKFRAME | WS_SYSMENU;
cs.dwExStyle = WS_EX_ACCEPTFILES;
}
(4)void COrgView::OnDraw(CDC* pDC)
{// 源图像绘制函数
CSFRCMYPINTUDoc* pDoc = (CSFRCMYPINTUDoc*)GetDocument() CDC memdc; //使用内存DC
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(pDoc->m_bitmap); pDC->BitBlt(0,0,pDoc->m_bmpWidth,pDoc->m_bmpHeight,
&memdc,0,0,SRCCOPY); / /整幅图拷贝}
void COrgView::DrawAll(CDC *pDC)
{//是否显示原图像的响应函数}
(5) void COrgView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint){//更新界面函数}
(6)void CSetitingDlg::OK()
{//确定并保存参设设置的所有更改(参见图3-2)}
(7)BOOL CSetitingDlg::OnInitDialog()
{CDialog::OnInitDialog();//初始化各个游戏参数(部分可参见图3-2)
m_iCols=AfxGetApp()->GetProfileInt(_T("游戏参数"),_T("hnums"),3);
m_iRows=AfxGetApp()->GetProfileInt(_T("游戏参数"),_T("vnums"),3);}
(8)void CSetitingDlg::OnOpen()
{//选取播放背景音乐时,打开相关文件函数(参见图3-2)
CString strFilter="MP3文件(*.mp3)|*.mp3";
CFileDialog fileopen(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN
OVERWRITEPROMPT,strFilter);if(fileopen.DoModal()==IDOK)
m_strMusicFileName=fileopen.GetPathName();UpdateData(FALSE);}
(9)void CSFRCMYPINTUDoc::GameMixMove()
{// 游戏初始化,随机打乱图像,随机走300步}
(10)void CSFRCMYPINTUDoc::GameMove(UINT nChar)
{//根据按键输入指示命令作移动操作函数,与(9)协作}
(11)BOOL CSFRCMYPINTUDoc::IsWin(void)
{//检测是否拼图成功函数//胜利的检测方法是判断地图的所有方块的内部数据是否全为其行列数,是则表示排列好,胜利}
(12)void CSFRCMYPINTUDoc::MapInitial()
{//图片数据的初始化函数
int i,j;//将原来各个位置的数据填好其所在的行ID,列ID
for(i=1;i<=hnums;i++)
{for(j=1;j<=vnums;j++){m_map[i][j].row =i; m_map[i][j].col =j;}}}
(13)void CSFRCMYPINTUDoc::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){ // 处理键盘事件函数}
(14)void CSFRCMYPINTUDoc::OnMenuOrgPicShow()
{// 修改窗口是否显示源图的菜单消息处理函数
m_bShowOrgPic = !m_bShowOrgPic; //修改原来的显示
SetWindow_N_ViewSize(); //重设窗口大小与视图分布}
(15)void CSFRCMYPINTUDoc::OnNewGame()
{//开始新游戏函数(参见图3-1)
SetWindow_N_ViewSize();
MapInitial(); //地图的初始化
m_blankPos.row =hnums; //打乱前将空白块起点放在右下角
m_blankPos.col =vnums;
GameMixMove();// 打乱地图(随机移动200步)
UpdateAllViews(NULL); //更新视图}
(16)void CSFRCMYPINTUDoc::OnPic1()
{//游戏图片选取函数(参见图3-1)
PicSelect(IDB_BITMAP1);}
(17)void CSFRCMYPINTUDoc::OnSet()
{//游戏参数设置响应函数(参见图3-2)}
图3-2 参数设置对话框界面
(18)void CSFRCMYPINTUDoc::OnUserpic()
{// 用户选择路径自定义图片函数}
(19)void CSFRCMYPINTUDoc::SetWindow_N_ViewSize()
{//设置开始游戏后游戏窗口界面大小函数}
(20)void CSFRCMYPINTUView::OnLButtonDown(UINT nFlags, CPoint point)
{// 处理鼠标左键消息函数
CSFRCMYPINTUDoc* pDoc = (CSFRCMYPINTUDoc*)GetDocument();
pos DownPos; //计算出鼠标点击所在的cell方块位置
DownPos.row =point.x/pDoc->m_cellWidth+1;
DownPos.col =point.y/pDoc->m_cellHeight+1;
//根据当前空白方块位置将鼠标点击其相邻方块的情况
if(abs(DownPos.row-pDoc->m_blankPos.row)+abs(DownPos.col-pDoc->m_blankPos.col)==1){if(DownPos.row - pDoc->m_blankPos.row == 1)
{pDoc->OnKeyDown(VK_RIGHT,0,0);}
………………(中间略去)………………………….
CView::OnLButtonDown(nFlags, point);}
(21)void CSFRCMYPINTUView::DrawGameBlocks(CDC *pDC)
{// 绘制游戏所有当前散乱的方块}
(22)void CSFRCMYPINTUView::DrawCellBlock(CDC *pDC, pos destPos, pos srcPos){ //根据源方块的位置和目标放开位置(当前方块实际位置)}
(23)void CSFRCMYPINTUDoc::PlayMusic()
{ // 播放背景音乐函数//说明: 利用MCI机制控制媒体设备放音}
4.数据结构的设计
在函数功能的设计中我们提到了相关的结构体的定义,在这里给出重要的结构框架定义:
(1 ) struct pos //方块位置结构
{
int row; //图像所在的行坐标
int col; //图像所在的列坐标
};
(2) class OrgView:public CView //原图像显示类
{
void COrgView::DrawAll(CDC *pDC){}
void COrgView::OnDraw(CDC* pDC){}
…….
};
(3) class CSetitingDlg : public CDialog //参数和音乐播放等对话
框对应设置处理类
{
void CSetitingDlg::OK(){}
void CSetitingDlg::OnOpen(){}
BOOL CSetitingDlg::OnInitDialog(){}
…….
};
(4) class CSFRCMYPINTUApp : public CWinApp //程序基础类
{
……
};
(5) class CSFRCMYPINTUDoc : public CDocument //程序基础文档类
{
BOOL CSFRCMYPINTUDoc::IsWin(void){}
void CSFRCMYPINTUDoc::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){}
void CSFRCMYPINTUDoc::OnNewGame() {}
void CSFRCMYPINTUDoc::OnPic1() {}
void CSFRCMYPINTUDoc::OnSet(){}
void CSFRCMYPINTUDoc::OnUserpic() {}
void CSFRCMYPINTUDoc::PlayMusic(){}
…….
};
(6) class CSFRCMYPINTUView : public CView//程序基础视图类
{
void CSFRCMYPINTUView::DrawLines(CDC *pDC){}
void CSFRCMYPINTUView::DrawBlankBlock(CDC *pDC){}
void CSFRCMYPINTUView::DrawCellBlock(CDC *pDC, pos destPos, pos srcPos){}
void CSFRCMYPINTUView::OnLButtonDown(UINT nFlags, CPoint point){}
void CSFRCMYPINTUView::OnDraw(CDC* pDC){}
……
};
(7) class CAboutDlg : public CDialog//程序基础对话框类
{
…….
};
(8) class CMainFrame : public CFrameWnd//程序主函数类
{
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){}
……
};
5.详细设计
5.1 初始窗体设计
利用MFC AppWinzard生成五子棋游戏应用程序框架具体步骤如下:
1.执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWizard(exe)选项,然后在Project name文本框中输入SFRCMYPINTU。Lacation文本框是指项目的本地路径。
图5-1 新建MFC AppWinzard工程文件
2.单击按钮,弹出MFC AppWinzard_Step1对话框。如图所示。
图5-2 选择单文档模式
3.单击完成按钮,则建立一个单文档应用框架。
5.2 菜单设计
1.添加菜单项
图5-3 添加menu菜单
2.给对应的菜单项添加响应函数
(1)单击菜单右键,选择ClassWizard,在Class name:中选择在哪个类中添加响应函数,在Messages:中选择COMMAND,选中完成后,点击 Add Function,然后可以点击Edit Code编辑响应函数,比如游戏图片选择菜单下的自定义图片和系统图片菜单添加响应函数如下图所示:
图5-4 添加菜单响应函数
其响应函数代码如下:
1)系统图片
void CSFRCMYPINTUDoc::OnPic1()
{
// TODO: Add your command handler code here
PicSelect(IDB_BITMAP1);
}
2)自定义图片
void CSFRCMYPINTUDoc::OnUserpic()
{//用文件对话框的方式选择播放的音乐
CString filter="BMP文件(*.bmp)|*.bmp";
CFileDialog picfile(TRUE,NULL,NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,filter);
if(picfile.DoModal()==IDOK)
{//确定后读入位图并开始游戏
HBITMAP hbitmap; //按照尺寸m_BMP_WIDTH,m_BMP_HEIGHT读
//入位图文件(根据源图比例放大与缩小)
hbitmap=(HBITMAP)::LoadImage(NULL,
picfile.GetPathName(),IMAGE_BITMAP,
m_BMP_WIDTH,m_BMP_HEIGHT+180,LR_LOADFROMFILE);
m_bitmap.Detach();//弃旧选新
m_bitmap.Attach(hbitmap);
CSFRCMYPINTUDoc::OnNewGame();//开始游戏}
}
(2)操作菜单分为:原图显示、参数设置、开始新游戏和退出四个子菜单
(3)帮助菜单:一个关于拼图游戏的菜单,其响应函数如下:
void CSFRCMYPINTUApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
以上添加函数等功能,同类功能添加,操作步骤完全一样,不再重复。
5.3 游戏设计
5.3.1 参数设置设计
首先SFRCMYPINTU resources在引用一个对话框资源Dialog,并添加一个对话框类,将所需要设置的参数等对话命令符等添加完毕,并设置好相应的名称及ID号。也为此参数设置添加了一个类,其功能是对对话框所列参数更改等设置相应函数命令的处理。添加设置结果如下图所示:
图5-6游戏参数设置画面
然后,为这个对话框的弹出指令添加相应的响应函数如下:
void CSFRCMYPINTUDoc::OnSet()
{ CSetitingDlg set;
if(set.DoModal()==IDOK)
{
hnums=set.m_iCols;
vnums=set.m_iRows;
m_bMusic=set.m_bMusic;
m_szMusicFileName=set.m_strMusicFileName;
…………………
OnNewGame();}}
5.3.2 原图显示设计
在这一部分设计中,首先为其独自添加一个类,来进行相应的函数处理,其功能设置只包含一个,原图像的显示与否:子函数包含两个void COrgView::OnDraw(CDC* pDC)与void COrgView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint),其显示结果效果图如下图所示:
图5-7游戏原图显示与否效果图
5.3.3 游戏图片绘制设计
在此部分,初始状态是将整幅图片绘制显示在游戏区域,并将其根据参数设置等大小划分游戏图片块,并将其初始坐标利用二维数组m_map[i][j].保存下来。然后才去绘制空白块,覆盖初始右下角的原始游戏图块,即用空白块代替最右下角图片块,然后随机移动空白块与游戏图片块的交换,也就是初始化游戏,实现打乱的功能。
另外,本人采用的是缓存绘制,只进行初始化图片坐标的保存,在游戏过程中利用缓存存储各个子游戏块的坐标。最后判断拼图是否成功时,再将其缓存坐标与原始坐标相比较,判断是否拼图成功。
其绘制代码如下:
void CSFRCMYPINTUView::OnDraw(CDC* pDC)
{
//a.获取文档数据控制权
CSFRCMYPINTUDoc* pDoc = (CSFRCMYPINTUDoc*)GetDocument();
//b.使用内存设备环境memDC
CDC memDC; // 与内存环境关联的内存位图memBmp
memDC.CreateCompatibleDC(pDC);
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(pDC,
pDoc->m_bmpWidth,pDoc->m_bmpHeight);
memDC.SelectObject(&memBmp);
//c. 将图像绘制到内存位图memBmp中
//1.绘制游戏所有当前散乱的方块
DrawGameBlocks(&memDC);
//2.绘制空白方块
DrawBlankBlock(&memDC);
//3.绘制边界间隔线条
DrawLines(&memDC);
//d.整幅图从内存memBmp拷贝到屏幕
pDC->BitBlt(0,0,pDoc->m_bmpWidth,pDoc->m_bmpHeight,
&memDC,0,0,SRCCOPY);
}
5.4判断胜负设计
胜负判断实际上是根据当前空白快的情况来判断胜负的,这也是为什么添加void CSFRCMYPINTUDoc::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)的原因。实际上判断只需要空白块的位置是否与原始位置相同,若相同则全局判断其他图片块是否与初始位置坐标相符合,若相符合则判断拼图成功,否则拼图不成功,游戏继续。其判断胜负代码如下:
BOOL CSFRCMYPINTUDoc::IsWin(void)
{
int i,j;
//胜利的检测方法是判断地图的所有方块的内部
//数据是否全为其行列数,是则表示排列好,胜利
if(i !=m_blankPos.row || j != m_blankPos.col)
for(i = 1;i<=hnums;i++)
{
for(j = 1;j<=vnums;j++)
{
if(m_map[i][j].row !=i || m_map[i][j].col !=j)
return FALSE;
}
}
return TRUE;
}
拼图成功后的结果截图如下所示:
图5-8 3*3的拼图成功画面
5.5 移动图片的鼠标键盘响应设计
按照预先设定的方案,采用鼠标和键盘方向键来移动图块,进行拼图游戏操作,点击鼠标左键选择相应的图块与相邻的图块进行交换,完成游戏(按压键盘方向键也是一样的作用)。因此,必须为鼠标添加鼠标左键单击的鼠标和键盘方向键的消息处理函数,步骤如下:
(1)右击CLM_FiveChessView类,调用添加消息处理函数的对话框,选择Add windows MessageHandler
(2)添加消息处理函数WM_LBUTTONDOWN和WM_KEYDOWN这两个消息处理函数。然后点击Edit Exisiting退出对话框。并添加消息处理函数代码。如下图所示:
图5-9 添加Windows消息/事件
5.6调试与运行
编译程序:鼠标点击 build—>Rebuild all。编译若出现错误提示,则根据提示修改程序,直至编译无误。然后运行。得到的结果如下:
(1)初始化界面
图5-10 初始化界面
(2)游戏界面
图5-11 游戏界面
6.界面设计
初步设想界面采用两个界面形式,可考虑添加背景,一边显示拼图游戏区,另外一边显示原图像。(参见图3-1)有关于窗口的大小与界面的分布情况,经过调节实践,最终确定初始窗口的尺寸定为长600个单位,宽则为400个单位为比较合适的尺寸,看上去相对视觉效果还是比较舒服的。
此外,在界面上只包含三个菜单选项,分别为:文件、游戏图片选择、帮助。在文件下面还有相应的子菜单,而游戏图片下则为图形提示形式的供游戏选择的图片选项,在此共设置五幅图片,最后一个为作者本人图像,其他的则是网络图片。而且第一个选项为自定义图片菜单选项。
原图像的显示菜单选项功能描述:点击“原图显示”菜单选项,显示则前面会出现一个“√”,再点击则不显示原图则前面没有“√”,而此时原图显示区域也将隐藏,只显示游戏区域,而且保证无论游戏难度如何变化,即行列数划分多少,游戏区域总的面积大小将一直保持不变。效果图如下图3-3所示:
图3-3 原图显示效果图
在菜单栏显示各个游戏操作功能菜单选项,其中包含相应的下拉菜单选项,即游戏相关的一些用户操作选项。样式图如下图3-4所示:(以作者图像为例)
图3-4 游戏界面完整效果图
7.总结
本作品是一个益智游戏程序系统,通过将图片按照一定的形式保存成图片提示的形式,呈献给游戏玩家,此图片我们前期采用图片处理,将相应的图片处理成本人需求的尺寸和大小,并重新命名并将其格式进行了需求性的修改。主要设计的工作可概括如下:
1.在初期我们认真地对游戏的整个用户需求以及系统所要做的工作等进行深刻的分析,创作了优良的游戏开发方案和系统架构,并且在参考前人的作品基础上进行了大胆的改进和创新,比如:避免掉游戏无法完成的情况和原图显示的情况,详细地设计了有关于拼图游戏的等级设置,背景音乐选取播放设置,游戏区域和窗口设计以及自定义游戏图片的设计等。
2.完成了基本的游戏需求,开始游戏,游戏图片选择,游戏完成判别,游戏参数设置,游戏原图像显示与否,退出游戏,游戏背景音乐选择与播放等。
3.在以上整个开发过程中,我们遇到很多问题和麻烦,经过各方询问,探索,并且借鉴前人的成功案例以及求助同学老师等,慢慢的解决问题,发现新问题,在解决问题等往复循环的过程以后,我们学习到很多,也积累很多程序开发的经验和教训,比如有些参数设置必须明确其含义,让人一看便能猜到其所具备的功能或者将执行的指令等是什么?而不能含糊的胡乱定义,这样不仅会让开发者难以理解和记忆,而且也会让后来阅读者更加迷茫而不知所措。
另外,很多编程时的习惯培养是很重要的,对一个人编写程序的效率高低等有很大影响,良好的科学的编程习惯对以后的发展和个人编程水平的提高具有极大的帮助。比如:按照一定的功能设置顺序而来,首先将最基本的所有需求全部完成,并且编译成功而不出现问题在进行附加功能的编写和设计。否则,胡乱添加而无头绪,只会让自己的程序编写混乱,编译出错而找不到错误源头在何处。而且编写程序要写一部编译完成一步,保证每一步都不出问题,再往下进行。否则当我们将整个程序全部编写完毕,再进行编译,改错,修改等等工作,那样必将耗费数倍的精力和时间,导致效率低下以及人力物力精力的白白浪费和损耗等。当我们自己完完全全的做完一件事情,我们也会收获巨大的信心,有时候绝对不能遇到问题就想着走捷径,这样不仅会让我们身心思想俱疲,不能很快的进步,也会给我们后面的学习工作等留下巨大的隐患。不论次作业和项目等是大是小,是难是易,绝对不能不假思索的去完成任何项目和任务。
本次课程作业,本小组收获巨大,为以后的学习和类似于本课程的工作等都产生了很大的影响,提供了很多可供参考的黄金经验。
参考文献:
[1] 明日科技,Visual C++ 程序开发 范例宝典,人民邮电出版社,2007.07
[2] 谭浩强, C++ 程序设计, 清华大学出版社, 2011.08
[3] Lippman,SB. , C++ Primer (中文版), 电子工业出版社,2013.09
本文来源:https://www.2haoxitong.net/k/doc/0b4fde74abea998fcc22bcd126fff705cc175cb8.html
文档为doc格式