基于WIN32 API界面编程实现的扫雷小游戏

Camouflage

发布日期: 2018-11-05 16:07:58 浏览量: 404
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1项目介绍

1.1 开发介绍

  • 操作系统:Windows 7 及以上版本系统

  • 开发环境:VS2010

1.2 扫雷操作

  • 鼠标操作

1.3 胜利标准

  • 将所有的雷找到

1.4 游戏规则

通过鼠标左键单击即可挖开方块,显示数字为周围八个区域的炸弹数。通过推理可以找到地雷,然后通过鼠标右键可以进行标记。如果发现标记错误,可以再次单击鼠标右键进行标记消除。如果点开了地雷,则游戏结束,显示对话框,游戏结束。

2 方案

2.1 方格

方格的存储为二维数组。每一个方格又为一个结构体,结构体中存储了两个属性,一个是是否含雷,另一个是周围含雷个数。

2.2 雷的放置

雷的随机放置是由随机函数Srand((unsigned)time(NULL));实现的,然后随机产生二维数组的行列值,再进入循环,如果之前没有生成该坐标,则进行布雷;如果之前生成过该坐标,则重新生成。

  1. srand((unsigned)time(NULL));
  2. while(count)
  3. {
  4. i = rand() % 9 + 1;
  5. j = rand() % 9 + 1;
  6. if(Block[i][j].containMine == error)
  7. {
  8. Block[i][j].containMine = ok;
  9. count--;
  10. }
  11. }

2.3 雷数的确定

雷数的确定由一个个的列举找出。如果该数组不处于四周边界,则周围八面挨个遍历;如果在边界,则排除掉没有数组的地方。运用条件:i>0; j>0; i<COLS; j<ROWS等。

2.4 对话框生成

对话框的生成调用,MessageBox函数。

2.5 炸弹与红旗的生成

炸弹与红旗的生成,分别用两个数组DONE[i][j]、NUM[i][j]来存储该方格是否别左键和右键点过。分别初始化-1,如果被点过,则更改值为1。

2.6 流程

设置边框,初始化每一个小方格,初始化DONE和NUM数组,存放用户是否点过方格和以何种方式点的方格的属性,设置红旗数量为0,加载图片。绘制窗口,如果没有被用户以任何方式点过的小方格,绘制成灰色的小方块。被左键点击过的小方格如果不是地雷则绘制该点周围所含雷数的图片,如果是炸弹则绘制成炸弹,并调用对话框函数。被右键单数次点击过的方格绘制成红旗,双数次点击过的方格绘制成灰色小方块。

3 关键技术

3.1 加载并显示图片

  1. #define BITMAP_FILE_BK1 "bomb.bmp"
  2. hbmpBomb = LoadImage(NULL, _T("bomb.bmp"),IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  3. SelectObject(hdcBitmapSrc,hbmpBomb);
  4. GetObject(hbmpBomb, sizeof(BITMAP), &bmp);
  5. StretchBlt(hdcmem,rectBoundary.left + i*CELL_PIXEL, rectBoundary.top + j*CELL_PIXEL, 50, 50,hdcBitmapSrc,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);

3.2 左键右键点击检测函数

  1. case WM_LBUTTONDOWN:
  2. if(wParam && MK_LBUTTON)
  3. {
  4. x = LOWORD(lParam);
  5. y = HIWORD(lParam);
  6. }

3.3 左键右键点击的小方块位置的确定

  1. void adjust(int* x,int* y)
  2. {
  3. (*x) = (*x-10)/50;
  4. *y = (*y-10)/50;
  5. }

4 最终效果

最后程序基本完成了预期目标。效果如下:

5 总结与不足

扫雷是我一直很喜欢的一款游戏,比起其他游戏,扫雷有着编写容易,易于上手的特点。由于学习C语言的时候不是很精通,导致编写游戏的时候存在了很多问题,后来也是一个一个查阅资料以及问同学等各个渠道解决的。

在设计游戏左键右键检测的时候不知道如何调用,造成了很长时间的错误,后来才想到用二维数组存放是否被点击过的属性。调用窗口的函数,图片加载等都是按照老师给的源码改编的。编程过程中,中英文的切换用于写代码和注释,有时切换不及时,也导致了一些错误,不过vs自带报错功能解决了很多问题。编程的时候还遇到过一些外部解析的错误,其中有一个是需要把控制台性质转换为了窗口性质;还有一个是因为进程中存在了运行的exe文件,打开任务管理器结束该进程就可以继续运行了,这些方法都是上网搜索到的,网络对我的帮助也很大。

在扫雷的游戏中还是有很多功能没有完善,例如不能自己选择扫雷的游戏难度,双击挖开方块不能自动展开,游戏不能保存等。希望在以后的学习中,可以不断完善自己的能力,充实自己的知识结构。同时也老师和同学们给我的帮助表示感谢!

上传的附件 cloud_download 基于WIN32 API界面编程实现的扫雷小游戏.7z ( 116.30kb, 11次下载 )
error_outline 下载需要8点积分

发送私信

你有那么好的年纪,为什么不笑得更好看些

7
文章数
13
评论数
最近文章
eject