您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:145 来源:vckbase.com

仿 Windows 自带扫雷的小程序

作者:CSER_513_2

下载源代码
逆风编程技术

  一直感觉Windows自带的扫雷程序挺有意思的。学习VC也有很长的时间了,一直没有真正的用心作过什么东西。决定先做个扫雷练练手。由于对MFC掌握的不是很好,程序中的小臭虫还希望各位兄弟们多多指教,共同进步。

一、主要思路及实现方法
  对于界面部分:采取的是贴图技术即在窗口上设置上各种背景图片。在有鼠标以及键盘操作的时候进行相应的替换。此处主要用到的都是对于后台部分:在第一次点击雷区的时候埋下所有的雷,同时开始计时。然后在每一次鼠标点击的时候进行判断,若触雷或标记错误的展开则失败,若成功挖出最后一颗雷则胜利。为记录每一个表示雷的小窗体的信息,程序中定义了一个MINEWND的结构体,保存了小窗体的行,列,是否为雷,初始状态和最终状态的信息。然后在主窗体类CMineWnd中定义了一个二维数组m_pMines[24][30]存储最大雷区的小窗体数组。每次点击鼠标的时候,首先获得小窗体的指针,然后对相应的数组中的元素进行操作。

二、代码说明:

布下所有的雷:

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  ;

      }

   }   

}
此处的srand( (unsigned)time( NULL ) );是为了每次产生的随机数都不相同。展开空白窗体周围的区域:
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;

	// redraw special MINEWND

	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个小窗体,若再次查找到空白,再进行查找,直到把能展开的全部展开。其他的几个主要的函数代码量比较大,各位可以到附带的实例代码中去看,就不在这里祥述了 。

四、结束语
  程序代码参考了lpq9907的扫雷程序的代码。在此对lpq9907表示感谢:) 另外,程序实现代码中的注释都是用的英文,本人英文水平不高,纯属练习,若有什么错误还望不要笑我同时希望能告诉我改正。
相关文章

针对Excel表格文件操作的编程实现
VC 游戏开发:五子棋
如何简单实现可执行文件的自我删除
树视控件在多文档中的使用
使用 LIBCTINY.LIB 为 EXE 和 DLL 文件 减肥
代号 WinFS:革命性的文件存储系统...
浅谈PDFlib中文输出(一)如何使用Acrobat标
连接 COM 与.NET 的桥梁(二)——COM 服务
用VC实现支持多语言的程序
MFC 编写的仿 Windows 计算器
Direct3D9初级教程
如何通过Openh323开发自己的H.323协议栈
NT环境下进程隐藏的实现
实现一个能模拟简单猜扑克牌大小的 Win32 控
MFC 应用程序中的菜单提示信息
用RealPlayer控件制作的播放器
模拟退火算法求解TSP问题
使用C#制作《邮件特快专递》
如何实现三态选择树
Google搜索客户端API for C/C

相关评论


本文章所属分类:首页 VC++

  热门关键字: