扫雷游戏程序设计课程设计报告
扫雷游戏课程设计报告

(一)需求分析题目:32、实现一种N*M 旳扫雷游戏设计规定:可以实现一种N*M 旳扫雷游戏a、可以打开一种方格(由于做旳是静态显示,故在控制台上方格用‘—’替代),已打开旳方格不能关闭b、可以标识一种方格,标识方格旳含义是对该方格有雷旳预测(并不体现真旳一定有雷)c、可以给出游戏成果:输、赢d、N和M可由玩家自己设置系统功能需求分析:一种数字和一种雷(boom)。
你可以打开(open)一种方格,假如你打开旳是一种boom,那么就失败;否则就会打开一种数字,该数字是位于[0,8]旳一种整数,该数字体现其所有邻居方格所包括旳雷数,应用该信息可以协助你扫雷。
点击到了某区域发现其周围没有雷,那么显而易见应当点开周围旳区域,拓展空白区域(二)概要设计由于知识储备局限性,VC中旳MFC应用程序又过于复杂,故退而求另首先,不再采用动态显示和界面图形化,采用静态显示来实现扫雷游戏中旳重要功能。
用键盘上旳‘1’键替代鼠标左击,即打开一种方格查看其属性,已打开旳方格不能在关闭;用键盘上旳‘2’键替代鼠标右击,即标识一种方格,标识方格旳含义是对该方格有雷旳预测(并不体现真旳一定有雷)用键盘上旳‘↑’‘↓’‘←’‘→’四个键来实现光标在控制台上旳自由移动,相称于用鼠标实现光标在图形界面旳移动游戏区域旳高度与宽度及总雷数可由玩家自己设定应题目规定设计了一种基类:Base和一种继承类:Game。
基类Base重要实现某些基本功能:游戏结束时输出游戏旳成果:输赢;返回控制台上光标旳位置返回按下键时所对应旳按键控制符基类Base:继承类Game是本程序旳重要内容,也是实现扫雷游戏旳关键部分。
重要实现旳功能:初始化图形界面,把游戏区域在控制台上显示出来;运用随机函数进行随机布雷,以保证玩家每次玩游戏时雷旳分布位置均不同样;得到一种坐标位置周围旳雷数,并把数值返回;在一种坐标点上(x,y)点击,在该位置上显示其周围旳雷数或拓展空白区域或失败;假如一种坐标点旳周围没有雷,则拓展空白区域,并递归拓展;其中saolei()函数是类Game里旳关键函数体,用来判断玩家按下了哪个键,并作出对应反应(上下左右四个方向旳移动,打开一种方格,标识一种方格),并判断游戏旳输与赢继承类Game:(三)详细设计关键算法:(1)布雷函数:初始化时把数组里旳值所有置为0,然后运用srand(),rand()随机机制产生随机数,分别对列和行取模,便产生了雷旳随机位置。
c语言程序设计课程设计扫雷

c语言程序设计课程设计扫雷一、课程目标知识目标:1. 理解C语言中数组、循环和条件判断等基本概念,掌握其在扫雷游戏中的应用;2. 学会使用C语言编写扫雷游戏的逻辑代码,实现游戏的基本功能;3. 了解扫雷游戏的规则,理解其背后的算法原理。
技能目标:1. 能够运用所学知识,独立设计并编写简单的C语言程序,实现扫雷游戏的基本功能;2. 培养逻辑思维能力,提高编程解决问题的能力;3. 学会运用调试工具,分析并解决程序中的错误。
情感态度价值观目标:1. 培养对编程的兴趣,激发学习C语言的积极性;2. 增强团队协作能力,培养良好的编程习惯;3. 认识到编程在现实生活中的应用,树立正确的价值观。
本课程针对高年级学生,在学生已掌握C语言基础知识的前提下,通过设计扫雷游戏,提高学生的编程实践能力。
课程注重培养学生的逻辑思维和团队协作能力,使学生能够运用所学知识解决实际问题。
课程目标具体、可衡量,以便学生和教师能够清晰地了解课程的预期成果,为后续的教学设计和评估提供依据。
二、教学内容1. C语言基础知识回顾:数组、循环、条件判断等基本概念及其应用;2. 扫雷游戏规则介绍:游戏界面、雷区、标记、计时等;3. 扫雷游戏算法原理:递归、随机数生成、数组操作等;4. 编程实践:a. 设计游戏界面和数据结构;b. 编写扫雷逻辑代码,实现游戏的基本功能;c. 调试与优化程序,提高游戏性能;5. 团队协作与编程规范:分工合作、代码规范、注释使用等。
教学内容依据课程目标,结合教材相关章节,确保科学性和系统性。
教学大纲安排如下:第一课时:C语言基础知识回顾,介绍扫雷游戏规则;第二课时:讲解扫雷游戏算法原理,引导学生思考如何实现游戏功能;第三课时:分组讨论,设计游戏界面和数据结构;第四课时:编写扫雷逻辑代码,实现游戏基本功能;第五课时:调试与优化程序,提高游戏性能;第六课时:团队协作与编程规范,总结课程收获。
三、教学方法本课程采用以下教学方法,旨在激发学生学习兴趣,提高教学效果:1. 讲授法:教师通过生动的语言和示例,为学生讲解C语言基础知识和扫雷游戏算法原理,使学生在短时间内掌握课程重点。
c语言扫雷课程设计报告vc

C语言扫雷课程设计报告1. 引言扫雷游戏是一款经典的单人益智游戏,通过在一个由方块组成的网格中,通过点击方块并根据周围方块的状态来逐步揭示地雷的位置。
本文档将介绍一个使用C语言实现的扫雷游戏。
2. 项目背景扫雷游戏是一个经典的Windows游戏,在Windows操作系统中自带有扫雷游戏,因此开发一个C语言版本的扫雷游戏可以提高学生对C 语言的学习兴趣,同时锻炼计算机编程能力。
3. 项目目标本项目的目标是实现一个具备基本功能的C语言扫雷游戏,包括以下特点:•游戏开始时,玩家输入游戏难度(即地雷数量和地图大小),按照输入的难度生成对应的地图。
•玩家通过输入坐标的方式来翻开方块,并根据周围地雷的数量显示提示信息。
•当玩家翻开一个地雷方块时,游戏结束,显示游戏失败信息。
•如果玩家成功翻开了所有的非地雷方块,则游戏胜利,显示游戏胜利信息。
4. 技术实现本项目将使用C语言实现扫雷游戏,主要涉及以下技术:•使用C语言的基本语法和数据结构,实现游戏逻辑和操作;•使用C语言中的文件操作,实现游戏的保存和读取功能;•使用C语言中的随机数生成函数,生成随机地雷的位置;•使用C语言的图形库(如ncurses)来实现游戏界面的显示。
5. 版本控制为了方便项目的维护和追踪,本项目将使用Git进行版本控制。
代码库将托管在GitHub上,方便多人协作和版本管理。
6. 开发计划本项目的开发计划如下:•第1周:学习C语言基础知识,熟悉C语言的基本语法和数据结构;•第2周:完成C语言扫雷游戏的框架搭建,包括游戏初始化、界面设计等;•第3周:实现游戏逻辑,包括地雷生成、方块翻开、胜利条件判定等;•第4周:优化游戏功能,增加保存和读取功能,完善游戏界面等;•第5周:完成文档撰写和项目总结。
7. 预期成果通过本项目的实现,预期可以达到以下成果:•培养学生对C语言的编程能力,加深对C语言的理解;•提高学生的逻辑思维和问题解决能力;•锻炼学生的团队协作和沟通能力;•了解和应用Git版本控制工具,提高代码管理和维护能力。
幼儿园益智游戏《扫雷》教案及游戏实践报告

《扫雷》教学实践与游戏报告1. 前言幼儿园益智游戏一直是幼儿园教学中不可或缺的一部分。
而在幼儿园益智游戏中,《扫雷》作为一款富有挑战性和趣味性的益智游戏,受到了越来越多幼儿园老师和家长的关注。
本文将以《扫雷》为主题,围绕教学实践及游戏报告展开探讨,并希望能在对该游戏进行深入了解的为幼儿园教师及家长提供一些有益的借鉴。
2. 《扫雷》教案设计2.1 游戏概述《扫雷》是一款在方块矩阵中排雷的游戏。
每个方块中可能有地雷,也可能没有。
玩家需要根据已知信息判断哪些方块中有地雷,哪些没有,并用旗帜标记。
游戏的目标是找出所有没有地雷的方块。
2.2 游戏目标通过玩《扫雷》游戏,培养幼儿的观察能力、逻辑推理能力和空间想象能力,提高幼儿的专注力和耐心。
3. 游戏实践报告3.1 游戏实践过程在一次《扫雷》游戏实践中,我们为幼儿们准备了一块由小方块组成的游戏板,其中隐藏了一些小石子代表地雷。
幼儿们在老师的指导下,用小旗帜标记出他们认为有地雷的位置,并逐渐揭开没有地雷的位置。
3.2 游戏实践效果通过《扫雷》游戏实践,我们发现幼儿们在游戏中展现出了较强的观察力和逻辑推理能力。
他们能够根据已知信息做出判断,并在游戏中不断尝试,提高了他们的空间想象能力和解决问题的能力。
4. 总结通过对《扫雷》教学实践及游戏报告的深度和广度探讨,我们可以看到,《扫雷》作为一款益智游戏,确实对幼儿的能力培养有着积极的促进作用。
在今后的教学实践中,我们应该充分发挥益智游戏在幼儿教育中的作用,为幼儿的个性发展和综合能力的培养提供更多的可能性。
5. 个人观点和理解在我看来,《扫雷》这款益智游戏能够很好地锻炼幼儿的观察力和逻辑推理能力,同时也能够培养幼儿的耐心和解决问题的能力。
我认为在幼儿园教学中,引入类似的益智游戏是非常有益的。
结语通过本文的撰写,希望能够对幼儿园教师及家长们对《扫雷》益智游戏有更深入的了解,并帮助他们更好地教育和培养孩子。
希望本文的内容能够为读者带来一些启发和帮助。
人工智能 扫雷 课程设计报告

人工智能project报告学号:20091000608姓名:王沙沙班级:191091指导老师:赵老师2011年10月25目录1.自动扫雷 (3)需求分析 (3)游戏规则 (3)扫雷游戏设计 (3)自动扫雷设计 (5)用户手册 (5)运行结果 (6)结论 (7)主要算法代码 (7)1 自动扫雷1.问题描述、需求分析扫雷是Windows操作系统自带的桌面小游戏之一,由于其规则简单,长期以来一直受到电脑用户的欢迎。
自动扫雷是开始扫雷后根据扫雷规则利用计算机进行扫雷。
开始棋局,单击第一个按钮,因为执行第一个动作时所有按钮是雷的概率都相等,为了方便起见每次开局后都按下第一个按钮,如果不幸第一个按钮就是雷,那么单击--开始--重新开局。
2.游戏规则游戏界面如下图所示,游戏区域是由M X N个格子组成的“雷区”,左上方的数字显示雷区中未被标出的地雷的个数,右上方的数字显示用户从第一次点击开始所用的时间,单位是秒。
中间的图标指示游戏的状态(完成:笑脸;失败:哭脸)。
用户需要通过鼠标操作来确定雷区中所有地雷的位置:左键单击:尝试某个格子是否有地雷。
如果该格子下有地雷,则游戏失败·如果该格子下没有地雷但其周围八个格子下有地雷,该格子会显示其周围八个格子中地雷的个数;如果该格子下没有地雷且其周围八个格子下也没有地雷,则此处被挖开。
右键单击:改变某个格子是否有雷的标志(工)。
或左右键同时单击:当该格子周围已标地雷的个数与格子中的数字相同时,则挖开周围的其余格子。
当提示该格子周围已标地雷的个数少于格子;3.扫雷游戏设计每个格子有如下几种状态:{MS_NORMAL,MS_OPEN,MS_FLAG,MS_QUEST,MS_EXPLODE} MINESTATUS1)格子类共有变量如下:MINESTATUS m_nStatus;//格子状态int m_nMineNum;//格子周围的雷数,即格子上显示的数字CWnd *m_pParent;//父窗口int m_nX,m_nY; //按下按钮的横纵坐标成员函数SetStatus(MINESTATUS nStatus)//设置状态GetStatus()//获取状态SetMineNum(int nMineNum)//设置雷数GetMineNum() //获取雷数DrawItem(BOOL bFail=TRUE);//绘制格子2)布雷类共有变量如下int m_nRow,m_nCol;//棋盘有多少行多少列int m_nMineNum; //棋盘上的雷数int m_nX,m_nY; //棋盘的位置int m_nOldMine;int m_aMineTest[9];int m_nMineTest;CMineButton *m_aLandMine[10000]; //棋盘CWnd *m_pParent;成员函数Create(int nRow,int nCol,int nMineNum,int nX,int nY,CWnd *pParent);Reset(int nRow,int nCol,int nMineNum);//重新布局ReDraw(BOOL bFail);//刷新棋局LButtonDown(CPoint point);//左键按下BothButtonDown(CPoint point);//左键与右键同时按下RButtonDown(CPoint point);//右键按下MouseMove(CPoint point,int bBothDown);//鼠标移动LButtonUp(CPoint point);//左键弹起BothButtonUp(CPoint point);//左键与右键同时弹起OpenMine(int nCurMine);//开局函数IsSuccess(); //判断是否扫雷成功RndBtShdDn(int nCurMine);GetMineNum()//获取棋盘的雷数GetRight(int nCurMine)//获取四邻域的中心点像素正右方像素点的位置 GetLeft(int nCurMine)//获取四邻域的中心点像素正下左像素点的位置 GetTop(int nCurMine)//获取四邻域的中心点像素正上方像素点的位置GetBot(int nCurMine)//获取四邻域的中心点像素正下方像素点的位置3)布雷算法:首先定义一个n*n的二维数组,该数组的i-1到i+1,j-1到j+1除去i,j本身。
java_扫雷游戏课程设计报告(共5篇)

java_扫雷游戏课程设计报告(共5篇)第一篇:java_扫雷游戏课程设计报告一、设计任务与要求扫雷游戏的基本要求Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。
本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。
具体要求如下:(1)扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。
单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。
(2)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。
(3)用户要揭开某个方块,可单击它。
若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
(5)扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。
(6)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记(或者用快捷键alt+G 然后M)即可,此时双击右键并可出现“?”标记。
另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。
(7)如果用户需要即使提示声,并可选中声音选项,此时将听到计时的卡塔声。
当用户点中雷时,将有爆炸声产生,胜利时,将有凯旋的旋律播放,此时企鹅出现欢悦表情。
二、需求分析1、扫雷游戏概述扫雷是一种具有迷惑性的对记忆和推理能力的简单测试,它是长久以来最受欢迎的Windows游戏之一。
游戏目标:找出空方块,同时避免触雷。
2、扫雷的操作方法游戏主区域由很多个方格组成。
使用鼠标随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开。
扫雷游戏程序设计报告

基于WIN32模拟WINDOWS XP扫雷程序设计————作者:JerayLee 课程设计目的与要求:本课程设计是计算机科学与技术专业重要的实践性环节之一,是对本程学习后进行的一次全面而综合的练习。
本次课程设计的目的与任务主要有:1.巩固和加深学生对C和C++语言的基本知识的理解与掌握。
2.掌握C和C++语言编程和调试的基本技能3.运用C和C++语言对程序的简单设计4.掌握程序设计说明文档的能力与技巧5.提高与运用C和C++语言解决能实际问题的能力一、题目描述:自行分析Windows XP系统自带扫雷游戏,查找规则并对主要功能进行模仿程序实现,对于实现过程中出现的bug进行调试解决。
二、使用语言:C和C++ 语言选用C++语言的原因,简而言之主要是因为C++的设计目标,就是要让C++既具有适合于系统程序设计的C语言所具有的可适应性和高效性,又能在其程序组织结构方面具有像其他的语言所支持的程序优势。
这即是说,C++所提供的抽象机制能够被应用于那些对效率和可适应性具有极高要求的程序设计任务之中。
三、编译以及运行环境:编译环境:Microsoft Visual C++ 6.0运行环境:Windows XP或其他兼容兼容系统四、题目分析:经过对游戏的初步分析,扫雷游戏含有如下规则:根据输入的信息,执行相应的挖雷,插旗,疑问标记,自动蔓延开挖等。
挖雷过程由计时器计时,由一个计数器统计插旗后雷的剩余个数。
如果选择了标记功能,那么单机右键会依次对未知点进行插旗,标记,取消插旗与标记。
如果点滴到插旗的如果点击到了未插旗子的雷区,如果是雷,则判定游戏失败,之后对雷区的点击进行屏蔽,不予响应。
如果是疑问标记则像正常区域对待。
如何判断胜利,如果所有的雷都被插旗或者点击后剩余的雷区,五、程序运行流程简介以及流程图:点击程序按默认参数进行初始化,输入,表情对鼠标左右键点击进行变化响应,对于雷区内点击进行规律响应,对雷区点击后果进行统计,判断失败与成功,失败或者成功之后,对于雷区内的输入也就是点击进行屏蔽,对菜单游戏级别、重新开始游戏按钮响应。
C语言程序设计扫雷游戏实验报告

中南大学程序设计基础实践报告题目设计一个和window系统类似的小游戏【挖地雷】学生姓名张兰兰学院信息科学与工程学院专业班级物联网工程1301班完成时间 2014.1目录1.课程设计内容 (3)2.课程设计目的 (3)3.背景知识 (3)4.工具/准备工作 (5)5.设计步骤、方法 (5)5.1. 步骤1:步骤名称(二级标题) ..........................................................错误!未定义书签。
5.1.1. 步骤1.1:步骤名称(三级标题) (5)5.2. 步骤2:步骤名称.............................................................................错误!未定义书签。
5.3. 步骤n:步骤名称.............................................................................错误!未定义书签。
6.设计结果及分析 (5)7.设计结论 (15)8.问题及心得体会 (16)9.对本设计过程及方法、手段的改进建议 (17)10.参考文献 (17)报告名称1. 课程设计内容在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows 操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。
我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。
即:设计一个功能与Windows中的挖雷游戏相同的小游戏。
2. 课程设计目的1.培养学生综合运用所学知识独立完成课题的能力。
2.试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课 程 设 计扫雷游戏程序设计2013 年 11 月 5 日设计题目 学 号专业班级 学生姓名 指导教师合肥工业大学课程设计任务书一.设计任务(1)鼠标左击排雷,右击插小旗,打问号;(2)方格里面的数字表示方格周围的雷数;(3)能够显示未标记雷数和游戏用时;(4)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。
在任何情况下单击小脸可以重新开始游戏;(5)可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能;(6)排行榜功能,扫雷成功时候,根据游戏用时更新排行榜。
二. 具体设计(一)、设计思路扫雷游戏是很经典也很有趣的一款游戏,这次的游戏程序设计要求设计出功能与原游戏相近的一款游戏,首先定义变量和类要画出游戏方格以及位图,设计游戏等级,等级越高方格越多雷数也越多;然后设置随机布雷以保证每次重新开始游戏都有不同的雷区地图;另外定义鼠标左击扫雷,左击标记周围埋雷情况,右击奇数次排雷偶数次取消上次排雷,以及扫雷第一次左击不能扫到雷。
(二)、设计表示:1、鼠标左击排雷,右击插小旗,打问号;2、方格里面的数字表示方格周围的雷数;3、能够显示未标记雷数和游戏用时;4、雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。
在任何情况下单击小脸可以重新开始游戏;5、可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数);6、任何时候开始游戏第一次点击不会扫到雷。
由于时间等原因未完成功能:排行榜和自行定义雷区行数,列数和雷数功能。
(四)、详细设计1、添加位图前十二幅是在雷区的,后四幅是按钮。
为了便于加载,必须各自保证其连续性。
分别表示游戏进行的状态、结果胜利或触雷。
2、预设等级方格数雷数变化void CMywqq20112074View::OnEasy() /////////////////////////////初级{m_RowCount=10;//行数10m_ColCount=10;//列数10leinum=10;realnum=leinum;SetTimer(1,50,NULL);// TODO: Add your command handler code heresecond=0;//计时secondstart=0;//1时开始计时// num=0;leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(intj=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}//设置10个雷CMywqq20112074View::OnMiddle()//////////////////////////////////中级{m_RowCount=15;//行数15m_ColCount=15;//列数15leinum=40;realnum=leinum;SetTimer(1,50,NULL);// TODO: Add your command handler code heresecond=0;//计时secondstart=0;//1时开始计时// num=0;leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(intj=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}//设置40个雷void CMywqq20112074View::OnHard() ///////////////////////////////////////////高级{m_RowCount=25;//行数25m_ColCount=16;//列数16leinum=80;realnum=leinum;SetTimer(1,50,NULL);// TODO: Add your command handler code heresecond=0;//计时secondstart=0;//1时开始计时// num=0;leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(intj=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}//设置80个雷do{int k=rand()%m_RowCount;int l=rand()%m_ColCount;if(lei[k][l].shumu!=-1){lei[k][l].shumu=-1;aa++;}}while(aa!=leinum);3、第一次点击不会扫到雷if(lei[a][b].weitu==0||lei[a][b].weitu==3 ){for(;n==0&&lei[a][b].shumu==-1;)//////////////踩到第一个雷{int aa=0;//初始化0for(inti=0;i<m_RowCount;i++){for(intj=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}do{intk=rand()%m_RowCount;intl=rand()%m_ColCount;if(lei[k][l].shumu!=-1){lei[k][l].shumu=-1;aa++;}}while(aa!=leinum);//给方格赋值for(inta=0;a<m_RowCount;a++)for(intb=0;b<m_ColCount;b++)if(lei[a][b].shumu==0){for(int c=a-1;c<a+2;c++)for(int d=b-1;d<b+2;d++)if(c>=0&&c<m_RowCount&&d>=0& &d<m_ColCount)if(lei[c][d].shumu==-1)lei[a][b].shumu++;}}4、鼠标右击插小旗,打问号第一次用右键单击某个区域时,该区域上插上一面小红旗,此时单击左键没有任何变化,第二次用右键单击时恢复原状。
//判断显示什么位图//weitu=1已按下的数字区//weitu=2显示旗//weitu=3显示问号for(int a=0;a<m_RowCount;a++)for(intb=0;b<m_ColCount;b++){if(lei[a][b].weitu==1){Dc.SelectObject(m_Bitmap[lei[a][b].shumu]);pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);}if(lei[a][b].weitu==2){Dc.SelectObject(m_Bitmap[9]);pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);}if(lei[a][b].weitu==3){Dc.SelectObject(m_Bitmap[10]);pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);}//结束(五)、调试及测试经运行测试之后,程序出现的问题有:1、第一次打开游戏时有时会出现不能计时的情况2、胜利的表情不能正常显示(六)、使用说明A、鼠标左击排雷,右击插小旗,打问号;B、方格里面的数字表示方格周围的雷数;C、在任何情况下单击小脸可以重新开始游戏;D、可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能;E、扫雷成功时候,游戏用时更新排行榜(七)、运行实例鼠标左击排雷,可翻开连片空格,方格周围数字表示周围埋雷数目,右键单击一次插小红旗,双击显示问号表示雷数情况未知,同时显示剩余雷数以及游戏用时可从预设难度等级中选择游戏难度,游戏方格数和雷数都有相应增加←初级←中级←高级触雷时现出痛苦的表情,游戏结束将雷全部排出,胜利的呐喊!!(八)、设计小结这个短短几天的C++课程设计虽然为期不长,却让我们从实践中学到了更多的C++编程知识,一开始看到示例中让人眼花缭乱的程序代码让人很有放弃的冲动,可是最后还是坚持下来将代码读完并自己琢磨出一套代码出来,在这中间也遇到不少的困难,一开始不知道位图是怎么做的,那些看起来可爱的表情做起来却并不简单,还要在代码里将这些表情的二维坐标对应起来,过程细致而繁杂,最终在与同学讨论之后成功做出,大家还一起开玩笑涂鸦自定义表情,轻松的话语冲淡了写代码时的烦躁。
还有在设定难度时要重新画方格,右键单击时出现不同的状态,第一次点击的时候不能扫到雷等等难关,都被坚持不懈的毅力和耐力一一克服。
直到最后看到各种功能在自己手下实现,这时的成就感和喜悦是之前单独实现一个个小功能所不能比的,不由更加感叹程序编程的奇妙,让我对程序员有了新的认识,也下定决心努力向他们看齐!!附录:源程序// wqq20112074View.cpp : implementation of the CMywqq20112074View class//#include "stdafx.h"#include "wqq20112074.h"#include "wqq20112074Doc.h"#include "wqq20112074View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//////////////////////////////////////////////////////////////////////////// /// CMywqq20112074ViewIMPLEMENT_DYNCREATE(CMywqq20112074V iew, CView)BEGIN_MESSAGE_MAP(CMywqq20112074View, CView)//{{AFX_MSG_MAP(CMywqq20112074View )ON_WM_TIMER()ON_WM_LBUTTONDOWN()ON_WM_CREATE()ON_COMMAND(ID_START, OnStart)ON_WM_LBUTTONUP()ON_WM_RBUTTONDOWN()ON_COMMAND(ID_EASY, OnEasy)ON_COMMAND(ID_MIDDLE, OnMiddle)ON_COMMAND(ID_HARD, OnHard)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIE W, CView::OnFilePrintPreview)END_MESSAGE_MAP()//////////////////////////////////////////////////////////////////////////// /// CMywqq20112074View construction/destructionCMywqq20112074View::CMywqq20112074View() {// TODO: add construction code herefor(int ii=0;ii<16;ii++)m_Bitmap[ii].LoadBitmap(IDB_BITMAP14+ii);for(int jj=0;jj<4;jj++)m_anniu[jj].LoadBitmap(IDB_ANNIU1+jj);second=0;//计时secondstart=0;//1时开始计时m_RowCount=25;//行数m_ColCount=16;//列数n=0;//格数leinum=5;realnum=leinum;leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(int j=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}//获取当前时间CTime time=GetCurrentTime();int s;//获取秒数s=time.GetSecond();//设置40个雷do{//以当前秒数为产生随机算法int k=(rand()*s)%m_RowCount;int l=(rand()*s)%m_ColCount;if(lei[k][l].shumu!=-1){lei[k][l].shumu=-1;aa++;}}while(aa!=leinum);//给方格赋值,计算雷数for(int a=0;a<m_RowCount;a++)for(int b=0;b<m_ColCount;b++)if(lei[a][b].shumu==0){for(int c=a-1;c<a+2;c++)for(int d=b-1;d<b+2;d++)if(c>=0&&c<m_RowCount&&d>=0&&d<m_ ColCount)if(lei[c][d].shumu==-1)lei[a][b].shumu++;}}CMywqq20112074View::~CMywqq20112074View( ){}BOOLCMywqq20112074View::PreCreateWindow(CREAT ESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}//////////////////////////////////////////////////////////////////////////// /// CMywqq20112074View drawingvoid CMywqq20112074View::OnDraw(CDC* pDC) {CMywqq20112074Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here//画背景CBrush mybrush1;mybrush1.CreateSolidBrush(RGB(192,192,192 ));CRect myrect1(0,0,1200,800);pDC->FillRect(myrect1,&mybrush1);//画黑框CBrush mybrush;mybrush.CreateSolidBrush(RGB(0,0,0));CRect myrect(20,10,70,40);pDC->FillRect(myrect,&mybrush);CRect myrect2(325,10,375,40);pDC->FillRect(myrect2,&mybrush);CPen mypen;CPen*myoldPen;mypen.CreatePen(PS_SOLID,2,RGB(255,255, 255));myoldPen=pDC->SelectObject(&mypen);//画黑框的白线pDC->MoveTo(20,40);pDC->LineTo(70,40);pDC->LineTo(70,10);pDC->MoveTo(325,40);pDC->LineTo(375,40);pDC->LineTo(375,10);//画雷区边线for(int i=0;i<m_RowCount;i++)for(int j=0;j<m_ColCount;j++){pDC->MoveTo(10+i*15,50+j*15+14);pDC->LineTo(10+i*15,50+j*15);pDC->LineTo(10+i*15+14,50+j*15);}pDC->SelectObject(myoldPen);CPen mypen2;CPen*myoldPen2;mypen2.CreatePen(PS_SOLID,1,RGB(0,0,0));myoldPen2=pDC->SelectObject(&mypen2);for(int ii=0;ii<m_RowCount;ii++)for(int jj=0;jj<m_ColCount;jj++){pDC->MoveTo(10+ii*15,50+jj*15+14);pDC->LineTo(10+ii*15+14,50+jj*15+14);pDC->LineTo(10+ii*15+14,50+jj*15);}pDC->SelectObject(myoldPen2);CDC Dc;if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can't create DC");//显示按钮Dc.SelectObject(m_anniu[0]);pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);//判断显示什么位图//weitu=1已按下的数字区//weitu=2显示旗//weitu=3显示问号for(int a=0;a<m_RowCount;a++)for(int b=0;b<m_ColCount;b++){if(lei[a][b].weitu==1){Dc.SelectObject(m_Bitmap[lei[a][b].shumu]);pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc, 0,0,SRCCOPY);}if(lei[a][b].weitu==2){Dc.SelectObject(m_Bitmap[9]);pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc, 0,0,SRCCOPY);}if(lei[a][b].weitu==3){Dc.SelectObject(m_Bitmap[10]);pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc, 0,0,SRCCOPY);}//结束if(jieshu==1&&lei[a][b].shumu==-1){Dc.SelectObject(m_Bitmap[11]);pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc, 0,0,SRCCOPY);Dc.SelectObject(m_anniu[3]);pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCO PY);}}//显示黑框里的数字int nOldDC=pDC->SaveDC();pDC->SetTextColor(RGB(255,0,0));pDC->SetBkColor(RGB(0,0,0));CFont font;if(0==font.CreatePointFont(160,"Comic Sans MS")){AfxMessageBox("Can't Create Font");}pDC->SelectObject(&font);CString str;if(leftnum<10)str.Format("00%d",leftnum);elsestr.Format("0%d",leftnum);pDC->TextOut(25,10,str);if(second<10)str.Format("00%d",second);else if(second<100)str.Format("0%d" ,second);elsestr.Format("%d" ,second);pDC->TextOut(330,10,str);pDC->RestoreDC(nOldDC);//////////////////////////////////////////////}//////////////////////////////////////////////////////////////////////////// /// CMywqq20112074View printingBOOLCMywqq20112074View::OnPreparePrinting(CPrintI nfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}voidCMywqq20112074View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}voidCMywqq20112074View::OnEndPrinting(CDC*/*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CMywqq20112074View diagnostics#ifdef _DEBUGvoid CMywqq20112074View::AssertValid() const {CView::AssertValid();}voidCMywqq20112074View::Dump(CDumpContext& dc) const{CView::Dump(dc);}CMywqq20112074Doc*CMywqq20112074View::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIM E_CLASS(CMywqq20112074Doc)));return(CMywqq20112074Doc*)m_pDocument;}#endif //_DEBUG//////////////////////////////////////////////////////////////////////////// /// CMywqq20112074View message handlersvoid CMywqq20112074View::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default//结束,返回if(jieshu==1)return;//显示个数为0的方格leizero();//计时if(secondstart>0)secondstart++;if(secondstart==20){secondstart=1;second++;//重画时间CRect rect3;rect3.left=325;rect3.right=375;rect3.top=10;rect3.bottom=40;InvalidateRect(&rect3);}CView::OnTimer(nIDEvent);}voidCMywqq20112074View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default//获取指针pdcCDC *pDC=GetDC();CDC Dc;if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can't create DC");//显示按下按钮if(point.x>180&&point.x<210&&point.y>10&&poi nt.y<40){Dc.SelectObject(m_anniu[3]);pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCO PY);}if((point.x>=10)&&(point.x<=385)&&(point.y>=50 )&&(point.y<=290)){if(jieshu==1)return;//显示张口按钮Dc.SelectObject(m_anniu[1]);pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCO PY);secondstart=1;int a=(point.x-10)/15;int b=(point.y-50)/15;if(lei[a][b].weitu==0||lei[a][b].weitu==3){ for(;n==0&&lei[a][b].shumu==-1;) //////////////踩到第一个雷{int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(intj=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}do{intk=rand()%m_RowCount;int l=rand()%m_ColCount;if(lei[k][l].shumu!=-1){lei[k][l].shumu=-1;aa++;}}while(aa!=leinum);//给方格赋值for(inta=0;a<m_RowCount;a++)for(intb=0;b<m_ColCount;b++)if(lei[a][b].shumu==0){for(intc=a-1;c<a+2;c++)for(intd=b-1;d<b+2;d++)if(c>=0&&c<m_RowCount&&d>=0&&d<m_ ColCount)if(lei[c][d].shumu==-1)lei[a][b].shumu++;}}///////////////////////////////////如果第一个不是雷接下去部分if(lei[a][b].shumu==-1){jieshu=1;KillTimer(1);Invalidate();}else if(leftnum==0){jieshu=2;KillTimer(1);Invalidate();}else{lei[a][b].weitu=1;CRect rect;rect.left=a*15+10;rect.right=a*15+25;rect.top=b*15+50;rect.bottom=b*15+65;InvalidateRect(&rect);}n++;///////////////////////////////////////////////n是静态变量,每点一次左键加1 判断第一个雷int a1=0;for(int a=0;a<m_RowCount;a++)for(int b=0;b<m_ColCount;b++){if(lei[a][b].weitu!=1){a1++;}}if(a1==leinum){jieshu=2;KillTimer(1);//////////////////////////////////////显示胜利按钮(运行的时候出错)Dc.SelectObject(m_anniu[4]);pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCO PY);for(inta=0;a<m_RowCount;a++)for(intb=0;b<m_ColCount;b++){if(lei[a][b].shumu==-1){lei[a][b].weitu=2;}}}Invalidate();}}CView::OnLButtonDown(nFlags, point);}int CMywqq20112074View::OnCreate(LPCREATEST RUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code here// SetTimer(1,50,NULL);return 0;}//扫描,如果是已经被按下且雷数为0,显示它周围的八个格,并重画void CMywqq20112074View::leizero(){for(int i=0;i<m_RowCount;i++)for(int j=0;j<m_ColCount;j++)if(lei[i][j].shumu==0&&lei[i][j].weitu==1){for(int n=i-1;n<i+2;n++)for(int m=j-1;m<j+2;m++) if(n>=0&&n<25&&m>=0&&m<m_ColCount)if(lei[n][m].shumu!=-1&&lei[n][m].weitu==0){lei[n][m].weitu=1;CRect rect;rect.left=n*15+10;rect.right=n*15+25;rect.top=m*15+50;rect.bottom=m*15+65;InvalidateRect(&rect);}}}void CMywqq20112074View::OnStart(){SetTimer(1,50,NULL);// TODO: Add your command handler code heresecond=0;//计时secondstart=0;//1时开始计时// num=0;leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止n=0;int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(int j=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}//设置40个雷do{int k=rand()%m_RowCount;int l=rand()%m_ColCount;if(lei[k][l].shumu!=-1){lei[k][l].shumu=-1;aa++;}}while(aa!=leinum);//给方格赋值for(int a=0;a<m_RowCount;a++)for(int b=0;b<m_ColCount;b++)if(lei[a][b].shumu==0){for(int c=a-1;c<a+2;c++)for(int d=b-1;d<b+2;d++)if(c>=0&&c<m_RowCount&&d>=0&&d<m_ ColCount)if(lei[c][d].shumu==-1)lei[a][b].shumu++;}Invalidate();}void CMywqq20112074View::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC();CDC Dc;if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can't create DC");//显示按钮Dc.SelectObject(m_anniu[0]);pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCO PY);if(jieshu==1){Dc.SelectObject(m_anniu[2]);pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCO PY);}if(point.x>180&&point.x<210&&point.y>10& &point.y<40)OnStart();CView::OnLButtonUp(nFlags, point);}voidCMywqq20112074View::OnRButtonDown(UINT nFlags, CPoint point){CDC *pDC=GetDC();CDC Dc;if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can't create DC");if((point.x>=10)&&(point.x<=385)&&(point.y >=50)&&(point.y<=290)){if(jieshu==1)return;int a=(point.x-10)/15;int b=(point.y-50)/15;if(lei[a][b].weitu==0){lei[a][b].weitu=2;leftnum--;if(lei[a][b].shumu==-1)realnum--;}else if(lei[a][b].weitu==2){lei[a][b].weitu=3;leftnum++;if(lei[a][b].shumu==-1)realnum++;}else if(lei[a][b].weitu==3)lei[a][b].weitu=0;CRect rect2;rect2.left=20;rect2.right=70;rect2.top=10;rect2.bottom=40;InvalidateRect(&rect2);//重画打击格子CRect rect;rect.left=a*15+10;rect.right=a*15+25;rect.top=b*15+50;rect.bottom=b*15+65;InvalidateRect(&rect);if(leftnum==0&&realnum==0){jieshu=1;second=1;MessageBox("获胜");}}CView::OnRButtonDown(nFlags, point);}void CMywqq20112074View::OnEasy() /////////////////////////////初级{m_RowCount=10;//行数10m_ColCount=10;//列数10leinum=10;realnum=leinum;SetTimer(1,50,NULL);// TODO: Add your command handler code heresecond=0;//计时secondstart=0;//1时开始计时// num=0;leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(int j=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}//设置10个雷do{int k=rand()%m_RowCount;int l=rand()%m_ColCount;if(lei[k][l].shumu!=-1){lei[k][l].shumu=-1;aa++;}}while(aa!=leinum);//给方格赋值for(int a=0;a<m_RowCount;a++)for(int b=0;b<m_ColCount;b++)if(lei[a][b].shumu==0){for(int c=a-1;c<a+2;c++)for(int d=b-1;d<b+2;d++)if(c>=0&&c<m_RowCount&&d>=0&&d<m_ ColCount)if(lei[c][d].shumu==-1)lei[a][b].shumu++;}Invalidate();}void CMywqq20112074View::OnMiddle() //////////////////////////////////中级{m_RowCount=15;//行数15m_ColCount=15;//列数15leinum=40;realnum=leinum;SetTimer(1,50,NULL);// TODO: Add your command handler code heresecond=0;//计时secondstart=0;//1时开始计时// num=0;leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(int j=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}//设置40个雷do{int k=rand()%m_RowCount;int l=rand()%m_ColCount;if(lei[k][l].shumu!=-1){lei[k][l].shumu=-1;aa++;}}while(aa!=leinum);//给方格赋值for(int a=0;a<m_RowCount;a++)for(int b=0;b<m_ColCount;b++)if(lei[a][b].shumu==0){for(int c=a-1;c<a+2;c++)for(int d=b-1;d<b+2;d++)if(c>=0&&c<m_RowCount&&d>=0&&d<m_ ColCount)if(lei[c][d].shumu==-1)lei[a][b].shumu++;}Invalidate();}void CMywqq20112074View::OnHard() ///////////////////////////////////////////高级{m_RowCount=25;//行数25m_ColCount=16;//列数16leinum=80;realnum=leinum;SetTimer(1,50,NULL);// TODO: Add your command handler codeheresecond=0;//计时secondstart=0;//1时开始计时// num=0;leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止int aa=0;//初始化0for(int i=0;i<m_RowCount;i++){for(int j=0;j<m_ColCount;j++){lei[i][j].shumu=0;lei[i][j].weitu=0;}}//设置80个雷do{int k=rand()%m_RowCount;int l=rand()%m_ColCount;if(lei[k][l].shumu!=-1){lei[k][l].shumu=-1;aa++;}}while(aa!=leinum);//给方格赋值for(int a=0;a<m_RowCount;a++)for(int b=0;b<m_ColCount;b++)if(lei[a][b].shumu==0){for(int c=a-1;c<a+2;c++)for(int d=b-1;d<b+2;d++)if(c>=0&&c<m_RowCount&&d>=0&&d<m_ ColCount)if(lei[c][d].shumu==-1)lei[a][b].shumu++;}Invalidate();}。