windows程序设计之扫雷游戏经典之作

合集下载

Windows扫雷游戏

Windows扫雷游戏

上图中,光标停在 srand ,它是VC中指定随机种子的函数,下面rand是使用这个种子生成随机数的
函数。我们使用右键弹出的菜单 Find references to 中的 Selected address 功能查找看看谁在使用srand
函数。
我们先看看srand函数,找到如下的程序段:
指向已经读取到给定缓冲区的字节数,如果 lpNumberOfBytesRead 为 NULL,将会忽略这个参数。
Return Value
If the function succeeds, the return value is nonzero.
成功返回非零值。
If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError.
.if hSweep ==0
invoke wsprintf,addr szBuffer,CTXT("请启动‘扫雷游戏’")
invoke lstrcat,addr szBuffer,addr szCr
invoke StdOut,offset szBuffer
Windows扫雷游戏
-
Windows自带了一个扫雷游戏,很好玩。网上也有很多介绍作弊的方法,之前的Win98中,纪录保存在
INI文件中,XP的保存在注册表中。但是,这些方法对于我们程序员来说“太没有技术含量”了,我们要通过
编程序来“作弊”。网上也有很多“扫雷机”,今天我们就从头开始打造一个自己的扫雷机。
在这里我就不再重复了。下面就是编写读取“地雷分布”。读取内存要用到如下的API:

大学本科计算机专业扫雷游戏设计毕业设计

大学本科计算机专业扫雷游戏设计毕业设计
通过研究Windows操作系统自带的扫雷游戏,我们可以发现在这个游戏中主要有以下两个关键的地方:
第一个是初始化问题,包括随机产生本局游戏中雷的总数,雷的分布对于每一个小区域如何获取周围地区分布的雷数等等。
第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应。
经过四年的大学学习,我对理论知识已经有了一定的了解与认知,本次的毕业设计便是将书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查,希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。本次毕业设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。
关键字:扫雷游戏,算法设计,事件,JAVA
Java version of Minesweeper design and implementation
Abstractቤተ መጻሕፍቲ ባይዱ
Minesweeper is a play of fairly simple popular small game, game winning conditions in the shortest period of time according to the number that appears click the grid to identify all non ray lattice, while avoiding stepped on a mine. With the progress of society, constantly improve people's pressure, the accelerating pace of life of people in the game, thedemand for constantly emerge in an endless stream, the game is also rising, and theMinesweeper still attract many people of all ages, of its own nature, determines the extent of people love it, do not need to special skills, do not need to constantly upgrade, also do not need too much time to familiar, simple but fun. The computer in the face of people for a long time will have a tired mood, and mine the game will not spend too much time at the same time, the game player to drive up thinking, to have multiple effects. The basic function of mine game: click the left mouse button in the unknown area, if the unknown area there is thunder, game stop, display all the mines. If there is no ray, is displayedaround the number of mine, if not around mine, then check whether there is thunderaround the eight areas until there is thunder now and show, game player needs to find outall the minefield not mine the box as soon as possible, but not stepped on landmines. The main purpose of this design is to pass the Minesweeper to deepen their understanding of Java language learning, improve their level of programming.

计算机图形学课程设计——扫雷游戏程序设计

计算机图形学课程设计——扫雷游戏程序设计

计算机图形学课程设计——扫雷游戏程序设计《计算机图形学》课程设计报告VC++扫雷游戏的程序设计专业班级:小组成员:指导老师:日期:2012年12月24日1、需求分析本课程设计实现类似于Windows XP操作系统自带的扫雷游戏。

该设计以V isual C++ 6.0为开发环境, Windows 7/XP为程序运行平台。

在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体,采用了MFC机制解决问题的方法。

整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。

程序通过调试运行,实现简单的设计目标,满足扫雷游戏初学者的需要。

通过本课程设计,以便更好的巩固计算机图形学相关知识,掌握课程设计基本的方法和技巧,同时增加同学之间的团队合作精神以及培养分析问题、解决问题的能力。

2.总体设计2.1 功能概述扫雷游戏的游戏界面如图1所示。

在这个界面中,由众多面积均等的小方块所组成的区域称之为雷区,雷区的大小由用户设置的游戏等级决定。

图1游戏开始时,系统会在雷区中随机布下若干个地雷。

安放地雷的小方块称之为雷方块,其他的称之为非雷方块。

部署完毕后,系统会在其他非雷方块中填充一些数字。

某一个具体数字表示与其紧邻的8个方块中有多少雷方块。

玩家可以根据这些信息去判断是否可以鼠标点击方块,并把认为是地雷的方块打上标识。

当玩家将所有地雷找出后,其余的非雷方块区域都已打开,此时游戏结束。

在游戏过程中,一旦错误地打开了雷方块则立即失败,游戏结束。

游戏规则总结:●开始:按左键开始游戏,按按钮或菜单重新开始。

●左键:按下时,是雷则结束,非雷则显示数字。

●数字:代表此数字周围一圈八格中雷的个数。

●右键:奇次按下表示雷,偶数按下表示对上次的否定。

●结束:左键按到雷结束,找出全部雷结束。

在游戏开始后,雷区上方有两个计数器。

右边的计数器显示用户扫雷所花费的总时间,以秒为单位;左边的计数器显示当前还剩余多少个雷方块。

扫雷游戏的设计与实现

扫雷游戏的设计与实现

第37卷第2期2021年2月福建电脑Journal of F ujian ComputerVol.37 No.2Feb.2021扫雷游戏的设计与实现吕橙(北京建筑大学计算机系北京100044)摘要本文根据“自顶向下,逐步求精”的软件设计方法,针对windows自带的扫雷游戏进行了总体设计、详细设计,并 采用C语言在VS2019平台上利用Easyx图形库进行编程实现,游戏运行效果良好。

关键词 Easyx;visual studio2019;扫雷游戏中图法分类号 TP311.52 DOI:10.16707/ki.fjpc.2021.02.027Design and Implementation of Mine Sweeping GameLV Cheng(School of E lectrical and Information Engineering,Beijing University of Civil Engineering and Architecture,Beijing,China, 100044)1引言《扫雷》是一款大众类的益智小游戏,游戏于1992年发行,目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩 到一个雷即全盘皆输。

扫雷游戏容易上手,一方面是为了増强思维能力,提高智力,另一方面是为了训练用户的鼠标左右键操作能力,让这些动作变得非常自然,并培养鼠标移动的速度和准确性,扫雷游戏已在各个游戏平台均有应用。

张锦歌等人用Flash AS3制作了扫雷游戏[1]。

李 丽华等人以扫雷游戏为例,使用控件数组,讲解了 案例教学法在V B中的应用[2]。

俞亮用C#语言对扫雷游戏进行了系统设计与实现[3]。

徐驰按照自顶向下、逐步求精、模块化的结构化程序设计原则利用C语言实现了实现了扫雷游戏的开发[4]。

毛金玲基于Google公司提供的Android系统插件对扫雷游戏进行了总体设计[5]。

Python游戏毕设扫雷小游戏(两篇)2024

Python游戏毕设扫雷小游戏(两篇)2024

引言概述:游戏毕设扫雷小游戏(二)是基于编程语言开发的一款扫雷游戏,该游戏继承了经典扫雷游戏的规则和玩法,通过在雷区中插旗、揭开方块等操作,玩家需要尽量避免触雷,最终完成整个雷区的清扫。

本文将对该游戏的开发过程进行详细介绍。

正文内容:一、游戏界面设计1.绘制游戏窗口2.设计雷区并初始化雷的位置和数字3.添加按钮和标签元素4.界面美化和交互设计5.添加计时器和计分功能二、游戏逻辑与操作1.游戏初始化与设置2.插旗和揭开方块操作的实现3.处理雷块事件4.处理周围没有数字的方块的自动展开5.判断游戏结束条件与胜利条件三、计时器和计分功能1.设计计时器显示2.计时器的开始、暂停和重置功能实现3.计分功能的实现与更新4.增加难度级别和记录最高分四、游戏的难度设置1.设计三个难度级别的按钮2.不同难度下的雷区大小和雷数设置3.难度选择操作的实现4.难度选择对游戏界面的影响5.自定义难度的实现与限制五、游戏优化与完善1.代码优化和重构2.引入异常处理和错误提示3.添加音效和背景音乐4.支持暂存游戏进度和恢复功能5.增加游戏排行榜功能和网络对战模式总结:游戏毕设扫雷小游戏(二)是一款基于编程语言开发的经典扫雷游戏,通过游戏界面设计、游戏逻辑与操作、计时器和计分功能、游戏的难度设置以及游戏优化与完善等方面的实现,使得游戏具有较高的可玩性和娱乐性。

在开发过程中,我们将注重代码质量和性能优化,同时加入一些创新的功能和设计,以提升游戏的体验感和用户满意度。

希望通过本文的介绍,读者可以了解到该游戏的开发过程和关键点,以及如何使用来开发其他类型的游戏。

引言概述:Python游戏毕设扫雷小游戏是一款基于Python编程语言开发的经典游戏,通过玩家控制角色在地雷区中寻找并标记地雷的位置,以此来挑战游戏的机制和难度。

本文将详细介绍Python游戏毕设扫雷小游戏的设计和开发过程,包括游戏规则、游戏界面设计、游戏逻辑实现以及最终的测试和优化等方面。

项目11:Windows程序的功能设计——“扫雷”游戏.pdf

项目11:Windows程序的功能设计——“扫雷”游戏.pdf

项目11:Windows程序的功能设计——“扫雷”游戏一、教学内容及要求能力培养:1、理解基于Windows的应用程序的基本概念2、掌握Windows窗体和控件的常用属性。

3、掌握一些常用的Windows窗体控件的使用。

4、学会创建较为复杂的Windows应用程序。

核心技能点:1、Windows 窗体应用程序中窗体、控件、事件的基本概念。

2、Windows 窗体控件的共同特性。

3、常用的Windows 窗体控件。

扩展技能点:1、Windows窗体和控件的常用属性2、Windows窗体的设计和创建3、各种控件的综合应用教学内容:1、项目介绍。

任务1:“扫雷”游戏(5分钟)2、案例演示:程序流程任务2:讲解程序设计流程。

(15分钟)3、案例演示:主要功能实现任务3:讲解主要功能的实现方法。

(30分钟)4、课内实践:任务4:利用C#/WinForms编程,编写一个小游戏“扫雷”。

(130分钟)(1) 游戏功能和Window中的扫雷功能相同。

(2) 程序界面显示当前剩余地雷数和用时。

点击中间的按钮可以重新开始游戏。

(3) 左键点击每一个小方框,如果没有地雷,则显示其上下左右及对角线共8个小方框中的地雷数。

1代表上下左右及斜角合计有一颗雷,依次类推,2则有2颗,3则有3颗,如果其周围没有雷(0),则不显示,并将和其相临(上下左右及对角线共8个小方框)中地雷数为0的方框都显示出来。

如果该方框是地雷,则游戏结束,并显示所有雷的位置。

在确定是炸弹的方格上点右键出现一个旗子,表示你认为这是一个雷,上方显示的地雷数减1。

在有旗子的方框中再点击将出现问号,表示你不确定这里有没有炸弹。

再点击将取消标志。

(4) 在游戏菜单中,可以设置雷区的大小及地雷的数量。

(5) 具体功能,可以参考Windows的扫雷游戏二、教学重点、难点及解决办法教学重点:1、Windows 窗体控件的共同特性2、常用的Windows 窗体控件教学难点:1、Windows窗体的设计和创建2、各种控件的综合应用教学方法:基于CDIO的课程改革,应用了CDIO教育模式。

MFC课程设计-扫雷界面游戏

MFC课程设计-扫雷界面游戏

MFC课程设计-扫雷界面游戏Windows程序设计课程考核报告班级:学号:姓名:得分:1.设计目的及要求 (3)1.1设计目的及问题描述 (3)1.2设计要求 (3)1.3软件、硬件环境 (3)2.课程设计步骤 (4)3. 课程设计内容 (15)3.1 概要设计 (15)3.1.1 程序总体框架描述 (15)3.1.2程序常用类声明 (16)3.2主要技术 (17)3.3系统设计结果(界面截图、操作流程) (17)4.设计总结 (19)4.1遇到的问题及如何解决 (19)4.2体会 (19)5.源代码 (20)1.设计目的及要求1.1设计目的及问题描述利用VC++程序编写扫雷游戏,以检测自己一个学期对MFC学习的情况,以及了解自己在MFC学习中的不足,巩固和提高自己对MFC 的理解和掌握。

掌握C++编程和调试的基本技能,进一步提高自己的动手能力,和运用C++解决实际问题的能力。

本次我做的是一个简单的扫雷的游戏,包括计算雷数、时间和扫雷的规则制定。

1.2设计要求找出所有的非地雷的地方。

如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。

游戏规则:首先按右键开始,可以通过界面快捷键(如图笑脸),也可以通过菜单重新开始。

接着左键按下的数字周围一圈八格中雷的个数。

当确定小方框里面是一个雷,则用右键按下有一个小旗出现。

当发现此处不是一个雷时,就可以再次按下。

结束时只需要按标题栏的关闭键或菜单中的文件下的退出。

当踩到一个雷时,程序结束。

1.3软件、硬件环境软件:Windows 7操作系统,Microsoft Visual C++6.0硬件:Inter(R)Core(TM)*******************2.课程设计步骤(1)添加位图前十二幅是在雷区的,后四幅是按钮。

位图的ID号:按扭位图:30*30 IDB_ANNIU1、IDB_ANNIU 2、IDB_ANNIU3、IDB_ANNIU4雷区位图:14*14 ID号按下图依次为:IDB_BITMAP14。

扫雷游戏程序设计

扫雷游戏程序设计


sound1=java.applet.Applet.newAudioClip(file1 ); sound1.play();

4.记录成绩界面的布局进行调整,使界面开 起来简洁明了,方便操作;
代码为: setLayout(new GridLayout(3,1));//使用setLayout(布局对象)方法为容器 //设置布局为网格式(3*1)布局即3行1列 label=new JLabel("您现在是...高手,请输入您的大名:");


3.程序修改后,游戏开始能够播放背景音乐; 代码为: public void sound()throws Exception{ .URL file1=getClass().getResource("notify.wav"); AudioClip sound1=null;



6.Record.java Record类是JDialog对话框的子类,对用户扫雷成 功时,Record对象负责保存用户的成绩到文件。
7.ShowRecord.java ShowRecord类是JDialog对话框的子类,当用 户查看扫雷的最好成绩时,ShowRecord对 象负责提供读取文件数据的界面。
5. 扫雷胜利后(用时最少者),程序弹出保存成绩对话框。扫雷英雄 榜存储每个级别的最好成绩和玩家姓名。


Block.java BlockView.java LayMines.java
MineArea.java
MineGame.java Record.java ShowRecord.java
Zidingyi.java

如图:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WIN32模拟WINDOWS XP扫雷程序课程设计目的与要求:本课程设计是计算机科学与技术专业重要的实践性环节之一,是对本程学习后进行的一次全面而综合的练习。

本次课程设计的目的与任务主要有: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或其他兼容兼容系统四、题目分析:经过对游戏的初步分析,扫雷游戏含有如下规则:根据输入的信息,执行相应的挖雷,插旗,疑问标记,自动蔓延开挖等。

挖雷过程由计时器计时,由一个计数器统计插旗后雷的剩余个数。

如果选择了标记功能,那么单机右键会依次对未知点进行插旗,标记,取消插旗与标记。

如果点滴到插旗的如果点击到了未插旗子的雷区,如果是雷,则判定游戏失败,之后对雷区的点击进行屏蔽,不予响应。

如果是疑问标记则像正常区域对待。

如何判断胜利,如果所有的雷都被插旗或者点击后剩余的雷区,五、程序运行流程简介以及流程图:点击程序按默认参数进行初始化,输入,表情对鼠标左右键点击进行变化响应,对于雷区内点击进行规律响应,对雷区点击后果进行统计,判断失败与成功,失败或者成功之后,对于雷区内的输入也就是点击进行屏蔽,对菜单游戏级别、重新开始游戏按钮响应。

级别选择,重新游戏时时间归零、雷数显示刷新。

如此重复规则,直到点击退出。

程序简要流程图:六、函数实现:类:CMyWnd:(以公共方式继承自CFrameWnd类)主函数体,包含逻辑过程以及主要函数CMyHero:(以公共方式继承自CDialog类)吸取游戏数据比较后进行排名显示CMyRecrod:(以公共方式继承自CDialog类)询问是否对数据进行保存CSetYouself:(以公共方式继承自CDialog类)对游戏参数自己进行设置七、主要函数:以公共方式继承自CFrameWnd类的类CMyWnd:class CMyWnd : public CFrameWnd{Provide:int x;//记录左键落下与起来坐标是否一致int y;//记录左键落下与起来坐标是否一致int z;//记录前一个状态int Ch;//笑脸的状态int Color;//笑脸颜色int Tm;//时间int h;//时int m;//分int s;//秒int minenumber;//雷的个数int minenum;//当前雷的个数int minefir;//第一位int minesec;//第二位int minethi;//第三位int high;//雷区的宽度int wide;//雷区的高度int Fail;//是否失败,1为失败BOOL LeftButtondown;//1为按下去BOOL RightButtondown;//1为按下去public:CMyWnd();afx_msg void OnLButtonDown(UINT nFlags,CPoint point);//左右键起来落下afx_msg void OnLButtonUp(UINT nFlags,CPoint point);afx_msg void OnRButtonDown(UINT nFlags,CPoint point);afx_msg void OnRButtonUp(UINT nFlags,CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);//移动鼠标afx_msg void OnTimer(UINT nIDEvent);//计时afx_msg void OnPaint();afx_msg void OnStart();afx_msg void OnJunior();afx_msg void OnMiddle();afx_msg void OnHigher();afx_msg void OnSetYouself(int,int,int);afx_msg void OnSign();afx_msg void OnColor();afx_msg void OnSound();afx_msg void OnHero();afx_msg void OnExit();afx_msg void OnContent();afx_msg void OnTheme();afx_msg void OnHelp();afx_msg void OnAbout();void DrawMineMap(CPaintDC &dc);//布雷void DrawMineChild(CPaintDC &dc);//画小人void DrawMineFrame(CPaintDC &dc);//画边框void DrawTime(CPaintDC& dc);//画时间void ReStart(void);void TaxCount(void);//游戏默认值int Spread(int x,int y);int MakeRand();int FindEveryone();//找出每一个位置前一个状态int Success();//判断是否胜利,胜利返回1,BOOL Start;struct MINE;virtual ~CMyWnd();DECLARE_MESSAGE_MAP()};主要函数说明://扩展函数,如果是安全区,并且不是提示区,则向四周八个方向检查扩散int CMyWnd::Spread(int i,int j)//是安全区域则向四周扩散,改变当前值{int x=0;int y=0;for(x = i - 1 ; x <= i+1 ; x ++ )for(y = j - 1 ; y <=j+1 ; y ++ )//周围八个方向挨个检查{if(x>=0&&y>=0&&x<high&&y<wide&&(x!=i||y!=j)){if(g_MineFlags[x][y].oldsta==15&&g_MineFlags[x][y].newsta==0){g_MineFlags[x][y].newsta=g_MineFlags[x][y].oldsta;Spread(x,y);}else if(g_MineFlags[x][y].newsta!=1)g_MineFlags[x][y].newsta=g_MineFlags[x][y].oldsta;}}return 0;}//对鼠标左键点下的响应void CMyWnd::OnLButtonDown(UINT nFlags,CPoint point)//1.鼠标左键{CRect rcBtn(16*high/2-3,15,16*high/2+23, 41);if(rcBtn.PtInRect(point)){Ch=0;}if(point.x>=12&&point.x<=16*high+12&&point.y>=57&&point.y<=16*wide+57){int suc=Success();if(!suc&&!Fail){LeftButtondown=true;point.x-=12;point.y-=57;x=point.x/16;y=point.y/16;//记住左键先前状态,以便当点击位置不一进行还原z=g_MineFlags[point.x/16][point.y/16].newsta;//如果已经插旗则不必对左键落下进行反应if(g_MineFlags[point.x/16][point.y/16].newsta!=1&&g_MineFlags[point.x/16][poi nt.y/16].newsta!=2){//如果区域还未点开则对左键落下进行反应if(g_MineFlags[point.x/16][point.y/16].newsta==0){g_MineFlags[point.x/16][point.y/16].newsta=15;}Ch=3;}}}::InvalidateRect(this->m_hWnd,NULL,false);}//对鼠标左键点下的响应void CMyWnd::OnLButtonUp(UINT nFlags,CPoint point){CRect rcBtn(16*high/2-3,15,16*high/2+23, 41);if(rcBtn.PtInRect(point)){Ch=4;::InvalidateRect(this->m_hWnd,NULL,false);Tm=0;ReStart();}if(point.x>=12&&point.x<=16*high+12&&point.y>=57&&point.y<=16*wide+57) {if(LeftButtondown){LeftButtondown=false;Ch=4;if(!Start){Start=SetTimer(TIMEREVENT, 1000, NULL);}point.x-=12;point.y-=57;if(x!=point.x/16||y!=point.y/16){g_MineFlags[x][y].newsta=z;}if(g_MineFlags[point.x/16][point.y/16].newsta!=1)//如果没有被标记则处理{if(g_MineFlags[point.x/16][point.y/16].oldsta==5){for(int i=0;i<high;i++)for(int j=0;j<wide;j++){if(g_MineFlags[i][j].oldsta==5&&g_MineFlags[i][j].newsta!=1)g_MineFlags[i][j].newsta=5;if(g_MineFlags[i][j].oldsta!=5&&g_MineFlags[i][j].newsta==1)g_MineFlags[i][j].newsta=4;if(i==point.x/16&&j==point.y/16)g_MineFlags[i][j].newsta=3;}Fail=1;Ch=2;}else if(g_MineFlags[point.x/16][point.y/16].oldsta==15)//安全区,向四周扩散{g_MineFlags[point.x/16][point.y/16].newsta=g_MineFlags[point.x/16][point.y/16].oldsta;Spread(point.x/16,point.y/16);Ch=4;}else // 提示区,点开后直接显示{g_MineFlags[point.x/16][point.y/16].newsta=g_MineFlags[point.x/16][point.y/16].oldsta;Ch=4;}}}}int suc=Success();if(suc||Fail){if(Start==1)KillTimer(TIMEREVENT);Start=0;if(Fail)Ch=2;//失败表情else{minenum=0;Ch=1;//胜利表情if(Tm<10){CMyRecrod dlg;dlg.DoModal();}}}::InvalidateRect(this->m_hWnd,NULL,false);}//对鼠标右键点下的响应void CMyWnd::OnRButtonDown(UINT nFlags,CPoint point) //2.鼠标左键按下状态移动坐标{RightButtondown=true;if(!LeftButtondown){int suc=Success();if(!suc&&!Fail)//!Fail)//不是白且不成功才能继续{int n=0;if(point.x>=12&&point.x<=16*high+12&&point.y>=57&&point.y<=16*wide+57){point.x-=12;point.y-=57;if(g_MineFlags[point.x/16][point.y/16].newsta==0){g_MineFlags[point.x/16][point.y/16].newsta=1; //插旗}else if(g_MineFlags[point.x/16][point.y/16].newsta==1){g_MineFlags[point.x/16][point.y/16].newsta=2; //疑问}else if(g_MineFlags[point.x/16][point.y/16].newsta==2){g_MineFlags[point.x/16][point.y/16].newsta=0; //还原}else{//AfxMessageBox("你单击了右键并计算出错");}}if(g_MineFlags[point.x/16][point.y/16].newsta==1)minenum--;if(g_MineFlags[point.x/16][point.y/16].newsta==2)minenum++;}}else{// AfxMessageBox("两件都按下去了");}int suc=Success();if(suc||Fail){if(Start==1)KillTimer(TIMEREVENT);Start=0;if(Fail)Ch=2;//失败表情else{minenum=0;Ch=1;//胜利表情if(Tm<10){CMyRecrod dlg;dlg.DoModal();}}}::InvalidateRect(this->m_hWnd,NULL,false);}//对鼠标左键起来的响应void CMyWnd::OnLButtonUp(UINT nFlags,CPoint point){CRect rcBtn(16*high/2-3,15,16*high/2+23, 41);if(rcBtn.PtInRect(point)){Ch=4;::InvalidateRect(this->m_hWnd,NULL,false);Tm=0;ReStart();}if(point.x>=12&&point.x<=16*high+12&&point.y>=57&&point.y<=16*wide+57) {if(LeftButtondown){LeftButtondown=false;Ch=4;if(!Start){Start=SetTimer(TIMEREVENT, 1000, NULL);}point.x-=12;point.y-=57;if(x!=point.x/16||y!=point.y/16){g_MineFlags[x][y].newsta=z;}if(g_MineFlags[point.x/16][point.y/16].newsta!=1)//如果没有被标记则处理{if(g_MineFlags[point.x/16][point.y/16].oldsta==5){for(int i=0;i<high;i++)for(int j=0;j<wide;j++){if(g_MineFlags[i][j].oldsta==5&&g_MineFlags[i][j].newsta!=1)g_MineFlags[i][j].newsta=5;if(g_MineFlags[i][j].oldsta!=5&&g_MineFlags[i][j].newsta==1)g_MineFlags[i][j].newsta=4;if(i==point.x/16&&j==point.y/16)g_MineFlags[i][j].newsta=3;}Fail=1;Ch=2;}else if(g_MineFlags[point.x/16][point.y/16].oldsta==15)//安全区,向四周扩散{g_MineFlags[point.x/16][point.y/16].newsta=g_MineFlags[point.x/16][point.y/16].oldsta;Spread(point.x/16,point.y/16);Ch=4;}else // 提示区,点开后直接显示{g_MineFlags[point.x/16][point.y/16].newsta=g_MineFlags[point.x/16][point.y/16].oldsta;Ch=4;}}}}int suc=Success();if(suc||Fail){if(Start==1)KillTimer(TIMEREVENT);Start=0;if(Fail)Ch=2;//失败表情else{minenum=0;Ch=1;//胜利表情if(Tm<10){CMyRecrod dlg;dlg.DoModal();}}}::InvalidateRect(this->m_hWnd,NULL,false);}//对结果进行判定int CMyWnd::Success(){int minenum=0;//雷的个数int signnum=0;//旗子的个数int nonenum=0;//没有被点开的个数int siminum=0;//旗子且是雷的个数//规则://1,未被点开的数目与差棋子的数目等于地雷的数//2,没有被全部点开情况下,旗子的数目等于雷的个数,且每个旗子对应一个雷for(int i=0;i<high;i++)for(int j=0;j<wide;j++){if(g_MineFlags[i][j].newsta==0)minenum++;if(g_MineFlags[i][j].newsta==1&&g_MineFlags[i][j].oldsta==5)siminum++;}int it=minenum+siminum;if(minenumber==minenum+siminum||minenumber==siminum){for(int i=0;i<high;i++)for(int j=0;j<wide;j++){if(g_MineFlags[i][j].oldsta==5)g_MineFlags[i][j].newsta=1;}return 1;}else{return 0;}}//计时函数void CMyWnd::OnTimer(UINT nIDEvent){//HRSRC hSrc;//HMODULE hMdl;// hMdl = AfxGetResourceHandle();//if(nIDEvent==TIMEREVENT){Tm++;// hSrc = FindResource(hMdl, MAKEINTRESOURCE(IDR_WA VE1), _T("WA VE"));}::InvalidateRect(this->m_hWnd,NULL,false);CWnd::OnTimer(nIDEvent);}//对显示变化及时刷新void CMyWnd::DrawTime(CPaintDC& dc){CDC cdM;CBitmap bitmapch;RECT rect;GetClientRect(&rect);//获取指针当前坐标信息if(Color)//Color=1时为彩图{bitmapch.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAPTIME)); //下载位图信息}else{bitmapch.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAPTIME2)); //下载位图信息}cdM.CreateCompatibleDC(&dc);cdM.SelectObject(bitmapch); //选择包//雷的个数与设置以及属性if(minenum<0){minefir=11;minesec=(-minenum)%100/10;minethi=(-minenum)%100%10;}else{minefir=minenum/100;minesec=minenum%100/10;minethi=minenum%100%10;}dc.StretchBlt(17+13*0,15,13,25, &cdM, 0, 23*(11-minefir)-1, 13, 26, SRCCOPY);//雷//正负dc.StretchBlt(17+13*1,15,13,25, &cdM, 0, 23*(11-minesec)-1, 13, 26, SRCCOPY);//雷//十位dc.StretchBlt(17+13*2,15,13,25, &cdM, 0, 23*(11-minethi)-1, 13, 26, SRCCOPY);//雷//个位//时间位置与设置以及属性if(Tm>=999){h=m=s=11;}else{h=Tm/100;m=Tm%100/10;s=Tm%100%10; //根据状态赋值}dc.StretchBlt(high*16+PIXEL+16-10-(13*3),15,13,25, &cdM, 0,23*(11-h)-1, 13, 26,SRCCOPY);//计时器//百位dc.StretchBlt(high*16+PIXEL+16-10-(13*2),15,13,25, &cdM, 0,23*(11-m)-1, 13, 26, SRCCOPY);//计时器//十位dc.StretchBlt(high*16+PIXEL+16-10-(13*1),15,13,25, &cdM, 0,23*(11-s)-1, 13, 26, SRCCOPY);//计时器//个位dc.Draw3dRect(17,15,13*3+1,25,RGB(0,0,0),RGB(255,255,255));dc.Draw3dRect(high*16+PIXEL+16-10-(13*3),15,3*13+1,25,RGB(0,0,0),RGB(255,255, 255));}void CMyWnd::DrawMineMap(CPaintDC& dc){CBitmap bitMap;CDC dcM;RECT Rect={STARTX+10,STARTY+55,high*16,wide*16}; //定义带坐标等信息的巨型LPCRECT LpcRect=&Rect; //定义一个指向矩形的指针if(Color)//Color=1时为彩图{bitMap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP)); //下载位图信息}else{bitMap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP2)); //下载位图信息}dcM.CreateCompatibleDC(&dc);dcM.SelectObject(&bitMap);for(int i=0;i<high;i++){for(int j=0;j<wide;j++){dc.BitBlt(16*i+12,16*j+57,16,16,&dcM,0,g_MineFlags[i][j].newsta*16,SRCCOPY);}}}void CMyWnd::DrawMineChild(CPaintDC& dc){CDC cdM;CBitmap bitmapch;//CBitmap bitmapch;//CBitmap bitmapch;// RECT rect;// GetClientRect(&rect);//获取指针当前坐标信息if(Color)//Color=1时为彩图{bitmapch.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAPCHILD)); //下载位图信息}else{bitmapch.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAPCHILD2)); //下载位图信息}cdM.CreateCompatibleDC(&dc);cdM.SelectObject(bitmapch); //选择包//笑脸的位置与设置以及属性dc.StretchBlt(16*high/2-2, 16, 24, 24, &cdM, 0, 24 * Ch, 24, 24, SRCCOPY);dc.Draw3dRect(16*high/2-3, 15, 26, 26, RGB(128, 128, 128), RGB(128, 128, 128));}void CMyWnd::DrawMineFrame(CPaintDC& dc){CBrush Brush; //定义画刷RECT Rect = {STARTX,STARTY,high*16+PIXEL+16,wide*16+PIXEL+63}; //定义带坐标等信息的巨型Brush.CreateSolidBrush(RGB(192,192,192)); //给画刷赋值LPCRECT LpcRect=&Rect; //定义一个指向矩形的指针dc.FillRect(LpcRect, &Brush); //调用函数填充颜色// 起点宽高dc.FillSolidRect(STARTX,STARTY,high*16+PIXEL+16,PIXEL,RGB(255,255,255));//左边dc.FillSolidRect(STARTX,STARTY, PIXEL,wide*16+PIXEL+63,RGB(255,255,255));//上//三维大的范围边框Rect.left=10;Rect.top=10;Rect.right=high*16+PIXEL+11;Rect.bottom=45;//坐标信息左上角右下角左上角颜色右下角颜色dc.Draw3dRect(LpcRect,RGB(0,0,0),RGB(255,255,255));Rect.left=10;Rect.top=55;Rect.right=high*16+PIXEL+11;Rect.bottom=wide*16+PIXEL+57;dc.Draw3dRect(LpcRect,RGB(0,0,0),RGB(255,255,255));}void CMyWnd::OnPaint(){CPaintDC dc(this);RECT Rect;CDC DcM;GetClientRect(&Rect);if(DcM.CreateCompatibleDC(&dc))//创建一个与指定设备兼容的内存设备上下文环境(DC){ //则返回内存设备上下文环境的句柄//if (bitmap.CreateCompatibleBitmap(&dc, rect.right, rect.bottom))//该函数创建与指定的//{ //函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight)//设备环境相关的设备兼容的位图。

相关文档
最新文档