Windows扫雷的设计思路与实现

扫雷游戏设计思路分享 需要事先把用到的位图(bmp格式图片)转化成资源文件,然后使用CBitmap类的LoadBitmap函数加载位图,然后使用CDC和CPaintDC类关联位图。加载位图、添加鼠标响应、当鼠标点击时,获取点击位置,遍历数组m_pMines,如果有雷则判输,无雷,则用广度优先索索算法把相通的无雷。2.扫雷模块(主要涉及位图的加载和显示、音乐的播放、随机布雷、鼠标点击事件的响应、踩到地雷判输、扫完雷判赢、无雷区的扩展){//对于周围可以拓展的区域进行的规拓展。//雷方块拓展(对于周围无雷的空白区域) 阅读详情

      最近花了个把星期左右把Windows xp的扫雷实现了一下,在这里写下设计思路与大概实现。这个是下载地址,

欢迎大家下载试玩,http://kuai.xunlei.com/d/LTACJFIRFVKB。其实其中还有有个隐藏的bug。看看你能不能发现,哈哈。源代码我以后会补上,暂时不能上传,请各位谅解!

     既然是游戏的话,只有会玩了才有可能知道是怎么实现的!数字n代表以它为中心3*3的方格范围内

有n个雷。主要就是根据这个来判断是否有雷。然后是空格子的话就代表它周围没有雷。然后就是鼠标的各种事件了。下面这个是一个列表。

之后主要是按照这个写的,也有些改动,但是不大。

1.左键按下
 1.1.右键按下
  3*3方格变形
 1.2.右键未被按下
  当前方格变形
LBtnDown = TRUE;
2.右键按下
 2.1.左键按下
  3*3方格变形
 2.1.左键未被按下
  当前方格变形
RBtnDown = TRUE;
3.左键弹起
 3.1.之前左右键按下
  3.1.1.该数字的雷被找到
   调用展开算法 右键弹起失效
   RBtnDown = FALSE;
  3.1.2.没找到
   3*3方格复原 右键弹起失效

   标记标多了也会调用展开算法
   RBtnDown = FALSE;  
 3.2.之前左键按下
  当前位置方格调用展开算法
LBtnDown = FALSE;
4.右键弹起
 4.1.之前左右键按下
  4.1.1.该数字的雷被找到
   调用展开算法 左键弹起失效
   LBtnDown = FALSE;
  4.1.2.没找到
   3*3方格复原 左键弹起失效

 标记标多了也会调用展开算法
   LBtnDown = FALSE;
RBtnDown = FALSE;
5.鼠标滚动
 5.1.左键按下
  5.1.1.右键按下
   3*3方格移动
  5.1.2.右键弹起
   一个方格移动

这个是雷区初始化的代码。主要就是先写边界,然后把前面n个元素改成雷,最后随机分布。

 

void CMineView::SetMine()
{
	int i, j, currenti, currentj, i1, i2, j1, j2;

	currenti = m_mine.minenumber % m_mine.width;
	if (currenti == 0) {//刚好除尽
		currenti = m_mine.minenumber/m_mine.width;
		currentj = m_mine.width;
		for (i = 1; i <= currenti; i++) {
			for (j = 1; j <= m_mine.width; j++) {
				m_mineMax[i][j] = -1;//初始化雷区
			}
		}
		currenti++;
		currentj = 1;
	} else {//除不尽
		currenti = (m_mine.minenumber/m_mine.width)+1;
		currentj = m_mine.minenumber%m_mine.width;
		for (i = 1; i < currenti; i++) {
			for (j = 1; j <= m_mine.width; j++) {
				m_mineMax[i][j] = -1;//初始化雷区
			}
		}
		for (j = 1; j <= currentj; j++) {
			m_mineMax[currenti][j] = -1;//初始化雷区
		}
		currentj++;
	}

	//初始化不是雷区的区域
	for (j = currentj; j <= m_mine.width; j++) {
		m_mineMax[currenti][j] = 0;
	}
	++currenti;
	for (i = currenti; i <= m_mine.height; i++) {
		for (j = 1; j <= m_mine.width; j++) {
			m_mineMax[i][j] = 0;
		}
	}

	srand(time(NULL));
	for (i = m_mine.height * m_mine.width - 1; i >= 2; --i) {//布雷
		currenti = rand() % i;//产生的随机位置
		if (i%m_mine.width == 0) {//除的尽
			i1 = i / m_mine.width;
			j1 = m_mine.width;
		} else {//除不尽
			i1 = (i / m_mine.width) + 1;
			j1 = i % m_mine.width;
		}

		if (currenti == 0) {//就是第一个
			i2 = 1;
			j2 = 1;
		} else {
			if (currenti%m_mine.width == 0) {//除的尽
				i2 = currenti / m_mine.width;
				j2 = m_mine.width;
			} else {//除不尽
				i2 = (currenti / m_mine.width) + 1;
				j2 = currenti % m_mine.width;
			}
		}
		Swap(&m_mineMax[i1][j1], &m_mineMax[i2][j2]);
	}
}


   展开算法的主要思路就是用一个大的数组(包括虚拟边界)保存该算法对每一个方格的访问次数的计数。

==1就不在访问,分8个方向递归探测。碰到雷或者边界就返回。具体代码如下:

 

//8个方向探测
void CMineView::StretchMine(int i, int j)
{
	if (m_mineVisit[i][j] ==  1) {//走过的路不再走
		return ;
	}
	if (m_mineMax[i][j] == -2) {//碰壁了
		return ;
	}
	if (m_mineMax[i][j] == -1) {//撞雷了
		return ;
	} else {//上右下左递归探测
		if (m_minePic[i][j] != 1) {
			m_minePic[i][j] = 15 - m_mineMax[i][j];//根据位图中数字的关系得到的公式
		} else {
			m_minePic[i][j] = 4;
		}
		if (m_mineMax[i][j] > 0) {//碰到了数字 就停止
			m_mineVisit[i][j] = 1;//已访问
			return ;
		}
		m_mineVisit[i][j] = 1;//只有走得通的路才会被访问,访问次数+1
		StretchMine(i-1, j-1);
		StretchMine(i-1, j);//上边
		StretchMine(i-1, j+1);
		StretchMine(i, j+1);//右边
		StretchMine(i+1, j);//下边
		StretchMine(i+1, j-1);
		StretchMine(i+1, j+1);

之前碰到困难就是各个类直接自定义消息所用的句柄的获取,最难的那个就是模态对话框和CMainFrame类的通信,最后发现,模态对话框在DoModal

之前会调用oninitdialog,在oninitdialog里面可以把句柄传出来,这才实现了不同级别的绘制。然后就是绘图了,主要还是用到了双缓冲,之前双缓冲

用的很不正宗,后来改了改,用了3个cdc对象,一个选择位图,一个装图像,然后把这个最后bitblt到pDC当中。这样就避免了屏幕闪烁。

 绘图代码很固定。鼠标的各种消息会改变绘图的数据,实现了动态绘制。我感觉难点还是在于理解鼠标各个事件。我花了1天多时间,结果没

写好,之后冷静了想了下,然后把各种消息记录下来。用的多的代码写成函数方便调用。

  本身扫雷没啥难的,只要你会玩了,你就基本上知道怎么写了。就说这多把。大学已经结束了,已经要开始找工作了,这里预祝和我一样的这些毕业生

早点找到一个合适的工作!90后 up!You can make it!

C#扫雷游戏编程实战教程 C#(读作 “See Sharp”)是一种由微软开发的现代、类型安全的面向对象编程语言。它是.NET Framework的一部分,目的是结合面向对象的开发的强大功能和开发人员的生产力。C#的语法结构受到C和C++的影响,并借鉴了Java的某些特性。它被设计为一种简洁、强类型的语言,同时提供丰富的类库和语言集成查询(LINQ)功能,使得开发者可以在.NET环境中高效地编写代码。 阅读详情

相关推荐

扫雷游戏设计思路

从前台到后台两个方面详细描述了扫雷游戏的制作过程。

扫雷游戏总结

扫雷游戏

TL_mood的博客 1171

c++写的扫雷代码及设计思路

c++写的扫雷游戏,包括完整的设计思路和代码,可以直接运行哦

实现Windows经典游戏——扫雷

学习C语言只会打印Hello World?,那怎么行!来看这篇文章吧,只要会基础和函数和数组,看完这篇文章你就能写成经典小游戏——扫雷!

Yui_的博客 2264

VC6.0仿Windows自带扫雷程序(附源码)

使用VC++6.0开发的仿制Windows自带的扫雷程序,除了我认为没有什么太大意义的声音与颜色没有实现外,在外观及功能上基本上是一模一样的。

java+毕业设计+扫雷(程序)

java+毕业设计+扫雷(程序) 史上最详细的java+毕业设计+扫雷(程序).rar

java扫雷游戏设计总结_JAVA版扫雷游戏的设计与实现

JAVA版扫雷游戏的设计与实现(任务书,开题报告,外文翻译,毕业论文10000字,程序代码,答辩PPT)摘 要扫雷是一款玩法相当简单的大众化的小游戏,游戏的胜利条件是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时要避免踩到雷。随着社会的不断进步,人们的压力也不断的提高,人们的生活节奏不断加快,在游戏层出不穷的时刻,人们对游戏的需求也不断提高,而扫雷游戏任然受到不少人的青睐,其本身的性质...

weixin_35762250的博客 3824

P+F--r2000激光雷达slam技术实现

P+F--r2000激光雷达slam技术实现

majingming123的博客 1667

扫雷小游戏的设计思路以及实现的细致讲解

扫雷小游戏

qq_73216106的博客 2799

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3201

整理 钢琴 约翰汤普森-简易钢琴(小汤)

文件名:(小汤1)约翰-汤普森钢琴1 超清PDF (原版引进)文件名:(小汤2)约翰-汤普森钢琴2 超清PDF (原版引进)文件名:(小汤3)约翰-汤普森钢琴3 超清PDF (原版引进)文件名:(小汤4)约翰-汤普森钢琴4 超清PDF (原版引进)文件名:(小汤5)约翰-汤普森钢琴5 超清PDF (原版引进)文件大小:20.1 MB。文件大小:23.7 MB。文件大小:45.7 MB。文件大小:51.7 MB。文件大小:72.0 MB。

TS的博客 5万+

扫雷游戏的分析和设计

于1992年发行。《扫雷》中玩家的目标是在最短时间内识别出所有非雷区的格子,同时避免触碰到地雷。游戏区域由多个隐藏格子组成,每个格子可能隐藏着地雷或数字,数字表示周围八个格子中地雷的数量。玩家通过点击格子揭示内容,使用逻辑推理逐步排除雷区。游戏考验玩家的观察力和推理能力,任何一次误点地雷都会导致游戏失败。

2301_81293884的博客 559

蓝牙功耗优化实战:连接蓝牙耳机时高耗电问题的深度排查与解决

连接任意一款蓝牙耳机, 进行插入实网SIM卡, 同时连接蓝牙耳机后, 进入IDLE模式, 测试时间为10分钟的测试结果, 平均电流毫安在8左右. 测试结果1: 平均电流 8.84mA 测试结果2: 平均电流 7.39mA 厘清问题: 由于出现上两幅图中 绿色线圈中的 20mA 左右高耗电时段, 从而将整体的平均电流抬高. 于是在记录IDLE下电流出现绿色线圈中的 20mA 左右高耗电时段, 同时录制UART1 Catcher log. Filter: MOD_BT/MOD_ATC.

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1001

Java扫雷游戏的设计与实现毕业设计论文

项目介绍 扫雷这款游戏有着很长的历史,从扫雷被开发出来到现在进行了无数次的优化,这款游戏变得越来越让人爱不释手了,简单的玩法在加上一个好看的游戏界面,每一处的细节都体现了扫雷的魅力。所以本次的毕业设计我将开发一款扫雷游戏。 本次毕业设计是以JAVA语言作为开发环境,使用Eclipse设计并开发一个类似Windows扫雷的游戏,实现其基本功能。论文首先介绍了课题背景,其次进行了需求分析及可行性分析;然后设计游戏流程,介绍雷区中的雷怎么安放和产生雷的随机算法;最后介绍游戏中可能会触发的各种时间,比如鼠标点击时间

qq_1406299528的博客 5952

OpenHarmony电源管理驱动架构剖析:HDI框架下的低功耗实现

鸿蒙电源管理驱动模块是OpenHarmony操作系统中负责设备电源状态管理的核心组件。该模块基于HDI(Hardware Device Interface)框架实现,提供了完整的电源管理功能,包括系统休眠/唤醒、运行锁管理、休眠模式控制等核心功能。public:// 主要接口函数// 运行锁管理private:// 内部辅助函数// 成员变量public:// 运行锁控制接口// 回调管理private:// 内部辅助函数。

m0_67505153的博客 208

【实战】基于 Inner-IoU 的 YOLOv8 优化指南:显著提升检测精度

Inner-IoU 凭借辅助边框的创新设计,成功解决了传统 IoU 损失在小目标、遮挡场景下的收敛难题,为 YOLOv8 注入了更强的定位能力。从原理剖析到代码集成,本教程已为你铺就了一条“精度提升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“精度优异”的答卷——相信我,当你看到检测框精准贴合目标的那一刻,你会明白这份尝试的价值。

m0_64661770的博客 107

完整的扫雷-Python

实现了完整的扫雷,但是很明显功能不如windows那个。首先,速度跟不上,所有格子出来的时候能明显的感觉到延迟;其次,没有那么好看,我本来想用地雷的图片,结果同一张图片不好放在多个按钮上,于是只有使用那个简单字符替代;最后,我不是完全清楚扫雷的规则,按照自己的理解设计算法,有的地方可能跟经典的扫雷有较大出入。跟之前的纯粹的棋盘相比,这个完整的扫雷修改了一下棋盘。另外,我自己觉得之前设计棋盘的时候有

My Dream, My Empire! 7650

K8S搭建(centos)完整版

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 4145

c语言扫雷游戏策划文档,扫雷游戏程序设计课设计报告.doc

扫雷游戏程序设计课设计报告课 程 设 计扫雷游戏程序设计2013 年 11 月 5 日设计题目扫雷游戏程序设计成绩课程设计主要内容扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。参考系统自带的扫雷程序,自行开发设计一款扫雷游戏...

weixin_34541572的博客 408

【红外技术】DDE算法:HE在红外图像可视化上的应用(附源码)

并且数据一般是以 8 的整数倍的位宽在电子系统中应用,因此大多数的显示器的显示位宽为 8bit,共 256 个灰阶。为了使红外图像可视化,因此需要一种“数据压缩”技术,还需要既可能的不丢失原始图像信息。HE后的图像直方图分布比较均匀离散,图像对比度好。但是HE算法只是适用某些图像,它是将灰度集中区域进行拉伸得到,也会放大该集中区域的噪声,它是一种“不公平”的映射。以下是红外细节增强算法的演示,很明显右边的图像,展现了更多的图像细节,对于小目标的观测非常友好。文章已于2019-12-02修改。

sunwindl91181的博客 911

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

扫雷(C#版)

大一的时候做的一个小游戏,突然发现这个项目比较有意思,觉得有必要把它分享出来。当然现在看来,里面有很多的不足之处。没有时间再去优化。这个项目就是利用C#编写一个Windows系统下的扫雷小游戏。以下内容均是原创,供大家学习使用。扫雷游戏是一款经典的小游戏,它最初是 Windows 操作系统自带的。由于其简单而有趣的玩法,这款游戏备受玩家喜爱。随着技术的发展,许多开发者开始使用 C# 进行软件开发设计,因为C#在面向对象编程技术方面具有优越性。

qq_69400797的博客 1695

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

windows程序设计(3):分解扫雷程序之雷区翻盖

假如让你写一个扫雷程序,在没有相关资料的前提下,应该从哪里入手呢? 我们先想想扫雷程序都有什么:菜单,秒表,记雷数,复位,还有雷区等杂七杂八的东西。而整个程序的关键,就在于雷区。因为如果没有秒表,记雷数等功能,扫雷勉强还是可以玩的,但如果没了雷区,就玩不了了。那么雷区又是怎么一回事呢?肯定要有一个数据结构来记录地雷和周围的数,而程序跟你交互的主要部分,就是在雷区上点一下,然后显示一幅图片,还有双...

java开发指南博客 【转载】 171

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

扫雷java程序算法设计_基于Java的Windows扫雷游戏的设计与实现毕业论文+任务书+翻译及原文+源码+辅导视频...

基于Java的Windows扫雷游戏的设计与实现摘 要扫雷这款游戏有着很长的历史,从扫雷被开发出来到现在进行了无数次的优化,这款游戏变得越来越让人爱不释手了,简单的玩法在加上一个好看的游戏界面,每一处的细节都体现了扫雷的魅力。所以本次的毕业设计我将开发一款扫雷游戏。本次毕业设计是以JAVA语言作为开发环境,使用Eclipse设计并开发一个类似Windows扫雷的游戏,实现其基本功能。论文首先介绍了...

weixin_32537985的博客 559

扫雷程序实现思路讲解

扫雷程序思想讲解     在我大二的时候就编写了一个扫雷程序,现在也有很多 源程序下载,我不知道他们的算法是怎么样的,但我想我的 算法应是最清晰和简单的。下面就来讲解我的扫雷程序思想。     首先我们在雷区上随机地放上雷,没有雷的地方被点击 后就会显示一个数字表示它周围有几个雷,这是怎么实现的 呢?我们可以把整个雷区看成一个二维数组a[i,j],如雷区:    11  12  1

king1991wbs的专栏 4862

扫雷程序设计与实现

本篇博客根据实际代码(txst.cgame.cgame.h)详细介绍了扫雷程序的设计与实现。通过模块化的函数设计,程序逻辑清晰,易于扩展(如改变棋盘大小、雷数,或者实现递归展开空白区域)。希望读者能借此理解扫雷游戏的核心机制,并动手实现更多有趣的功能。祝编程愉快!博客所附代码遵循 C99/C11 标准,在 Windows / Linux 平台均可正常编译运行。

2301_79914577的博客 350

扫雷游戏:从设计到实现的C语言之旅

显示数组(displayboard):存储玩家可见界面('*'表示未揭开,数字表示安全区)- 雷区数组(mineboard):存储真实地雷布局('X'表示雷,数字0-8表示周围雷数)printf("很遗憾,你被炸死了\n");printf("--------扫雷游戏-------\n");printf(" 选择错误,重新选择 \n");printf("坐标⾮法,重新输⼊\n");printf("请输⼊要排查的坐标:>");printf("退出游戏 \n");printf("恭喜你,排雷成功\n");

rooste的博客 620
上一篇: VC6.0下配置SDL
下一篇: 大数据的加法、减法、乘法以及阶乘的计算问题(源代码附上)
complety
博客等级 码龄16年 55粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值