课程设计连连看(游戏)_第1页
课程设计连连看(游戏)_第2页
课程设计连连看(游戏)_第3页
课程设计连连看(游戏)_第4页
课程设计连连看(游戏)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计 报 告 课程名称:面向对象程序设计C+ 设计题目:连连看(游戏) 专 业:计算机科学与技术 姓 名: 学 号: 指导教师:李 晓 虹2016 年 1 月 10 日摘要:随着游戏产业日益壮大,休闲类游戏以主题新颖、容易掌握而为游戏的主流。本文所介绍的连连看游戏是采用Visual开发、使用MFC提供的对话框模式搭建的一款休闲类游戏,玩家可以根据游戏规则成对的销毁图片来取得游戏胜利。本文在介绍游戏的总体设计思想和设计框架的基础上,主要从基本结构、图案方块的连接判断、鼠标事件处理和游戏胜利判断模块的设计与实现方面阐述了整个游戏的开发过程。关键词:游戏;Visual C+;1 需求分析连连看游戏作为一款经典小游戏,版本多样,娱乐性也很高,适合在闲暇时放松心神。并且可在多个平台上实现,程序简单易懂,非常适合初学者学习制作。1、语言的使用现在的连连看游戏一般是用C语言实现的,用C语言编写连连看游戏比较简单易懂,当然也可以用其他语言来实现,比如Java、C+、C#等,这里我们用C+来实现。2、用C+的优势C+在一定程度上可以和C语言很好的结合,甚至大多数C语言程序是在C+的集成开发环境中完成的。C+相对众多的面向对象的语言,具有相当高的性能。C+引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。3.功能分析每次用户选择两个相同的小图片,如果小图片满足一定条件(这两个小图片之间存在转弯少于3的路径),则两个小图片可以消掉,给定任意具有相同图案的两个小图片,用户需要寻找这两个小图片之间在转弯最少的情况下,如果这个最优路径的转弯数目小于3,则这两个小图片可以消掉。所以,主要需要解决的问题就是怎么样得出相同小图片之间的最优路径,这个最优路径首先需要保证转弯数目最少。游戏开始时,第一次使用鼠标点击游戏界面中的小图片,该小图片此时为被选中状态,再次用鼠标点击其他小图片,若该小图片与被选中的小图片图案相同,且把第一个小图片到第二个小图片连起来,连线的路径中间的直线不超过3根(最多两次转弯),则消掉这一对小图片,否则第一个小图片恢复成未被选中状态,而第二个小图片变成“被选中”状态。每次消除一对小图片会增加一定的时间。胜利条件:将游戏区域上的小图片全部消除掉且时间未消耗完。失败条件:时间消耗完,或者剩下的小图片没有路径能够匹配(即界面上的小图片仍未全部消掉)。4.功能需求(1)游戏界面大致分为三大模块,游戏模块、游戏设置模块、英雄榜模块 ;(2)游戏操作区是系统自动排列的默认的小图片,用户可以点击小图片来消除具有相同图案的小图片;(3)在游戏操作区的下方显示有“剩余时间”的进度条,当进度条的时间耗完时,则游戏结束;5.功能模块游戏连连看,只要将相同的两张图片用三根以内的直线连在一起就可以消除,规则简单容易上手。游戏速度节奏快,画面清晰可爱,适合细心的玩家,主要功能如下:(1)消除:只要将相同的两张图片用三根以内的直线连在一起就可以消除;(2)倒计时:限制玩家玩一局的时间,规定玩家必须在规定时间内完成游戏;(3)提示:如果玩家长时间不能发现可以消除的图片,可以使用提示功能提示玩家;(4)重排:如果玩家在剩余的图片排列中不能发现可以消除的图片,除了使用查找功能,还可以选择重排功能,使剩余图片重新排列,方便玩家发现可以消除的图片;(5)消除音乐:当玩家点击两个可以消除的图片时,播放消除时的音乐(6)消除图片时的连线:当玩家消除两个图片时,消除的两个图片用直线或折线相连;(7)背景音乐:玩家可以选择播放或暂停背景音乐的播放二总体设计本课程设计采用的是单机模式,当在规定的时间内消除完全部的小图片则游戏过关,如果在规定的时间内没能消除完所有的小图片则游戏结束,需要重新开始新游戏。游戏规则是模仿普通的连连看游戏,主要是鼠标两次点击的小图片能否消去的问题。前提是点击两个具有相同的图案的小图片,若点击的是同一个小图片或者两个不同的图案的小图片,则不进行处理;在两个相同图案的小图片用三根以内(包括三根)的直线能连在一起,就可以消掉;否则,不进行处理。游戏过程,如果用户在规定的时间内消掉所有的小图片则提示游戏胜利,会弹出一个“游戏胜利!”的对话框;如果在规定时间内小图片没有消完则提示时间到游戏失败,会弹出一个“游戏失败!”的对话框。考虑到本游戏是单机小游戏,所以充分考虑到它的娱乐性,并没有很复杂的功能。系统的总体设计是对整个系统的结构化设计,包括系统基本功能的设计、系统流程的设计和各个功能模块的设计等。1. )基本功能模块图图 1功能模块结构图2. )鼠标事件具体流程图:3. )详细运行流程图:3 详细设计1. )规则详解(1)两个相同的小图片相邻,则可以直接消掉。(2)若不相邻的先在第一个小图片的同一行中找一个空图片;1)找到后看第二个小图片横向到这个空方块所在的列是否有小图片;2)没有的话再看第一个小图片到与它同行的那个空图片之间是否有小图片;3)如果还是没有的话,再从与第一个小图片同行的那个空图片竖向到与第二个小图片的同行看是否有其他的小图片。没有的话路经就是通了,则可以将两个小图片消掉。(3)若上述2失败后,再在第一个小图片的同列找一个空图片;1)找到后看第二个小图片竖向到这个空图片所在的行是否有小图片;2)没有的话,再看第一个小图片到与它同列的那个空图片之间是否有图片块;3)如果还是没有的话,再从与第一个小图片同列的那个空图片横向到与第二个小图片同列看是否有其他的小图片。没有的话路经就是通了,则可以将两个小图片消掉。如果以上三步都失败,说明这两个按钮不可以消掉。两个小图片能够相连并消掉的所有情况如下所示:(1)两个小图片相邻,可以直接消掉;(2)两个小图片在同一行上面且不相邻,但中间没有其他方块阻挡;(3)两个小图片在同一行上,但中间有其他图案的小图片阻隔;(4)两个小图片在同一列,但中间有其他图案的小图片阻隔;(5)两个小图片既不在同一行也不在同一列,用三条直线连接(因为第一个小图片的右边可能有其他小图片阻隔);(6)两个小图片既不在同一行也不在同一列,用两条直线连接(第一个小图片的某一方正好可以连接到第二个小图片);(7)两个小图片既不在同一行也不在同一列,用三条直线连接(系统自动检测,连线从第一个小图片的空闲的一面引出)2).代码详细设计(1)主对话框变量定义:public:void RefreshMap();void Exchange(int mapMAXXMAXY);void CallHint();void CallExchange();void ShowMap(int mapMAXXMAXY);void InitMap(int mapMAXXMAXY);void ShowMsg(CRgn * rgn);void Start(int nlevel);void PlayBackMusic(BOOL bflag);void isHighLevel();CLlkDlg(CWnd* pParent = NULL);/ standard constructorCChessMan * m_p;/棋子指针int mapMAXXMAXY;/棋盘数组BOOLm_bStart;/游戏开始状态intm_nLevel;/当前等级限制intm_timePoint;/时间限制CRgnm_MsgRgn;/信息区范围CPtrArray m_cmGroup;/棋子数组intm_hintNum;/提示次数限制intm_exchangeNum;/换盘次数限制int m_nHighLevel;/最高等级(2) 游戏开始代码:void CLlkDlg:OnStartGame() char pszTmp128 = 0;m_hintNum = 3;m_exchangeNum = 3;m_line.m_lineNum = 0;m_method.SetWindowText(开 始 游 戏!);Start(1);GetPrivateProfileString(HERO, level, 1, pszTmp, 127, .setup.ini);m_nHighLevel = atoi(pszTmp);void CLlkDlg:Start(int level)CString str;m_nLevel = level;m_timePoint = 130 - level * 10;/设置每个等级的限制时间/随机设置背景图片srand(unsigned int)time(NULL);str.Format(resb%d.bmp, m_nLevel);m_bkPic.ModifyStyle(0,SS_BITMAP|SS_CENTERIMAGE); HBITMAP m_bkBmp = (HBITMAP):LoadImage(AfxGetInstanceHandle(), str, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); m_bkPic.SetBitmap(m_bkBmp);InitMap(map);ShowMap(map);m_p = NULL;CRgn rgn;rgn.CreateRectRgn(420, 0, 560, 160);m_MsgRgn.CopyRgn(&rgn);ShowMsg(&m_MsgRgn);/设置计时器KillTimer(1);SetTimer(1, 1000, NULL);m_bStart = true;(3)播放背景音乐void CLlkDlg:OnPlayMusic() /判断播放音乐菜单当前状态BOOL bCheck = (BOOL)m_main_menu.GetMenuState(IDR_PLAY_MUSIC, MF_CHECKED);if(m_bStart)/游戏如果开始才允许播放音乐if(bCheck)m_main_menu.CheckMenuItem(IDR_PLAY_MUSIC,MF_BYCOMMAND | MF_UNCHECKED);elsem_main_menu.CheckMenuItem(IDR_PLAY_MUSIC, MF_BYCOMMAND | MF_CHECKED);PlayBackMusic(!bCheck);/调用播放背景音乐功能函数void CLlkDlg:PlayBackMusic(BOOL bflag)/指定文件并播放if(bflag)/播放音乐sndPlaySound(music.wav,SND_ASYNC); else/停止播放sndPlaySound(NULL,SND_PURGE); (4) 信息显示:void CLlkDlg:ShowMsg(CRgn *rgn)CClientDC *pDC = (CClientDC *)GetDC();/int nOldDC = pDC-SaveDC();CFont font;CString str;/设置字体if(0=font.CreatePointFont(150,Comic Sans MS)AfxMessageBox(Cant Create Font);pDC-SelectObject(&font);/设置字体颜色及其背景颜色pDC-SetTextColor(RGB(39,244,10);pDC-SetBkColor(RGB(0,0,0); /输出数字str.Format(游戏等级: %d,m_nLevel);pDC-TextOut(650,420,str);str.Format(剩余时间: %03d, m_timePoint);pDC-TextOut(650, 450, str);str.Format(提示次数: %d,m_hintNum);pDC-TextOut(650,480,str);str.Format(换盘次数: %d, m_exchangeNum);pDC-TextOut(650, 510, str);(5) 初始化棋盘数组:void CLlkDlg:InitMap(int mapMAXY)int i, j;int x, y;/初始化边界for(i=0; iMAXX; i+)for(j=0; jMAXY; j+)if(i=0) | (i=MAXX-1) | (j=0) | (j=MAXY-1)mapij = -1;elsemapij = 0;srand(unsigned int)time(NULL);/随机数种子/初始化地图for(i=0; iSAME; i+)for(j=1; jInvalidate();int i, j;POINT p;CString str;/清除原有按钮for(i=0; im_cmGroup.GetSize(); i+)delete (CChessMan *)m_cmGroup.GetAt(i);m_cmGroup.RemoveAll();for(i=1; iMAXX-1; i+)for(j=1; jMAXY-1; j+)p.x = i;p.y = j;m_cmGroup.Add(new CChessMan(mapij, p);for(i=0; iCreate(str, WS_CHILD|BS_BITMAP, /注意属性!CRect(130+(i%(MAXY-2)*40, 70+(i/(MAXY-2)*40, 170+(i%(MAXY-2)*40, 110+(i/(MAXY-2)*40), this, IDC_BLOCK+i);if(btn-m_id)/如果为0则不显示str.Format(res%d.bmp, btn-m_id);HBITMAP m_fkBmp = (HBITMAP):LoadImage(AfxGetInstanceHandle(), str, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);if(m_fkBmp = NULL) if(MessageBox(缺少图片资源!, 错误, MB_ICONERROR|MB_OK) = IDOK)CDialog:OnCancel();return;btn-SetBitmap(m_fkBmp);btn-ShowWindow(SW_SHOW);elsebtn-ShowWindow(SW_HIDE);(7) 换盘接口成员函数void CLlkDlg:CallExchange()if(m_exchangeNum)doExchange(map);while(!CChessMan:Hint(map);/至少有一个可消去ShowMap(map);m_exchangeNum-;(8) 提示连接接口成员函数void CLlkDlg:CallHint()if(m_hintNum)if(CChessMan:Hint(map, &m_hintP1, &m_hintP2)CChessMan *temp;temp = (CChessMan *)m_cmGroup.GetAt(m_hintP1);temp-SetButtonStyle(BS_DEFPUSHBUTTON);temp = (CChessMan *)m_cmGroup.GetAt(m_hintP2);temp-SetButtonStyle(BS_DEFPUSHBUTTON);m_hintNum-;(9) 换盘函数void CLlkDlg:Exchange(int mapMAXY)int i, j;int k = 0;int temp(MAXX-2)*(MAXY-2)+1 = 0;/比格子数多一个,防止数组越界!for(i=1; iMAXX-1; i+)for(j=1; jMAXY-1; j+)if(mapij)tempk+ = mapij;mapij = 0;srand(unsigned int)time(NULL);k = 0;while(tempk)i = rand()%MAXX;j = rand()%MAXY;if(mapij)k-;elsemapij = tempk;k+;(10) 更新函数void CLlkDlg:RefreshMap()CRgn resultRgn;resultRgn.CreateRectRgn(90,30,690,430);CRgn tmpRgn;tmpRgn.CreateRectRgn(0,0,0,0);for(int i=0; iMAXX; i+)for(int j=0; jInvalidateRgn(&resultRgn);(11) 定时器void CLlkDlg:OnTimer(UINT nIDEvent) m_timePoint -= 1;if(m_timePoint message=WM_KEYDOWN)switch(int)pMsg-wParam)case VK

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论