VC连连看.docx
- 文档编号:8624812
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:31
- 大小:233.61KB
VC连连看.docx
《VC连连看.docx》由会员分享,可在线阅读,更多相关《VC连连看.docx(31页珍藏版)》请在冰豆网上搜索。
VC连连看
连连看游戏的设计与实现
当今社会,休闲型游戏越来越得到人们的喜爱,我所做的毕业设计实例“连连看游戏的设计与实现”是近几年来网络上非常流行的一种二维休闲游戏,它对电脑配置要求不高,娱乐性强,易于上手。
此次毕业设计所使用的语言为VC语言,开发环境为VC6.0++。
主要应用到微软提供的MFC框架的多文档程序和微软提供的API函数接口来实现。
这些接口为游戏的制作提供了便捷的条件,本系统的主要特点就是运用MFC框架和API技术,进行界面的绘制,鼠标的操作,声音的播放,以及积分榜的显示等功能。
这次通过连连看的设计开发将对理解MFC框架技术以及WindowsAPI技术在游戏方面的应用起到很大的帮助作用,同时为掌握VC编程技术及二维休闲游戏设计的一般方法打下坚实的基础。
本文阐述了实例“连连看”的设计思想和实现。
全文分为七章。
第一章对选题的背景及项目的功能进行了简要叙述。
第二章介绍了开发本系统所使用的C++语言、MFC框架技术和API接口技术。
第三章介绍了系统的需求分析。
第四章是概要设计。
第五章则对游戏的各功能模块及实现算法等详细设计进行了介绍。
第六章对程序运行与调试中经历的问题和学到的编程及游戏设计经验进行总结。
第七章是结束语。
关键词:
游戏连连看二维游戏MFCAPI
GameDesignandImplementationLianliankan
Today'ssociety,Casualgamesgetmoreandmorepopularamongpeople,Ididgraduatedesignexample,"DesignandImplementationLianliankangame"isverypopularinrecentyearsthenetworkofatwo-dimensionalcasualgames.Itslessdemandingcomputerconfiguration,Entertaining,Easytofly.
ThelanguageusedingraduatedesignlanguagefortheVC,DevelopmentenvironmentfortheVC6.0++.MainlyappliedtotheMicrosoftMFCframeworkprovidesmoredocumentationproceduresandMicrosoft'sAPIfunctionstointerface.Thegameinterfaceoffersconvenientconditionsforproduction,ThemainfeaturesofthissystemistouseMFCframeworkandAPItechnologytointerfacemapping,mouseoperations,soundplayback,anddisplayfunctionsstandings.
ThedesignanddevelopmentbyLianliankanMFCframeworkwillunderstandthetechnologyandtheWindowsAPIapplicationoftechnologyinthegamesplayedveryhelpful,VCprogrammingforbothmasterandtwo-dimensionalrecreationofthegeneralmethodofgamedesignandlayasolidfoundation.
Inthispaper,examplesof"Lianliankan"Thedesignandimplementation.Paperisdividedintosevenchapters.ChapterIoftheprojectbackgroundandprojectabriefdescriptionofthefunction.ThesecondchapterdescribesthedevelopmentofthissystemusesC++language,MFCframeworkofthetechnologyandAPIinterfacetechnology.Thethirdchapterdescribesthesystemrequirementsanalysis.ChapterIVisasummaryofthedesign.Thefifthchapterofthegame'svariousfunctionmodulesandthedetaileddesignalgorithmwasintroduced.ChapterVIoftheprogramisrunninganddebuggingtheproblemsexperiencedandlearnedprogrammingandgamedesignexperiencesummary.ChapterVIIistheconclusion.
Keyword:
GamesLianliankantwo-dimensionalgameMFCAPI
目录
1连连看游戏的概要设计
1.1连连看游戏的系统图
根据第三章的需求分析,我们制作出了连连看游戏在Windows平台上运行时的主要功能图。
根据此连连看的功能图我们将对连连看游戏进行概要设计和详细设计。
继而开发出一个完整的连连看电脑游戏。
总体的系统图如下图所示:
图4.1系统功能图
连连看是运用VC++6.0中MFC框架的多文档视图开发的,文档——视图结构提供的应用程序接口有利于进行窗口操作、文件读取等编程。
连连看游戏引擎包含在视图类中。
游戏引擎是一个抽象的概念,用于实现游戏的逻辑功能,通常在一个独立的类中,有时引擎和视图是一体的,并且可能无可避免,因为视图需要为引擎处理用户输入和绘图。
游戏程序设计一般都采用面向对象的设计模式,WindowsAPI提供了一个简单的图像显示接口,利用MFC的多文档视图结构的面向对象设计模式。
4.2功能模块概述
根据上面的系统功能图,下面对连连看游戏的各个模块进行简要的分析。
1.2.1鼠标操作模块
玩家在玩游戏时需要运用鼠标与游戏系统进行交互,这个模块的实现是运用MFC中的鼠标事件触发的,在连连看的游戏场景中运用鼠标进行交互的事件主要有两个,一个是用户点击游戏场景中的图片时触发的事件。
另外一种是用户点击菜单栏上的菜单按钮时说触发的鼠标事件。
当用户点击游戏场景中的图像块时就会响应鼠标的OnLButtonDown事件,然后进行相应的逻辑判断。
当用户点击菜单栏上的菜单命令时就会触发相应的菜单命令对应的相应的事件。
1.2.2图像处理模块
程序运行后,用户通过游戏菜单的开始命令或者直接按下F2键开始进入游戏,在这个模块里要把资源文件中的图片进行处理然后加载到游戏场景中这在程序中是通过DrawMap()方法实现的。
其中用到的API函数主要是是BitBlt,他的主要功能是将某一内存块的数据传送到另一内存块,前一内存块被称为"源",后一内存块被称为"目标"图象程序开发者使用Blit的函数在内存中将某页面上的一幅位图经过一定的变换转移到另一个页面上。
1.2.3声音信息模块
在游戏过程中,当玩家成功消去一对图像块后播放一个提示音,当消去失败的时候会播放另外一个提示音,根据用户操作结果的不同播放不同的音乐提示,这在一定程度上能够增加用户对游戏的沉侵感。
对声音模块信息的管理在程序中是通过API中的PlaySound函数来实现的。
1.2.4菜单模块
玩家在游戏游戏过程中随时可以通过选择不同的菜单命令来进行相应的操作,菜单的制作是通过MFC框架中多文档程序的菜单栏来添加的,菜单包含一下几个部分:
(1)游戏菜单中的开始、放弃和退出命令。
(2)选项菜单里面的提示、重列、暂停、音乐、音效、和积分命令。
(3)帮助菜单,介绍了游戏的版本等。
具体的实现方法下一张将在做详细介绍。
1.2.5界面显示模块
游戏场景中界面的显示包括以下部分:
游戏的级别、关卡数、允许重新排列的次数、允许的提示次数、剩余时间、游戏主场景。
这些显示信息会随着游戏的进行而动态改变。
当提示次数和重列次数为0时系统就不在允许用户使用提示和重列的功能。
在连连看游戏中,除了上面讲到的程序主界面外还包含了显示积分和排名的对话框的设计,在积分和排名对话框中,用户可以查看积分排名情况,可以清除排名记录。
整个连连看游戏的系统是在VC++6.0开发环境中进行开发的,开发过程中大量的使用了微软提供的API接口方法,减少了程序代码的编写量、提高了编程效率。
1.3本章小结
本章主要根据需求分析设计出了连连看游戏的整体模块,如图4.1所示,然后在4.2节里分别对主要模块中的功能进行了阐述,不仅如此,还对各个模块中的包含的具体的细节进行了设计。
通过对模块功能的分析为下一章节的详细设计奠定了基础。
2连连看游戏的详细设计
前面的章节主要是对连连看游戏进行需求分析和概要设计,本章将着重介绍连连看的各个功能的实现方法和主要的算法设计。
2.1游戏的背景显示
程序刚开始运行时默认的背景颜色为蓝色,具体如图5.1所示:
图5.1程序的初始界面
要使程序的默认背景为蓝色,具体的实现方法为在MFC的多文档窗口中的CZLLKView:
:
OnDraw(CDC*pDC)函数中,声明如
CRectrcBlock;
rcBlock.SetRect(0,0,660,640);
pDC->FillSolidRect(&rcBlock,RGB(100,100,200));
上面的代码在VC的MFC框架中很常见,就是定义一个矩形类的实例,然后设置矩形框的大小,设置完成后调用RGB函数将矩形区域设置成蓝色。
2.2菜单功能的实现
连连看游戏中包含着许多菜单,可以共玩家随时根据自己的情况选择不同操作,整个菜单的模块里面的指令具有开关性质的菜单命令选中时前面会有标记,取消菜单指令时前面标记消失。
具体的菜单系统请看下图:
图5.2菜单系统
连连看程序中的菜单时利用VC++6.0中MFC框架多文档程序的菜单空间制作而成的,具体的添加方法为:
单击VC++6.0菜单的Insert菜单,然后选择Reaource菜单命令。
然后选择Menu完成后单击New命令,这样就可以在VC6.0开发环境中任意的编辑菜单了。
制作好菜单栏后需要将菜单栏加入到应用程序中去,菜单的初始化是在CMainFrame类中的OnCreate方法中完成的,具体的代码为:
m_wndToolBar.LoadToolBar(IDR_MAINFRAME)。
IDR_MAINFRAME为上一步骤中菜单栏的标记,LoadToolBar为API函数。
给系统添加完菜单栏下一步是具体编写每一格菜单相对应的方法,下面的部分我将针对每一个主要的菜单命令进行详细的阐述。
2.2.1“开始”菜单命令
“开始”菜单命令的功能是当用户点击它时使玩家进入游戏,然后“开始”菜单命令编程灰色。
点击开始菜单后触发的事件为:
OnMenuFirst(),它是在CZLLKView这个类中定义的。
具体包含的功能是初始化用户界面。
具体的程序实现为:
voidCZLLKView:
:
OnMenuFirst()
{
//TODO:
Addyourcommandhandlercodehere
inti,j;
inttemprand;
CStringstr;
CRectrect;
//产生随机序列
srand((unsigned)time(NULL));
for(i=1;i<=ROW_NUMBER;i++)
for(j=1;j<=LINE_NUMBER;j++)
{
while
(1)
{
temprand=rand()%15;//产生0-14的随机数
if(pic_number[temprand]<6)
{
pic_number[temprand]++;
llk_map[i][j].state=0;
llk_map[i][j].event=0;
llk_map[i][j].PicIndex=temprand+1;//1-15
break;
}
}
}
//列出每幅图片所有的位置
ListPicPlace();
//初始化事件
InitEvent();
g_userscore=0;
g_userlevel=1;
g_usergate=1;
//程序控制
bingame=true;
bfirst=true;
DrawRectangleHollow();
m_nUpper=0;
DrawProgress(m_nUpper);//总共400个时间
m_nSpeed=2;
SetTimer(1,1200,0);
DrawInfo(120,20,"剩余时间");
DrawInfo(20,20,"级别:
");
DrawInfo(20,40,"关卡:
");
DrawInfo(20,60,"重列:
");
DrawInfo(20,80,"提示:
");
DrawInfo(540,20,"分数:
");
DrawInfo(60,20,g_userlevel);
DrawInfo(60,40,g_usergate);
DrawInfo(60,60,m_sortnumber);
DrawInfo(60,80,m_tishinumber);
DrawInfo(560,40,g_userscore);
DrawMap();
}
上面程序中调用了ListPicPlace()方法,它的主要功能是获得每幅图片的位置。
具体的实现方法为:
//列出每幅图片的所有位置用来判断无解和提示的
voidCZLLKView:
:
ListPicPlace()
{
inti,j;
for(i=1;i<=ROW_NUMBER;i++)
{
for(j=1;j<=LINE_NUMBER;j++)
{
if(llk_map[i][j].PicIndex>0)
{
AddPicPlace(llk_map[i][j].PicIndex,i,j);
}
}
}
}
2.2.2“放弃”菜单命令
当玩家在游戏过程中遇到困难或中途不愿意在继续玩游戏了这时候可以选择放弃游戏,选择“放弃”菜单命令后程序的主界面将会返回游戏开始时的场景。
如果要继续游戏需要重新选择“开始”菜单命令。
“放弃”菜单命令也是在CZLLKView类的OnMenuBack()方法中实现的。
在这个方法中将会重新初始化一些变量,并调用了初始化界面函数来返回程序开始时界面,具体的实现方法是:
voidCZLLKView:
:
OnMenuBack()
{
//TODO:
Addyourcommandhandlercodehere
KillTimer
(1);
bingame=false;
bfirst=false;
bSecondClicked=false;
bstop=false;
m_dotNumber=0;
m_tishinumber=10;
m_sortnumber=5;
//图片坐标
xindex=-1;
yindex=-1;
InitMap();
DrawBlank();
}
2.2.3“退出”菜单命令
由菜单名称可以看出选择退出命令后程序将终止执行,这个功能实现起来比较简单,只需要向程序发出一个退出命令即可,具体的实现方法为:
voidCZLLKView:
:
OnMenuExit()
{
//TODO:
Addyourcommandhandlercodehere
PostQuitMessage(0);
}
2.2.3“提示”菜单命令
在游戏过程中,由于游戏难度的加大或者是玩家在游戏过程中的疲劳造成了很难发现两幅图像块一致的现象,游戏玩家可以选择提示功能,选择提示功能的方法有两种,一是选择选项菜单中的“提示”命令,二是直接按下F5功能键,这时游戏场景中会自动提示两幅可以消去的图像块的位置。
“提示”菜单最多可用10次,10此结束后“提示”功能将不可用。
实现的流程图为:
图5.4提示信息逻辑
具体的实现方法如下面的程序所示:
voidCZLLKView:
:
OnMenuInfo()
{
//TODO:
Addyourcommandhandlercodehere
if(bingame)
{
if(m_tishinumber>0)
{
m_tishinumber--;
DrawInfo(60,80,m_tishinumber);
BackPicPlace();
}
else
{
AfxMessageBox("提示已经用完");
}
}
}
在上面代码中BackPicPlace()是返回两个相同图片块的位置。
实现的程序逻辑图如5.5所示:
图5.5返回图片位置逻辑图
上面逻辑图的意思是首先循环15个图块像的位置,然后判断每一个图像是否有能够连接的图像块,如果没有继续循环,知道循环终止,如果有返回图像块的位置。
具体的实现代码为:
voidCZLLKView:
:
BackPicPlace()
{
inti;
CRectrect;
ZYHLLK_PATH*pic=NULL;
ZYHLLK_PATH*Nextpic=NULL;
for(i=1;i<=15;i++)
{
pic=pic_place[i];
while(pic!
=NULL)
{
Nextpic=pic;
while(Nextpic->next!
=NULL)
{
Nextpic=Nextpic->next;
if(CheckConnection(pic->x,pic->y,Nextpic->x,Nextpic->y))
{
llk_map[pic->x][pic->y].state=1;
llk_map[Nextpic->x][Nextpic->y].state=1;
rect.top=tiley(pic->x);rect.bottom=rect.top+PIC_HEIGHT;
rect.left=tilex(pic->y);rect.right=rect.left+PIC_WIDTH;
InvalidateRect(&rect,TRUE);
rect.top=tiley(Nextpic->x);rect.bottom=rect.top+PIC_HEIGHT;
rect.left=tilex(Nextpic->y);rect.right=rect.left+PIC_WIDTH;
InvalidateRect(&rect,TRUE);
return;
}
}
pic=pic->next;
}
}
return;
}
2.2.4“重列”菜单命令
玩家在玩游戏的过程可以随时选择重新排列图像块来发现新的可以容易发现的两个相同的图像块。
每局游戏玩家有五次重新排列的机会每使用一次机会数自动减一,知道机会用完为止。
玩家可以使用“选项”菜单的“重列”命令,也可以使用快捷菜F6.当玩家使用重列命令时触发事件OnMenuSort(),对场景中的图像块进行重置。
具体方法事件的实现为:
voidCZLLKView:
:
OnMenuSort()
{
//TODO:
Addyourcommandhandlercodehere
if(bingame)
{
if(m_sortnumber>0)
{
m_sortnumber--;
DrawInfo(60,60,m_sortnumber);
SortPicPlace();
}
else
{
AfxMessageBox("重列次数已经用完");
}
}
}
对场景中的图像块进行重新排列的算法为SortPicPlace(),其实现的思路为先将游戏场景中图像块的点击次数初始化为0,然后在将图像块大于0的索引值添加数组中。
初始话种子生成器,生成一个新的索引,实现的程序如下所示:
index=(int(rand()*001+rand()*0.1+rand()))%arPic.GetSize();
然后在重新设置游戏场景中的图像块的索引,具体代码如下:
llk_map[i][j].PicIndex=arPic.GetAt(index);
游戏场景中的图像块索引设置完成后就要重新列出每个图像块的位置然后刷新游戏场景绘制游戏场景地图。
完整的代码如下所示:
//重列函数
voidCZLLKView:
:
SortPicPlace()
{
inti,j;
CRectrect;
CDWordArrayarPic;
for(i=1;i<=ROW_NUMBER;i++)
{
for(j=1;j<=LINE_NUMBER;j++)
{
llk_map[i][j].state=0;
if(llk_map[i][j].PicIndex>0)
arPic.Add(llk_map[i][j].PicIndex);
}
}
//intk=1;//初始化随机数发生器
//intdivisor=ROW_NUMBER*LINE_NUMBER-k+1;index=rand()%divisor+1k++
intindex;
for(i=1;i<=ROW_NUMBER;i++)
{
for(j=1;j<=LINE_NUMBER;j++)
{
if(llk_map[i][j].PicIndex>0)
{
index=(int(rand()*001+rand()*0.1+rand()))%arPic.GetSize();
llk_map[i][j].PicIndex=arPic.GetAt(index);
arPic.RemoveAt(index);
}
}
}
//重新列出所有图片位置
for(i=0;i<15;i++)
{
pic_place[i+1]=NULL;
}
ListPicPlace();
//刷新屏幕
rect.top=DRAW_TOP+BMP_HEIGHT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 连连