课程设计扫雷小游戏
- 格式:docx
- 大小:115.86 KB
- 文档页数:55
《扫雷》教案一、活动目标:1. 帮助幼儿认识数字和数字大小。
2. 培养幼儿的观察力和逻辑思维能力。
3. 提高幼儿合作与沟通能力。
二、活动准备:1. 游戏地点:教室内或室外均可。
2. 游戏材料:数字方块、扫雷地图、红、黄、蓝色小旗子。
三、活动流程:1. 简单介绍扫雷游戏的规则和目标。
2. 将数字方块随机放置在教室内或室外的地面上,以模拟扫雷地图。
3. 幼儿分成若干小组,每组一人担任“拆弹专家”。
4. 拆弹专家负责翻开数字方块,同时告知数字大小,并确保其他小组成员的安全。
5. 根据数字大小,其他小组成员决定是否在该处放置红、黄、蓝色小旗子,代表着“危险”、“迟疑”和“安全”。
6. 游戏继续进行,直到所有数字方块都被翻开并贴上旗子。
7. 小组成员讨论并总结各个位置的数字大小和旗子的摆放情况,最终确定哪些位置存在雷区。
四、活动评估:1. 观察幼儿在游戏中的表现,包括观察力、逻辑思维能力、合作与沟通能力。
2. 记录幼儿在游戏中的表现,包括发现雷区的次数、正确摆放旗子的次数等。
五、活动延伸:1. 在游戏结束后,可组织小组成员共同探讨游戏中出现的问题和解决方法,从而培养幼儿的思考能力和团队合作能力。
2. 可以引导幼儿思考类似于扫雷游戏的实际应用,比如在日常生活中如何遵守交通规则、安全用电等。
六、活动总结:1. 通过《扫雷》游戏的开展,幼儿不仅加深了对数字的认知,还培养了观察力、逻辑思维能力和合作与沟通能力。
2. 该游戏既能够锻炼小组成员的思考和解决问题能力,又能增进小组成员之间的团队合作感和责任感,是一项非常有益的幼儿园数字游戏教学活动。
七、活动反思:在《扫雷》游戏的进行过程中,我们发现了一些问题和可以改进的地方。
有些幼儿在游戏中表现出了过于急躁的情绪,导致在观察数字方块和决定放置旗子的位置时出现了错误。
这提示我们在今后的游戏中,需要加强对幼儿情绪管理和耐心培养的指导。
部分幼儿在游戏中缺乏有效的沟通和合作,导致小组间协作不够紧密,有些重要的信息无法及时传达。
c语言 扫雷 课程设计一、课程目标知识目标:1. 学生能理解C语言中数组的概念及其在程序设计中的应用。
2. 学生能够掌握C语言中循环和条件语句的使用,实现对数组的遍历和条件判断。
3. 学生能够运用逻辑思维和算法设计,实现扫雷游戏的初级算法。
技能目标:1. 学生能够运用C语言编写简单的扫雷游戏,培养编程实践能力。
2. 学生能够通过分析问题,设计并优化算法,提高解决问题的能力。
3. 学生能够在团队协作中,与同伴沟通、讨论,共同完成扫雷游戏的开发。
情感态度价值观目标:1. 学生通过扫雷游戏的开发,培养对编程的兴趣和热情,提高学习积极性。
2. 学生在团队协作中,学会分享和承担责任,培养良好的团队合作精神。
3. 学生在解决问题的过程中,锻炼面对挑战的勇气和毅力,培养克服困难的信心。
课程性质:本课程以项目式教学为主,结合实际案例,引导学生运用所学知识解决实际问题。
学生特点:学生处于中学阶段,对计算机编程有一定的了解,具备基本的C语言知识,对游戏开发有较高的兴趣。
教学要求:教师需结合学生特点和课程性质,设计合理的课程内容,引导学生主动参与,提高学生的实践能力和团队合作能力。
在教学过程中,注重培养学生的逻辑思维和问题解决能力,将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. C语言基础知识回顾:数组、指针、基本数据类型、运算符和表达式。
2. 控制结构:循环语句(for、while)、条件语句(if、else if、else)。
3. 函数:函数的定义、调用、参数传递。
4. 游戏设计原理:扫雷游戏规则、界面设计、逻辑实现。
5. 算法设计:递归、随机数生成、数组操作。
6. 项目实践:小组合作,按以下步骤进行扫雷游戏的开发:- 设计游戏界面和逻辑框架;- 编写初始化地图、布雷、显示地图、标记和排查雷等功能函数;- 整合各功能模块,实现完整的扫雷游戏;- 调试和优化程序。
教学内容安排和进度:1. 基础知识回顾(1课时);2. 控制结构和函数(2课时);3. 游戏设计原理和算法设计(2课时);4. 项目实践(3课时)。
扫雷小游戏c 课程设计一、课程目标知识目标:1. 学生理解并能运用基本的计算机编程知识,掌握扫雷游戏的规则和逻辑。
2. 学生掌握C语言的基本语法,如变量声明、循环结构和条件判断等。
3. 学生了解二维数组的使用,并能将其应用于扫雷游戏的地图表示。
技能目标:1. 学生能够运用C语言编写简单的扫雷游戏程序,实现游戏的基本功能,如地雷布置、翻开格子、标记旗帜等。
2. 学生通过编程实践,培养解决问题的能力和逻辑思维能力。
3. 学生掌握调试和优化程序的方法,提高程序质量和运行效率。
情感态度价值观目标:1. 学生培养对计算机编程的兴趣和热情,激发自主学习编程的动力。
2. 学生通过团队合作开发游戏,学会沟通与协作,培养团队精神和集体荣誉感。
3. 学生在编程过程中,体验克服困难的喜悦,增强自信心和毅力,培养积极向上的学习态度。
课程性质:本课程为信息技术学科,结合C语言编程知识,设计具有趣味性和挑战性的扫雷游戏,旨在提高学生的编程技能和逻辑思维能力。
学生特点:学生处于初中年级,对计算机编程有一定的基础,好奇心强,喜欢探索和挑战。
教学要求:教师需注重引导和启发,鼓励学生动手实践,关注学生的个别差异,提供有针对性的指导,确保学生在课程中取得实际的学习成果。
通过课程学习,使学生将理论知识与实际应用相结合,提高综合运用能力。
二、教学内容1. C语言基础语法复习:变量声明与赋值、数据类型、运算符、循环结构(for、while)、条件判断(if-else)。
相关教材章节:第一章至第三章。
2. 二维数组的应用:数组声明、初始化、访问元素,应用二维数组表示扫雷游戏地图。
相关教材章节:第四章数组部分。
3. 函数的定义与调用:编写功能函数,如布置地雷、翻开格子、判断输赢等,理解模块化编程思想。
相关教材章节:第五章函数部分。
4. 随机数的生成与应用:使用rand()函数生成随机数,布置随机地雷。
相关教材章节:第七章随机数部分。
5. 游戏逻辑与算法:设计扫雷游戏的算法,实现翻开无雷格子、标记旗帜等功能。
拓展课扫雷课程设计一、教学目标本课程的学习目标主要包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握扫雷的基本原理和方法,了解扫雷的历史和现状,提高对扫雷问题的认识水平。
技能目标要求学生能够运用所学的扫雷知识和方法,解决实际中的扫雷问题,提高解决问题的能力。
情感态度价值观目标要求学生在学习过程中,增强对生命的尊重和爱护,增强对和平的珍视和追求,形成积极向上的情感态度和价值观。
二、教学内容教学内容主要包括扫雷的基本原理、扫雷的方法、扫雷的历史和现状以及扫雷问题的解决。
首先,通过讲解和案例分析,使学生了解扫雷的基本原理和方法,掌握扫雷的基本技能。
其次,通过历史和现状的介绍,使学生了解扫雷问题的严重性和复杂性,提高学生对扫雷问题的认识水平。
最后,通过实际案例的分析和解决,使学生能够运用所学的知识和方法,解决实际中的扫雷问题。
三、教学方法在教学过程中,将采用讲授法、讨论法、案例分析法和实验法等多种教学方法。
讲授法用于扫雷基本原理和方法的讲解,使学生能够系统地了解和掌握扫雷知识。
讨论法用于扫雷问题的讨论,激发学生的思考和主动性,提高学生的解决问题的能力。
案例分析法用于扫雷案例的分析和解决,使学生能够运用所学的知识和方法,解决实际中的扫雷问题。
实验法用于扫雷设备的操作和实验,使学生能够亲自体验和了解扫雷的过程和方法。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备等。
教材和参考书用于提供扫雷的基本知识和方法,多媒体资料用于提供扫雷的历史和现状的图片和视频,实验设备用于提供扫雷的实验操作的机会。
这些教学资源将帮助学生更好地了解和掌握扫雷知识,提高学生的扫雷能力。
五、教学评估本课程的评估方式包括平时表现、作业和考试等。
平时表现主要评估学生在课堂上的参与程度、提问和回答问题的表现。
作业主要评估学生的扫雷知识和方法的掌握程度。
考试主要评估学生对扫雷知识和方法的全面理解和掌握。
这些评估方式将客观、公正地全面反映学生的学习成果。
安卓扫雷游戏课程设计一、课程目标知识目标:1. 学生能理解并掌握安卓开发基本知识,包括界面设计、事件处理和逻辑控制。
2. 学生能运用所学的安卓开发技能,独立完成一个扫雷游戏的编写。
3. 学生了解并掌握扫雷游戏的规则和算法实现。
技能目标:1. 学生能运用安卓开发工具(如Android Studio)进行游戏设计和开发。
2. 学生通过实践,培养解决问题、调试程序的能力。
3. 学生能够进行团队合作,共同完成项目任务。
情感态度价值观目标:1. 学生培养对编程的兴趣,增强学习信息技术的自信心。
2. 学生通过扫雷游戏项目,认识到编程在现实生活中的应用价值,激发创新意识。
3. 学生在团队合作中,学会沟通与协作,培养集体荣誉感和责任感。
课程性质:本课程为信息技术课程,结合实际操作,培养学生的编程能力和团队协作能力。
学生特点:学生为初中年级,具备一定的信息技术基础,对游戏开发有浓厚兴趣。
教学要求:结合学生特点,以实践操作为主,注重培养学生的动手能力和团队协作精神。
将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. 安卓开发基础- 界面设计:Activity、布局(LinearLayout、RelativeLayout)、控件(Button、TextView等)。
- 事件处理:setOnClickListener、触摸事件。
- 逻辑控制:条件语句(if-else)、循环语句(for、while)。
2. 扫雷游戏规则与算法- 扫雷游戏规则介绍:游戏目标、地雷分布、计分方式等。
- 算法实现:递归算法、随机数生成。
3. 游戏开发实践- 创建项目:使用Android Studio创建新项目,配置游戏界面。
- 编写代码:完成游戏逻辑、界面交互、地雷生成等功能。
- 调试与优化:测试游戏功能,修复bug,提高游戏体验。
4. 团队合作与项目评估- 团队合作:分配任务,协同开发,共同完成项目。
- 项目评估:评估标准,包括功能完整性、界面美观、代码规范等。
扫雷游戏c 课程设计一、教学目标本课程旨在通过扫雷游戏C的学习,让学生掌握基本的计算机编程技能,培养逻辑思维和解决问题的能力。
具体目标如下:知识目标:使学生了解扫雷游戏的规则和原理,学习C语言的基本语法和编程方法。
技能目标:培养学生使用C语言编写程序的能力,学会调试和优化程序。
情感态度价值观目标:培养学生对计算机科学的兴趣,增强自信心,培养团队协作和沟通能力。
二、教学内容本课程的教学内容主要包括扫雷游戏的规则介绍、C语言的基本语法和编程方法。
具体安排如下:第1-2课时:扫雷游戏的规则介绍和原理分析。
第3-4课时:C语言的基本语法和编程方法。
第5-6课时:扫雷游戏的编程实践。
第7-8课时:程序调试和优化。
第9-10课时:团队协作完成扫雷游戏的编程任务。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法、实验法等。
具体方法如下:第1-2课时:采用讲授法介绍扫雷游戏的规则和原理。
第3-4课时:采用案例分析法讲解C语言的基本语法和编程方法。
第5-6课时:采用实验法让学生动手编写扫雷游戏的程序。
第7-8课时:采用讨论法分析程序的调试和优化方法。
第9-10课时:采用团队协作法完成扫雷游戏的编程任务。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:教材:《C语言程序设计》。
参考书:《C语言编程实例教程》。
多媒体资料:扫雷游戏的教学视频。
实验设备:计算机、网络设备等。
五、教学评估本课程的评估方式将包括平时表现、作业和考试等,以全面客观地反映学生的学习成果。
具体评估方式如下:平时表现:通过观察学生在课堂上的参与度、提问和回答问题的情况,以及小组合作的表现来评估学生的学习态度和理解程度。
作业:布置与课程内容相关的编程作业,要求学生在规定时间内完成,并根据作业的质量给予评分。
考试:安排一次期末考试,测试学生对C语言编程知识的掌握程度,包括理论知识和编程实践。
高中数学扫雷游戏教案大全
一、教学目标:
1.了解数学扫雷游戏的规则和操作方法;
2.培养学生逻辑推理能力和数学计算能力;
3.培养学生团队合作和沟通交流能力。
二、教学准备:
1.数学扫雷游戏软件或在线游戏链接;
2.黑板、彩色粉笔、计算器等教学工具。
三、教学步骤:
1.介绍数学扫雷游戏的规则和操作方法,包括如何揭开方块、如何标记雷区等;
2.分组进行游戏,每组选择一名队长,其他队员帮助队长分析并提供建议;
3.让学生运用数学知识和逻辑推理来破解难题,找出雷的位置;
4.每组按照规定时间内找出雷的数量来评选最终胜利组;
5.总结游戏过程中的经验教训,让学生反思并提出建议,以便改进下一次游戏。
四、教学反馈:
1.收集学生的游戏反馈意见,包括喜好程度、困难程度、规则设置等方面;
2.鼓励学生提出改进建议,以便更好地开展下一次数学扫雷游戏教学活动。
五、课后延伸:
1.让学生尝试编写自己的数学扫雷游戏规则和算法;
2.鼓励学生在家中继续练习数学扫雷游戏,提高计算能力和逻辑推理能力。
通过以上教学活动,学生将能更好地理解数学概念,并提高数学计算能力和逻辑推理能力,同时培养团队合作和沟通交流能力。
愿我们的教学活动能够给学生带来更多的乐趣和收获!。
扫雷游戏活动策划书3篇篇一扫雷游戏活动策划书一、活动主题“扫雷大作战,挑战你的智慧极限!”二、活动目的1. 提供一个娱乐和放松的活动,让参与者在游戏中享受乐趣。
2. 锻炼参与者的思维能力、逻辑推理和注意力。
3. 促进团队合作和社交互动,增强参与者之间的交流与沟通。
三、活动时间和地点1. 时间:[具体日期]2. 地点:[详细地址]四、参与人员1. 个人赛:欢迎所有对扫雷游戏感兴趣的个人参加。
2. 团队赛:以团队为单位报名,每队人数为[具体人数]。
五、活动内容1. 个人赛参与者在规定时间内尽可能地找出所有地雷。
系统会根据完成时间和找出的地雷数量进行排名。
2. 团队赛团队成员通过合作,共同找出所有地雷。
可以设置一些团队任务,如在规定时间内完成游戏或找出特定数量的地雷等。
团队的成绩将根据完成时间和团队成员找出的地雷数量综合计算。
六、活动规则1. 游戏区域大小为[具体大小]。
2. 地雷分布在游戏区域中,参与者需要通过方块来判断是否有地雷。
3. 到地雷则游戏结束,未到地雷则显示周围数字,数字表示周围 8 个方块中地雷的数量。
4. 参与者可以通过推理和猜测来找出地雷,但不能误触地雷。
5. 个人赛和团队赛分别设立一、二、三等奖,根据比赛成绩颁发奖品。
七、活动流程1. 活动开场主持人介绍活动背景、目的和规则。
宣布活动开始。
2. 比赛环节个人赛和团队赛同时进行,根据比赛时间和成绩进行排名。
期间可以设置休息时间,让参与者放松调整。
3. 颁奖环节根据比赛排名,颁发一、二、三等奖。
主持人宣布活动结束。
八、注意事项1. 参与者需遵守活动规则,不得使用任何外部工具或作弊行为。
2. 组织者需确保游戏区域的安全,避免参与者发生意外。
3. 活动期间,工作人员要维护好现场秩序,确保活动的顺利进行。
九、活动预算1. 奖品费用:[具体金额]2. 道具费用:[具体金额]3. 其他费用:[具体金额]十、活动宣传1. 在社交媒体平台上发布活动信息,吸引更多人参与。
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语言基础知识和扫雷游戏算法原理,使学生在短时间内掌握课程重点。
课时:1课时年级:大学教学目标:1. 通过扫雷体育游戏,锻炼学生的反应速度和团队协作能力。
2. 培养学生面对挑战时的勇气和信心。
3. 提高学生的沟通能力和策略思维能力。
教学重点:1. 扫雷游戏规则的讲解与示范。
2. 团队协作在游戏中的应用。
教学难点:1. 学生在游戏中的策略运用。
2. 学生在游戏过程中的心理调节。
教学准备:1. 扫雷游戏道具(如:雷区地图、手雷、雷区指示牌等)。
2. 游戏场地布置。
3. 背景音乐。
教学过程:一、导入1. 教师简要介绍扫雷游戏的历史背景和规则。
2. 学生自由讨论,分享自己对扫雷游戏的了解和看法。
二、游戏规则讲解1. 教师详细讲解扫雷游戏的基本规则,包括雷区地图、手雷、雷区指示牌等。
2. 学生提问,教师解答。
三、游戏示范1. 教师示范如何进行扫雷游戏,包括寻找雷区、排除雷区、躲避雷区等。
2. 学生观看,了解游戏过程。
四、分组与比赛1. 学生分成若干小组,每组人数不限。
2. 各小组进行扫雷游戏比赛,时间限定为15分钟。
3. 教师监督比赛过程,确保游戏公平、公正。
五、游戏分析与总结1. 教师邀请各小组代表分享游戏过程中的经验和教训。
2. 学生讨论如何提高团队协作能力和策略思维能力。
3. 教师总结游戏过程中的亮点和不足,强调团队协作的重要性。
六、课后作业1. 学生撰写一篇关于扫雷游戏的心得体会。
2. 学生与同学交流游戏过程中的收获和感悟。
教学评价:1. 观察学生在游戏过程中的表现,如团队协作、策略运用、心理调节等。
2. 评价学生课后作业的质量,如心得体会的深度和广度。
教学反思:1. 教师根据学生在游戏过程中的表现,调整教学策略,提高教学质量。
2. 教师关注学生在游戏过程中的心理需求,提供适当的指导和支持。
课程设计报告课程名称:面向对象程序设计C++设计题目:扫雷小游戏专业:计算机科学与技术姓名:学号:指导教师:李晓虹2016 年 1 月 6日目录一、系统需求分析 (3)1.1功能需求分析 (3)1.2 运行环境需求 (3)1.3硬件需求 (3)1.4基本素材需求 (4)二、总体设计 (4)三、详细设计 (5)3.1 具体要求如下: (5)3.2游戏流程 (6)四、系统调试 (9)五、结果分析 (9)六、总结 (9)一、系统需求分析随着现在生活节奏的加快,人们在工作学习之余需要一个轻松娱乐的放松环境。
因此我编写此软件的目的,一方面作为初学者来了解C++环境下的小程序开发,另一方面使用户能在娱乐休闲的同时拓展思维能力。
1.1功能需求分析1.2 运行环境需求基本操作系统:win7,win XP1.3硬件需求a.处理器型号:奔腾III及同等型号以上处理器b.内存容量:512MB以上内存(可运行数据库管理系统)c.外存容量:5G以上硬盘空间d.联机或脱机:脱机e.输入及输出设备的型号和数量:鼠标、彩色显示器1.4基本素材需求二、总体设计扫雷是单人计算机游戏。
游戏的用户界面由小方格组成的战场构成。
当游戏开始时,计算机将固定的地雷数随机的放到战场的方格。
此游戏还允许玩家指定战场中的地雷数。
参考Windows 操作系统提供的扫雷游戏,改进扫雷游戏程序,增加以下功能:在主界面中添加一个菜单栏,菜单栏中包括游戏和帮助两个菜单,其中游戏菜单中设置初级、中级、高级、自定义、声音、扫雷英雄榜这几个菜单项,帮助菜单中设置游戏规则和制作人员两个菜单项。
背景说明:a.软件名称:扫雷b.用户:所有扫雷游戏爱好者三、详细设计3.1 具体要求如下:(1)扫雷游戏分为初级、中级和高级三个级别。
单击游戏菜单可以选择“初级”、“中级”和“高级”。
三个等级的区别在于,其雷的总数不一样,分别为40、80、120个雷,在相同数目的格子中,雷的数目愈多,其难度自然就愈大。
(2)选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击‘“开始”便启动计时器。
(3)用户要揭开某个方块,可左键单击它。
若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
(5)当用户点中雷时,将有提示出现,胜利时,也有提示出现。
游戏的基本步骤为:开始:按左键开始游戏,单击表情按钮或菜单重新开始;左键:按下时,是雷则结束,非雷则显示数字;数字:表示此数字周围一圈八个格子中雷的数目;右键:奇数次按下,则用小红旗标记,表示此处是雷;偶数次按下,表示对上次的否定;结束:左键单击到雷则结束,标记出所有的雷则结束;3.2游戏流程运行截图游戏开始时截图,点击游戏菜单下的“开始”可以运行,或者点击开始。
右边有计时器, 左边是分数。
开始游戏选择游戏难易程度中级低级高级游戏是否胜利失败胜利游戏结束这是游戏中途的截图这是游戏失败的截图四、系统调试在编写程序时,不免会出现这样那样的错误,这时需要我们从各个方向来解决。
在调试这个游戏时,遇到一些语法和逻辑方面的问题。
但是都得到了解决。
五、结果分析能够顺利地运行程序六、总结1.通过设计实验,能综合运用了所学知识,编程解决实际问题,是所学知识掌握得更系统扎实。
2.现自己的知识的欠缺和能力的不足,使我们能够了解自己的不足,能及时补救,使自己得到不断完善。
3.通过设计实验,对所学知识有了更深的理解,了解所学知识在实际生活中的运用。
4.通过这次设计的总结,我会在以后的学习中增强自己理论与实践相结合的能力。
附件:部分程序源代码:DlgCustom.cpp:#include "stdafx.h"#include "mine.h"#include "DlgHero.h"#include "MineWnd.h"#include "MineDefs.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// CDlgHero::CDlgHero(CWnd* pParent /*=NULL*/) : CDialog(CDlgHero::IDD, pParent){//{{AFX_DATA_INIT(CDlgHero)m_szBHolder = _T("");m_szEHolder = _T("");m_szBRecord = _T("");m_szERecord = _T("");m_szIHolder = _T("");m_szIRecord = _T("");//}}AFX_DATA_INIT}void CDlgHero::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CDlgHero)DDX_Text(pDX, IDC_B_H, m_szBHolder);DDX_Text(pDX, IDC_E_H, m_szEHolder);DDX_Text(pDX, IDC_B_R, m_szBRecord);DDX_Text(pDX, IDC_E_R, m_szERecord);DDX_Text(pDX, IDC_I_H, m_szIHolder);DDX_Text(pDX, IDC_I_R, m_szIRecord);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CDlgHero, CDialog)//{{AFX_MSG_MAP(CDlgHero)ON_BN_CLICKED(IDC_RESET, OnReset)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////void CDlgHero::SetBHolder(CString holder){m_szBHolder = holder;}void CDlgHero::SetBRecord(UINT record){m_szBRecord.Format("%d秒", record);}void CDlgHero::SetIHolder(CString holder){m_szIHolder = holder;}void CDlgHero::SetIRecord(UINT record){m_szIRecord.Format("%d秒", record);}void CDlgHero::SetEHolder(CString holder){m_szEHolder = holder;}void CDlgHero::SetERecord(UINT record){m_szERecord.Format("%d秒", record);}void CDlgHero::OnReset(){CMineWnd *pMine = (CMineWnd*)AfxGetMainWnd();pMine->ResetRecord();m_szBHolder = DEFAULT_HOLDER;m_szBRecord.Format("%d秒", DEFAULT_RECORD);m_szIHolder = DEFAULT_HOLDER;m_szIRecord.Format("%d秒", DEFAULT_RECORD);m_szEHolder = DEFAULT_HOLDER;m_szERecord.Format("%d秒", DEFAULT_RECORD);UpdateData(FALSE);}DlgCustom.cpp#include "stdafx.h"#include "mine.h"#include "DlgCustom.h"#include "MineWnd.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CDlgCustom dialogCDlgCustom::CDlgCustom(CWnd* pParent /*=NULL*/) : CDialog(CDlgCustom::IDD, pParent){//{{AFX_DATA_INIT(CDlgCustom)m_uHeight = 0;m_uNumber = 0;m_uWidth = 0;//}}AFX_DATA_INIT}void CDlgCustom::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CDlgCustom)DDX_Text(pDX, IDC_HEIGHT, m_uHeight);DDX_Text(pDX, IDC_NUMBER, m_uNumber);DDX_Text(pDX, IDC_WIDTH, m_uWidth);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CDlgCustom, CDialog) //{{AFX_MSG_MAP(CDlgCustom)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////void CDlgCustom::OnOK(){UpdateData();if (m_uWidth < 9) m_uWidth = 9;if (m_uWidth > 30) m_uWidth = 30;if (m_uHeight < 9) m_uHeight = 9;if (m_uHeight > 24) m_uHeight = 24;if (m_uNumber < 10) m_uNumber = 10;if (m_uNumber > m_uWidth * m_uHeight) m_uNumber = m_uWidth * m_uHeight - 1;CMineWnd *pMine = (CMineWnd*)AfxGetMainWnd();pMine->SetCustom(m_uWidth, m_uHeight, m_uNumber);CDialog::OnOK();}void CDlgCustom::InitData(UINT xNum, UINT yNum, UINT mNum){m_uWidth = xNum;m_uHeight = yNum;m_uNumber = mNum;}DlgNewRecord.cpp#include "stdafx.h"#include "mine.h"#include "DlgNewRecord.h"#include "MineDefs.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////CDlgNewRecord::CDlgNewRecord(CWnd* pParent /*=NULL*/): CDialog(CDlgNewRecord::IDD, pParent){//{{AFX_DATA_INIT(CDlgNewRecord)m_szName = _T("匿名");m_szDesc = _T("");//}}AFX_DATA_INIT}void CDlgNewRecord::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CDlgNewRecord)DDX_Text(pDX, IDC_EDIT_NAME, m_szName);DDX_Text(pDX, IDC_DESCRIBE, m_szDesc);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CDlgNewRecord, CDialog)//{{AFX_MSG_MAP(CDlgNewRecord)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////void CDlgNewRecord::SetLevel(UINT level){CString szLevel;if (level == LEVEL_PRIMARY) szLevel = "初级";else if (level == LEVEL_SECONDRY) szLevel = "中级";else if (level == LEVEL_ADV ANCE) szLevel = "高级";m_szDesc.Format("已破%s记录\n\r请留尊姓大名", szLevel); }CString CDlgNewRecord::GetName(){return m_szName;}Mine.cpp#include "stdafx.h"#include "Mine.h"#include "MineDefs.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////BEGIN_MESSAGE_MAP(CMineApp, CWinApp)//{{AFX_MSG_MAP(CMineApp)//}}AFX_MSGEND_MESSAGE_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 = 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);// register the minewnd class//注册窗口if (!AfxRegisterClass(&wc)){AfxMessageBox("注册类失败!");return FALSE;}// get the minewnd coordinates, width and heightUINT 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 = 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_pMainWnd = m_pMineWnd;//显示窗口m_pMineWnd->ShowWindow(SW_NORMAL);return TRUE;}int CMineApp::ExitInstance(){delete m_pMineWnd;return CWinApp::ExitInstance();}Mines.cpp#include "stdafx.h"#include "Mine.h"#include "MineDefs.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////BEGIN_MESSAGE_MAP(CMineApp, CWinApp)//{{AFX_MSG_MAP(CMineApp)//}}AFX_MSGEND_MESSAGE_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 = 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);// register the minewnd class//注册窗口if (!AfxRegisterClass(&wc)){AfxMessageBox("注册类失败!");return FALSE;}// get the minewnd coordinates, width and heightUINT 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 = 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_pMainWnd = m_pMineWnd;//显示窗口m_pMineWnd->ShowWindow(SW_NORMAL);return TRUE;}int CMineApp::ExitInstance(){AfxMessageBox("A");delete m_pMineWnd;return CWinApp::ExitInstance();}MineWnds.cpp#include "stdafx.h"#include "Mine.h"#include "MineWnd.h"#include "MineDefs.h"#include "Mmsystem.h"#include "DlgNewRecord.h"#include "DlgHero.h"#include "DlgCustom.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifextern CMineApp theApp;#define ID_TIMER_EVENT WM_USER + 1/////////////////////////////////////////////////////////////////////////////CMineWnd::CMineWnd(){m_pSndDead = NULL;m_pSndVictory = NULL;m_pSndClock = NULL;m_uTimer = 0;m_brsBG.CreateSolidBrush(COLOR_GRAY);LoadConfig();if (m_bSoundful) LoadWaveSrc();InitGame();}CMineWnd::~CMineWnd(){FreeMines();FreeWaveSrc();SaveConfig();}BEGIN_MESSAGE_MAP(CMineWnd, CWnd)//{{AFX_MSG_MAP(CMineWnd)ON_WM_PAINT()ON_WM_SHOWWINDOW()ON_WM_TIMER()ON_WM_LBUTTONUP()ON_WM_RBUTTONUP()ON_WM_LBUTTONDOWN()ON_WM_RBUTTONDOWN()ON_WM_MOUSEMOVE()ON_COMMAND(IDM_START, OnMemuStart)ON_COMMAND(IDM_PRIMARY, OnMemuPrimary) ON_COMMAND(IDM_SECOND, OnMemuSecond)ON_COMMAND(IDM_ADV ANCE, OnMemuAdvance) ON_COMMAND(IDM_CUSTOM, OnMemuCustom) ON_COMMAND(IDM_MARK, OnMemuMark)ON_COMMAND(IDM_COLOR, OnMemuColor)ON_COMMAND(IDM_SOUND, OnMemuSound)ON_COMMAND(IDM_EXIT, OnMemuExit)ON_COMMAND(IDM_HELP_LIST, OnMemuHelpList) ON_COMMAND(IDM_HELP_FIND, OnMemuHelpFind) ON_COMMAND(IDM_HELP_USE, OnMemuHelpUse) ON_COMMAND(IDM_ABOUT, OnMemuAbout)ON_WM_KEYDOWN()ON_WM_INITMENU()ON_WM_CLOSE()ON_COMMAND(IDM_HERO, OnMemuHero)ON_COMMAND(IDM_CHEAT, OnMemuCheat)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////////载入配置//void CMineWnd::LoadConfig(){//----------获取本地目录-------------*/char exeFullPath[MAX_PA TH];CString strPath;GetModuleFileName(NULL, exeFullPath, MAX_PATH);strPath = CString(exeFullPath);strPath = strPath.Left(strPath.ReverseFind('\\'));//-----------------------------------*/strPath += "\\config.ini";char strPrimary[80];char strSecond[80];char strAdvance[80];m_uXNum = GetPrivateProfileInt("WINDOW","XNum", 10,strPath);m_uYNum = GetPrivateProfileInt("WINDOW","YNum", 10,strPath);m_uMineNum = GetPrivateProfileInt("MINE","MineNum", 10,strPath);m_uLevel = GetPrivateProfileInt("MINE","Level", 0,strPath);m_uPrimary = GetPrivateProfileInt("SCORE","Primary", 999,strPath);m_uSecond = GetPrivateProfileInt("SCORE","Second", 999,strPath);m_uAdvance = GetPrivateProfileInt("SCORE","Advance", 999,strPath);GetPrivateProfileString("HOLDER","PrimaryHolder", "匿名",strPrimary,80,strPath);GetPrivateProfileString("HOLDER","SecondHolder", "匿名",strSecond,80,strPath);GetPrivateProfileString("HOLDER","AdvanceHolder", "匿名",strAdvance,80,strPath);m_szPrimary = strPrimary;m_szSecond = strSecond;m_szAdvance = strAdvance;m_bMarkful = GetPrivateProfileInt("CONFIG","Markful", 0,strPath);m_bColorful = GetPrivateProfileInt("CONFIG","Colorful", 1,strPath);m_bSoundful = GetPrivateProfileInt("CONFIG","Soundful", 1,strPath);}//// 保存//void CMineWnd::SaveConfig(){//----------获取本地目录-------------*/char exeFullPath[MAX_PA TH];CString strPath;GetModuleFileName(NULL, exeFullPath, MAX_PATH);strPath = CString(exeFullPath);strPath = strPath.Left(strPath.ReverseFind('\\'));//-----------------------------------*/strPath += "\\config.ini";//雷区行列数CString strXNum,strYNum;//雷数选择级别CString strMineNum,strLevel;//记录保持分数CString strPrimary,strSecond,strAdvance;//记录保持者CString strPrimaryHolder,strSecondHolder,strAdvanceHolder;//其他配置CString strMarkful,strColorful,strSoundful;strXNum.Format("%u",m_uXNum);strYNum.Format("%u",m_uYNum);strMineNum.Format("%u",m_uMineNum);strLevel.Format("%u",m_uLevel);strPrimary.Format("%u",m_uPrimary);strSecond.Format("%u",m_uSecond);strAdvance.Format("%u",m_uAdvance);strPrimaryHolder.Format("%s",m_szPrimary);strSecondHolder.Format("%s",m_szSecond);strAdvanceHolder.Format("%s",m_szAdvance);strMarkful.Format("%d",m_bMarkful);strColorful.Format("%d",m_bColorful);strSoundful.Format("%d",m_bSoundful);WritePrivateProfileString("WINDOW","XNum", strXNum,strPath);WritePrivateProfileString("WINDOW","YNum", strYNum,strPath);WritePrivateProfileString("MINE","MineNum", strMineNum,strPath);WritePrivateProfileString("MINE","Level", strLevel,strPath);WritePrivateProfileString("SCORE","Primary", strPrimary,strPath);WritePrivateProfileString("SCORE","Second", strSecond,strPath);WritePrivateProfileString("SCORE","Advance", strAdvance,strPath);WritePrivateProfileString("HOLDER","PrimaryHolder", strPrimaryHolder,strPath);WritePrivateProfileString("HOLDER","SecondHolder", strSecondHolder,strPath);WritePrivateProfileString("HOLDER","AdvanceHolder", strAdvanceHolder,strPath);WritePrivateProfileString("CONFIG","Markful", strMarkful,strPath);WritePrivateProfileString("CONFIG","Colorful", strColorful,strPath);WritePrivateProfileString("CONFIG","Soundful", strSoundful,strPath);}////载入位图//void CMineWnd::LoadBitmap(){if (m_bColorful){m_clrDark = COLOR_DARK_GRAY;m_bmpMine.DeleteObject();m_bmpMine.LoadBitmap(IDB_MINE_COLOR);m_bmpNumber.DeleteObject();m_bmpNumber.LoadBitmap(IDB_NUM_COLOR);m_bmpButton.DeleteObject();m_bmpButton.LoadBitmap(IDB_BTN_COLOR);}else{m_clrDark = COLOR_BLACK;m_bmpMine.DeleteObject();m_bmpMine.LoadBitmap(IDB_MINE_GRAY);m_bmpNumber.DeleteObject();m_bmpNumber.LoadBitmap(IDB_NUM_GRAY);m_bmpButton.DeleteObject();m_bmpButton.LoadBitmap(IDB_BTN_GRAY);}}//// 游戏的初始化//void CMineWnd::InitGame(){//位图的初始化LoadBitmap();m_nLeaveNum = m_uMineNum;m_uSpendTime = 0;m_uBtnState = BUTTON_NORMAL;m_uGameState = GS_W AIT;if (m_uTimer){KillTimer(ID_TIMER_EVENT);m_uTimer = 0;}m_pNewMine = NULL;m_pOldMine = NULL;FreeMines();//初始化地图for (UINT i = 0; i<m_uYNum; i++){for (UINT j = 0; j<m_uXNum; j++){m_pMines[i][j].uRow = i;m_pMines[i][j].uCol = j;m_pMines[i][j].uState = STA TE_NORMAL;m_pMines[i][j].uAttrib = ATTRIB_EMPTY;m_pMines[i][j].uOldState = STA TE_NORMAL;}}}//// 布雷//void CMineWnd::LayMines(UINT row, UINT col){//埋下随机种子srand( (unsigned)time( NULL ) );UINT i, j;for(UINT index = 0; index < m_uMineNum;){//取随即数i = rand() % m_uYNum;j = rand() % m_uXNum;if (i == row && j == col) continue;if(m_pMines[i][j].uAttrib != ATTRIB_MINE){m_pMines[i][j].uAttrib = ATTRIB_MINE;//修改属性为雷index++;}}}////雷方块拓展(对于周围无雷的空白区域)//void CMineWnd::ExpandMines(UINT row, UINT col){UINT i, j;UINT minRow = (row == 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col == 0) ? 0 : col - 1;UINT maxCol = col + 2;UINT around = GetAroundNum(row, col);m_pMines[row][col].uState = 15 - around;m_pMines[row][col].uOldState = 15 - around;// “打开”该区域,重绘DrawSpecialMine(row, col);//对周围一个雷都没有的空白区域if (around == 0){for (i = minRow; i < maxRow; i++){for (j = minCol; j < maxCol; j++){//对于周围可以拓展的区域进行的规拓展if (!(i == row && j == col) &&m_pMines[i][j].uState == STATE_NORMAL&& m_pMines[i][j].uAttrib != ATTRIB_MINE){if (!IsInMineArea(i, j)) continue;ExpandMines(i, j);}}}}}//// 获取某个小方块区域相邻8个区域的雷个数//UINT CMineWnd::GetAroundNum(UINT row, UINT col){UINT i, j;UINT around = 0;UINT minRow = (row == 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col == 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i < maxRow; i++){for (j = minCol; j < maxCol; j++){if (!IsInMineArea(i, j)) continue;if (m_pMines[i][j].uAttrib == ATTRIB_MINE) around++;}}return around;}//// 获取某个小方块区域相邻8个区域的已标志状态数//UINT CMineWnd::GetAroundFlags(UINT row, UINT col){UINT i, j;UINT flags = 0;UINT minRow = (row == 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col == 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i < maxRow; i++){for (j = minCol; j < maxCol; j++){if (!IsInMineArea(i, j)) continue;if (m_pMines[i][j].uState == STATE_FLAG) flags++;}}return flags;}////判断是否为雷//BOOL CMineWnd::IsMine(UINT row, UINT col){return (m_pMines[row][col].uAttrib == ATTRIB_MINE);}//判断是否在雷区域BOOL CMineWnd::IsInMineArea(UINT row, UINT col){return (row >= 0 && row < m_uYNum && col >= 0 && col < m_uXNum); }//// 失败处理//void CMineWnd::Dead(UINT row, UINT col){//按钮所在的区域CRect rcBtn(m_uBtnRect[1], 15, m_uBtnRect[2], 39);//雷区所在的区域CRect rcMineArea(MINE_AREA_LEFT, MINE_AREA_TOP,MINE_AREA_LEFT + m_uXNum * MINE_WIDTH,MINE_AREA_TOP + m_uYNum * MINE_HEIGHT);UINT i, j;if (m_pMines[row][col].uAttrib == ATTRIB_MINE){//失败--点中雷for (i = 0; i < m_uYNum; i++){for (j = 0; j < m_uXNum; j++){m_pMines[row][col].uState = STA TE_BLAST;m_pMines[row][col].uOldState = STA TE_BLAST;if (m_pMines[i][j].uAttrib == A TTRIB_MINE&& m_pMines[i][j].uState != STA TE_FLAG) {m_pMines[i][j].uState = STA TE_MINE;m_pMines[i][j].uOldState = STA TE_MINE;}}}}else {//失败--错误雷for (i = 0; i < m_uYNum; i++){for (j = 0; j < m_uXNum; j++){m_pMines[row][col].uState = STA TE_ERROR;m_pMines[row][col].uOldState = STA TE_ERROR;if (m_pMines[i][j].uAttrib == ATTRIB_MINE&& m_pMines[i][j].uState != STA TE_FLAG) {m_pMines[i][j].uState = STA TE_MINE;m_pMines[i][j].uOldState = STA TE_MINE;}}}}//失败处理InvalidateRect(rcMineArea);m_uBtnState = BUTTON_DEAD;InvalidateRect(rcBtn);m_uGameState = GS_DEAD;if (m_uTimer != 0){//将定时器去激活KillTimer(ID_TIMER_EVENT);m_uTimer = 0;if (m_bSoundful){//失败声音播放sndPlaySound((LPCTSTR)LockResource(m_pSndDead), SND_MEMORY | SND_ASYNC | SND_NODEFAULT);}}//// 胜利判断并处理//BOOL CMineWnd::Victory(){UINT i, j;CRect rcBtn(m_uBtnRect[1], 15, m_uBtnRect[2], 39);// 检测是否胜利for (i = 0; i < m_uYNum; i++){for (j = 0; j < m_uXNum; j++){if (m_pMines[i][j].uState == STATE_NORMAL) return FALSE;if (m_pMines[i][j].uState == STATE_DICEY) return FALSE;}}//胜利则作胜利处理m_uBtnState = BUTTON_VICTORY;m_uGameState = GS_VICTORY;Invalidate();if (m_uTimer != 0){//将定时器去激活KillTimer(ID_TIMER_EVENT);m_uTimer = 0;}//胜利声音if (m_bSoundful){sndPlaySound((LPCTSTR)LockResource(m_pSndVictory),SND_MEMORY | SND_ASYNC | SND_NODEFAULT);}//英雄榜UINT uRecord;if (m_uLevel == LEVEL_PRIMARY) uRecord = m_uPrimary;else if (m_uLevel == LEVEL_SECONDRY) uRecord = m_uSecond;else if (m_uLevel == LEVEL_ADV ANCE) uRecord = m_uAdvance;if (uRecord > m_uSpendTime){CDlgNewRecord dlg;dlg.SetLevel(m_uLevel);dlg.DoModal();switch(m_uLevel){case LEVEL_PRIMARY:m_uPrimary = m_uSpendTime;m_szPrimary = dlg.GetName();break;case LEVEL_SECONDRY:m_uSecond = m_uSpendTime;m_szSecond = dlg.GetName();break;case LEVEL_ADV ANCE:m_uAdvance = m_uSpendTime;m_szAdvance = dlg.GetName();break;case LEVEL_CUSTOM:return TRUE;default:break;}OnMemuHero();}return TRUE;}//// 鼠标右键,根据原先不同的标记作状态循环修改// 以便用户可以修改其原先标志//void CMineWnd::OnLRBtnDown(UINT row, UINT col){UINT i, j;UINT minRow = (row == 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col == 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i < maxRow; i++){for (j = minCol; j < maxCol; j++){if (!IsInMineArea(i, j)) continue;// if (i == row && j == col) continue;if (m_pMines[i][j].uState == STATE_NORMAL){m_pMines[i][j].uState = STA TE_EMPTY;}else if (m_pMines[i][j].uState == STA TE_DICEY){m_pMines[i][j].uState = STA TE_DICEY_DOWN;}}}}void CMineWnd::OnLRBtnUp(UINT row, UINT col){UINT i, j;UINT minRow = (row == 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col == 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i < maxRow; i++){for (j = minCol; j < maxCol; j++){if (!IsInMineArea(i, j)) continue;// if (i == row && j == col) continue;if (m_pMines[i][j].uOldState == STATE_NORMAL){m_pMines[i][j].uState = STA TE_NORMAL;}else if (m_pMines[i][j].uOldState == STA TE_DICEY){m_pMines[i][j].uState = STA TE_DICEY;}}}// Invalidate();}//展开拓展周围8个方向void CMineWnd::OpenAround(UINT row, UINT col){//如果周围相邻的标志雷数!= 周围相邻的雷数则返回if (GetAroundFlags(row, col) != GetAroundNum(row, col)) return;UINT i, j;UINT around = 0;UINT minRow = (row == 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col == 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i < maxRow; i++){for (j = minCol; j < maxCol; j++){if (!IsInMineArea(i, j)) continue;if (m_pMines[i][j].uState == STATE_NORMAL){//如果该区域为正常区域//拓展该雷区ExpandMines(i, j);around = GetAroundNum(i, j);m_pMines[i][j].uState = 15 - around;m_pMines[i][j].uOldState = 15 - around;}}}// 判断是否胜利,是则将地图中所有雷标识出来if (Victory()){for (i = 0; i < m_uYNum; i++){for (j = 0; j < m_uXNum; j++){if (m_pMines[i][j].uAttrib == ATTRIB_MINE){m_pMines[i][j].uState = STA TE_FLAG;m_pMines[i][j].uOldState = STA TE_FLAG;}}}m_nLeaveNum = 0;Invalidate();}}BOOL CMineWnd::ErrorAroundFlag(UINT row, UINT col){//如果周围相邻的标志雷数!= 周围相邻的雷数则返回if (GetAroundFlags(row, col) != GetAroundNum(row, col)) return FALSE;UINT i, j;UINT minRow = (row == 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col == 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i < maxRow; i++){for (j = minCol; j < maxCol; j++){if (!IsInMineArea(i, j)) continue;if (m_pMines[i][j].uState == STATE_FLAG){if (m_pMines[i][j].uAttrib != ATTRIB_MINE){Dead(i, j);return TRUE;}}}}return FALSE;}void CMineWnd::OpenByCheat(){UINT i, j;for (i = 0; i < m_uYNum; i++){for (j = 0; j < m_uXNum; j++){if (m_pMines[i][j].uState == STATE_FLAG) continue;OpenAround(i, j);}}}void CMineWnd::FreeMines(){// if (m_pMines) {// delete[] m_pMines;// m_pMines = NULL;// }// for (UINT row = 0; row<m_uYNum; row++) {// if (m_pMines[row]) {// delete []m_pMines[m_uXNum];// delete m_pMines[row];// }// }}void CMineWnd::SizeWindow( void ){UINT uWidth = DEFAULT_FRAME_X + m_uXNum * MINE_WIDTH +LINE_WIDTH_0 * 3 + SIDE_WIDTH_0 + SIDE_WIDTH_1;UINT uHeight = DEFAULT_FRAME_Y + m_uYNum * MINE_HEIGHT +LINE_WIDTH_0 * 3 + SIDE_WIDTH_0 * 2 + SIDE_WIDTH_1 + SHELL_S_H;SetWindowPos(&wndTopMost, 0, 0, uWidth, uHeight,SWP_NOZORDER | SWP_NOMOVE | SWP_NOCOPYBITS); //SWP_NOCOPYBITS does not do function???GetClientRect(&m_rcClient);// Button Positionm_uBtnRect[0] = m_rcClient.right / 2 - 12; // the left side of the start(state) button without 3d borderm_uBtnRect[1] = m_rcClient.right / 2 - 13; // the left side of the start(state) button with 3d borderm_uBtnRect[2] = m_rcClient.right / 2 + 12; // the right side of the start(state) button// Number Positionm_uNumRect[0] = m_rcClient.right - 55; // the left side of the spend time rect with 3d borderm_uNumRect[1] = m_rcClient.right - 15; // the right side of the spend time。