收藏 分销(赏)

C语言程序设计优秀课程设计扫雷.doc

上传人:a199****6536 文档编号:2727325 上传时间:2024-06-05 格式:DOC 页数:22 大小:246.54KB
下载 相关 举报
C语言程序设计优秀课程设计扫雷.doc_第1页
第1页 / 共22页
C语言程序设计优秀课程设计扫雷.doc_第2页
第2页 / 共22页
C语言程序设计优秀课程设计扫雷.doc_第3页
第3页 / 共22页
C语言程序设计优秀课程设计扫雷.doc_第4页
第4页 / 共22页
C语言程序设计优秀课程设计扫雷.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、辽 宁 工 业 大 学C+语言程序设计课程设计(论文)题目: 扫雷 院(系): 软 件 学 院 专业班级: 软件工程111班 学 号: 学生姓名: 指导老师: 翟宝峰 老师职称: 副教授 起止时间:.12.12-.12.25课程设计(论文)任务及评语院(系):软件学院 教研室:软件教研室学 号 学生姓名 专业班级软件工程166班课程设计(论文)题目扫雷课程设计(论文)任务程序设计任务和要求:(1). 掌握面向对象程序设计语言C+基础语法(2). 掌握C+面向对象设计思想(3). 掌握VC+6.0和DEV C+ 开发工具使用 (4). 利用标准C+规范设计应用程序设计过程中,要严格遵守设计时间安

2、排,听从指导老师指导。正确地完成上述内容,规范完整地撰写出设计汇报。指导老师评语及成绩 成绩: 指导老师签字: 年 月 日 目 录第1章 课程设计目标和要求11.1 设计目标11.2试验环境11.3预备知识11.4设计要求1第2章 课程设计内容22.1 课题描述22.2 系统设计22.2.1功效分析22.2.2面向对象设计32.2.2类组员描述52.3程序实现92.3.1源码分析92.3.2运行结果13第3章 课程设计总结14参考文件15第1章 课程设计目标和要求1.1 设计目标将理论教学中包含到知识点贯穿起来,对不一样数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用

3、,对所学知识达成融会贯通程度。经过课程设计,学生在下述各方面能力应该得到锻炼:(1)深入巩固、加深学生所学专业课程C+语言教程基础理论知识,理论联络实际,深入培养学生综合分析问题,处理问题能力。(2)全方面考评学生所掌握基础理论知识及其实际业务能力,从而达成提升学生素质最终目标。(3)利用所学知识,开发小型应用系统,掌握利用C+语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理综合能力。(4)对于给定设计题目,怎样进行分析,理清思绪,并给出对应数学模型。(5)掌握面向对象程序设计方法。(6)熟练掌握C+语言基础语法,灵活利用多种数据类型。(7)深入掌握在集成环境下怎样调试程序和修改程

4、序。1.2试验环境硬件要求能运行Windows 操作系统微机系统。C+语言应用程序开发软件使用:VC+ 系统,或其它C+语言应用程序开发软件。1.3预备知识熟悉C+语言程序设计基础知识及VC+编辑器使用方法。1.4设计要求1.仔细分析设计题目,画出程序步骤图,编写程序源代码。2.主动上机调试源程序,增强编程技巧和调程能力。3.认真书写课程设计预习汇报,课程设计说明书。4.遵守课程设计要求和机房管理制度,服从指导老师安排,确保课程设计顺利完成课程设计内容。第2章 课程设计内容2.1 课题描述扫雷最原始版本能够追溯到1973年一款名为“方块”游戏。很快以后,“方块”被改写成了游戏Rlogic。在R

5、logic里,玩家任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷安全路线,假如路全被地雷堵死就算输。两年后,汤姆安德森在Rlogic基础上又编写出了游戏地雷,由此奠定了现代扫雷游戏雏形。1981年,微软企业罗伯特和卡特两位工程师在Windows 3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。本课程设计实现类似于Windows操作系统自带扫雷游戏。在课程设计中,系统开发平台为Windows XP,程序设计语言采取Visual C+,程序运行平台为Windows /XP。在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为含有所在雷区二维数组行和列、目前状态、方块属性、历

6、史状态结构体。整个游戏程序包含了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴伴随GDI绘图。程序经过调试运行,实现了设计目标,能够同时满足扫雷游戏初学者和高手需要。2.2 系统设计2.2.1功效分析本章课程设计使用C+语言编写一个和其类似扫雷游戏。具体要求以下:(1)选择等级后将出现对应等级扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便开启计时器。(2)用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块周围8个方块中共有多少颗雷。(3)假如用户认为某个方块下埋着雷,单击右键能够在方块上标识一个用户认为是雷图标,即给

7、出一个扫雷标识。用户每标识出一个扫雷标识(不管用户标识是否正确),程序将显示剩下雷数降低一个。(4)扫雷胜利后,显示游戏胜利,失败后显示再来一局。(5)用户能够改变游戏界面颜色外观。(6)游戏中用户能够经过菜单重新开始新游戏。2.2.2面向对象设计1. 类设计本程序设计了CMineWnd类、CDlgCustom类、bomb类、cview类、CDlgHero类、CDlgNewRecord类等。CMineWnd类作用:用于扫雷开始运行等操作。cbombview类作用:扫雷工作补充。bomb类作用:封装每颗雷相关属性。cview类作用:完成扫雷大部分工作。CDlgHero类作用:等级英雄榜。CDlg

8、NewRecord类作用:重新开始新游戏。基类为CMineWnd类、bomb类、cview类。派生类CDlgHero类由CDialog应用程序类继承,cbombview类由cview类继承。 (1)定义类bomb,封装每颗雷相关属性。 class bomb public: int isbomb;/决定初始时是否是雷 bool issel; /判定区域是否被处理过且周围有雷 bool isdone;/判定递归时是否被处理过 int num; /周围雷数 bool findbomb; /排雷者认为是雷时置一(不过不一定真是雷) ;(2) 重载cmainframe中precreatewindow,并

9、设置对应属性,使其窗体大小固定,这么就固定了显示区域大小为初始10乘10个雷和外加雷区上部控制区域,部分代码以下cs.style=ws_overlapped|ws_sysmenu| ws_border|ws_minimizebox; cs.cy = 10*15+6; cs.cx = 10*15+60; /6和60分别是横纵附加值,用于边框、菜单、标题条、控制区域。 (3) 重载cbombview中oncreate函数创建位图按钮,该位图按钮两幅位图对应了正常、雷正确两种状态,当要显示被炸死状态时应动态销毁该按钮,并重新创建一位图对应正常和被炸死两种状态,将该位图按钮id号定为id_game_b

10、egin,这么一来当点击按钮时便可重新开始游戏,部分代码以下。 crect rcclient; getclientrect(&rcclient); crect rect(rcclient.cx/2-8,10,rcclient.cx/2+8,20); m_button.create(new,bs_defpushbutton|ws_visible| bs_ownerdraw,rect,this,id_game_begin); m_button.loadbitmaps(idb_face1, idb_face2); 2.UML类图 CMineWnd -CMineApp: int -CMineWnd:

11、int -ExitInstance: int-InitInstance: BOOL +CMineWnd():virtual+ResetRecord():void+SetCustom():void+LookUp(CData & data): int+InitGame():void+LoadBitmap():void+FreeMines():void+LayMines(UINT row, UINT col):voidbomb CDlgHero-isbomb:int-issel:bool-isdone:bool-findbomb:bool-num:intint +DrawShell(CPaintDC

12、 &dc):void+DrawButton(CPaintDC &dc):void+SetBHolder(CString holder)+SetBRecord(UINT record):void+SetIHolder(CString holder)图2.1 扫雷游戏程序UML类图 3.系统总体步骤图结束开始开始依据使用者初始设定等候按键左键键右键第一次按下方块显示方块1 部署地雷2 开启计时器按下方块是否为地雷显示分数是否再玩玩结束延按下方块周围展开非地雷方块计时器时间到否否是是否否是是否图2.2系统总体步骤图2.2.2类组员描述1.程序编程中用到类函数简单介绍:CchildView:其中定义了

13、Drawboard对扫雷棋盘进行了绘制Drawbutton将资源类中存有脸图片进行淘汰选择加入到要求位置。Drawcell绘制雷区(即在资源类cell15个图片中依据需要选择标志,雷图标,和数字标实经过淘汰放到要求坐标处)DrawLCD绘制记时器,调用资源类中num数字图片用于记时Expand当鼠标点击处周围无雷时扩大范围Gameover游戏结束时定义Inbound对游戏鼠标点击区域限制OnCreate建立游戏OnGameCustomize游戏自定义设置OnGameNew游戏等级初始化OnGameRecord扫雷英雄榜判定统计OnLButtonDown左键按下时触发动作和计算机所做判定OnLB

14、uttonUp左键弹起时触发动作和计算机所做判定OnRButtonDown右键按下时触发动作和计算机所做判定OnRButtonUp右键弹起时触发动作和计算机所做判定OnTimer记时器设置OnUpdateGameLevel修改游戏等级OnUpdateGameMark修改游戏标志wm_lbuttomdown消息响应函数onlbuttomdown是处理用户输入关键实施者,函数首先判定点中位置是否是雷,是则关闭定时器,销毁原位图按钮,创建一对应正常和被炸死两种状态新位图按钮,并调用setstate将其设置为pushdown(小人哭状态),将m_bgameover,置为true标志游戏结束,不然先调用

15、setstate 设置位图按钮为pushdown (小人笑状态),并在onlbuttomup中设置位图按钮为正常状态,然后调用caculate函数记下周围雷数目,最终调用invalidate使用户区无效,迫使ondraw函数重绘用户区域,在调用invalidate时不应重画背景,避免闪烁,这么就完成了在雷区按下左键响应动作。wm_rbuttomdown消息响应函数onlbuttomdown将被认为有雷位置m_ibombnum.findbomb置一,降低左上角雷记数,然后判定是否真正全部排完了雷,是则结束游戏弹出input对话框,让扫雷人输入姓名,在响应idok通知码时将其写入注册表,没有全部排

16、完则使用户区无效,迫使ondraw函数重绘用户区域完成在雷区按下右键动作。 ondraw函数在每次点击左键或右键时全部会被调用重雷区和控制区域,因为点击情况复杂性和雷属性多元化造成ondraw函数需要精心设计。 函数caculate计算某个雷周围雷数,依据前面分析知道,计算某个雷周围雷数本身就是一个递归过程,在编制时应注意递归边界条件,稍不注意会陷入无穷递归而耗尽了系统资源。2. 系统结构图图2.3所表示。类模块扫雷游戏扫雷窗体类模块背景音乐英雄榜等级选择鼠标开始窗体加载鼠标函数递归函数重开函数画图函数音乐函数图2.3 系统结构图3. 雷区设计函数步骤图图2.4所表示。图2.4 雷区设计函数步

17、骤图4布雷函数步骤图随即获取一个状态为非雷点,将它属性标志为雷,反复这么工作,直到布下足够雷为止,其函数步骤图图2.5所表示。生成随机雷方块坐标(x,y)开始开始生成随机雷方块坐标(x,y)判定(x,y)区域是否已经布下雷在(x,y)区域布雷,修改状态数据据。判定是否布下全部雷结束否是是否图2.5 布雷函数步骤图在CMineWnd类中添加游戏布雷模块处理函数,该函数实现以下。void CMineWnd:LayMines(UINT row, UINT col)/埋下随机种子 srand( (unsigned)time( NULL ) ); UINT i, j; for(UINT index =

18、0; index 1000#pragma once#endif / _MSC_VER 1000#ifndef _AFXWIN_H_#error include stdafx.h before including this file for PCH#endif#include resource.h#include MineWnd.hclass CMineApp : public CWinApppublic:CMineApp();CMineWnd *m_pMineWnd;/AFX_VIRTUAL(CMineApp)public:virtual BOOL InitInstance();virtual

19、 int ExitInstance();DECLARE_MESSAGE_MAP()private:UINT m_uXMineNum;UINT m_uYMineNum;#endif2./源文件Mine.cpp,类Mine.cpp实现文件:#include stdafx.h#include Mine.h#include MineDefs.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifBEGIN_MESSAGE_MAP(CMineApp, CWinApp)END_MESS

20、AGE_MAP()CMineApp:CMineApp()CMineApp theApp;const CString className = _T(MineClass);BOOL CMineApp:InitInstance()SetRegistryKey(CSER_513_2);m_uXMineNum=GetProfileInt(GAME_SETTING,CUSTOM_XNUM, PRIMARY_XNUM);m_uYMineNum=GetProfileInt(GAME_SETTING, CUSTOM_YNUM, PRIMARY_YNUM);/定义并注册MineWnd窗口m_pMineWnd =

21、new CMineWnd();WNDCLASS wc;ZeroMemory(&wc, sizeof(wc);wc.hInstance = AfxGetInstanceHandle();wc.lpfnWndProc = :DefWindowProc;wc.hbrBackground = NULL;wc.hCursor = LoadCursor(IDC_ARROW);wc.hIcon = LoadIcon(IDR_MAINFRAME);wc.lpszClassName = className;wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);/注册窗口if (

22、!AfxRegisterClass(&wc) AfxMessageBox(注册类失败!);return FALSE;UINT uWidth = DEFAULT_FRAME_X + m_uXMineNum * MINE_WIDTH +LINE_WIDTH_0 * 3 + SIDE_WIDTH_0 + SIDE_WIDTH_1;UINT uHeight = DEFAULT_FRAME_Y + m_uYMineNum * MINE_HEIGHT + LINE_WIDTH_0 * 3 + SIDE_WIDTH_0 * 2 + SIDE_WIDTH_1 + SHELL_S_H;UINT uXPos =

23、GetSystemMetrics(SM_CXSCREEN) / 2 - uWidth / 2;UINT uYPos = GetSystemMetrics(SM_CYSCREEN) / 2 - uHeight / 2;/创建窗口if ( !m_pMineWnd-CreateEx( NULL, className, _T(扫雷), WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX, uXPos, uYPos, uWidth, uHeight,NULL, NULL) ) AfxMessageBox(创建主窗口失败!);return FALSE;/ 绑定该窗口为主窗口m

24、_pMainWnd = m_pMineWnd;/显示窗口m_pMineWnd-ShowWindow(SW_NORMAL);return TRUE;int CMineApp:ExitInstance() delete m_pMineWnd;return CWinApp:ExitInstance();3./鼠标左键点击事件关键代码以下所表示。void CMineWnd:OnLButtonUp(UINT nFlags, CPoint point) /笑脸图按钮所在区域CRect rcBtn(m_uBtnRect1, 15, m_uBtnRect2, 39);/雷区所在区域CRect rcMineAr

25、ea(MINE_AREA_LEFT, MINE_AREA_TOP, MINE_AREA_LEFT + m_uXNum * MINE_WIDTH, MINE_AREA_TOP + m_uYNum * MINE_HEIGHT);if (rcBtn.PtInRect(point) / 点击笑脸图Invalidate();InitGame();else if (rcMineArea.PtInRect(point) /点击雷区域CString value;UINT around = 0;/依据不一样游戏状态作处理switch(m_uGameState) /游戏进行状态m_pOldMine = GetMi

26、ne(point.x, point.y);if (!m_pOldMine) ReleaseCapture();return;/检测判定目前状态是否为左右鼠标同时按下if (m_bLRBtnDown) m_bLRBtnDown = FALSE;OnLRBtnUp(m_pOldMine-uRow, m_pOldMine-uCol);if (m_uGameState = GS_WAIT)m_uBtnState = BUTTON_NORMAL;Invalidate();ReleaseCapture();return;/假若周围已经标识雷周围真正雷数,拓展if (m_pOldMine-uState !=

27、 STATE_FLAG)OpenAround(m_pOldMine-uRow, m_pOldMine-uCol);if (ErrorAroundFlag(m_pOldMine-uRow, m_pOldMine-uCol)Dead(m_pOldMine-uRow, m_pOldMine-uCol);ReleaseCapture()return;else /开启定时器m_uTimer = SetTimer(ID_TIMER_EVENT, 1000, NULL);/布雷LayMines(m_pOldMine-uRow, m_pOldMine-uCol);/ lay all the mines dow

28、n /改变游戏状态为运行/GS_RUNm_uGameState = GS_RUN;if (m_pOldMine-uOldState = STATE_NORMAL)/当该雷区域为正常未作标识才打开/假如该区域为雷,则死亡if (IsMine(m_pOldMine-uRow, m_pOldMine-uCol) Dead(m_pOldMine-uRow, m_pOldMine-uCol);ReleaseCapture();return;/ the special MINEWND is not a mine /不是雷时候,获取其周围雷数目around = GetAroundNum(m_pOldMine

29、-uRow, m_pOldMine-uCol);/标志为“?”问号时候m_pOldMine-uState = STATE_DICEY;/图形结束void CSnakeView:close() 2.3.2运行结果程序运行结果图2.6、图2.7。游戏初始界面:以下图图2.6游戏初级初始界面游戏过程界面:以下图图2.7游戏中级开始后界面第3章 课程设计总结此次C+课程设计我题目是扫雷,题目不算难,但我做很艰苦。关键就是动手能力太差,理论知识掌握不全方面,自认为会不少,但真做起来,却不知道从哪下手了。又回去温习理论知识,请教老师,上网查资料,忙不亦乐乎。不过经过努力总算是做出来了,还经过此次课程设计,

30、将我本学期所学C+知识得到巩固和应用。在设计过程中我碰到很多问题,在老师帮助和自己思索下还是很好完成了。这此课程设计我知道了写程序不能脱离实际,只凭主观办事,要努力拓宽知识面,拓展思维。事情就是如此,努力代表收获。经过这次课程设计,我才真正领悟到“艰苦奋斗”这一词真正含义,我才感受到早期电子设计者为现代社会付出。设计确实有些辛劳,但苦中也有乐,在现在单一理论学习中,极少有机会能有实践机会,但现在能够,这些天设计中得到东西却不比理论课上得到少多少,我感觉我和C+距离愈加近了;我想说,确实很累,但当我看到自己所做结果时,心中也不免产生兴奋; 学习有结果了么。对C+编程有了一个基础了解。这些天温习内

31、容越多,敲得代码越多,自己学习主动性也越在提升,感觉也越充实。越来越发觉现在学习只是C+基础,但包含面还是很广泛,这些全部为以后深入学习C+高级特征打下了扎实基础。伴随课程难度慢慢加强,以后碰到困难也必将会越来越多,但我相信自己一定能做好这些。在此次C+课程设计中,我要很感谢我指导老师翟老师,不仅在课堂上教给了我很多C+编程知识,编程思想,而且在这次课程设计中更教会了我动手能力,真正编出了自己东西,还要感谢我同学,她们在我碰到困难时也给了我很多帮助。参考文件1.郑飞倩 编著 C+面向对象程序设计 上海:电子工业出版社2.吴华恩 主编 C+程序设计 北京:机械工业出版社3.洪永清 主编 面向对象系统分析 天津:天津大学出版社4.谭浩强 主编 面向对象建模 武汉:科技大学出版社 5.邵伟忠 主编 常见算法程序集 天津:人民大学出版社 6.徐世亮 编著 C+大学教程 北京:人民邮电出版社 7.徐孝凯 编著 C+语言程序设计 北京:清华大学出版社8.吴访升 编著 C+程序设计 北京: 机械工业出版社9.Decoder 主编 C/C+程序设计 北京:中国铁道出版社10.徐静芬 主编 C+语言程序设计 辽宁:广播大学出版社

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服