扫雷游戏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌大学实验报告
学生姓名:邹晓敏学号:6103313025 专业班级:数媒131
实验类型:□验证□综合□设计□创新实验日期:实验成绩:
一、实验项目名称
扫雷游戏编程
二、实验目的
1、掌握Windows SDK编程;
2、掌握Windows API的使用;
3、深入体会完整项目的开发过程。
三、实验基本原理
SDK:(软件开发工具包)是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合。它可以简单的为某个程序设计语言提供应用程序接口API的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。API(应用编程接口)其实就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的API 而使操作系统去执行应用程序的命令动作。API和SDK 是开发Windows应用程序所必需的东西,MFC编程框架和类库都是建立在它们之上的,
GDI:是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
DC:MFC图形设备接口的设备描述表,它是MFC的主要对象之一。通过CDC类进行各种绘图操作,
四、实验步骤
1. 游戏分析
经过对游戏的初步分析,扫雷游戏含有如下规则:根据输入的信息,执行相应的挖雷,插旗,疑问标记,自动蔓延开挖等。如果选择了标记功能,那么单机右键会依次对未知点进行插旗,标记,取消插旗与标记。如果点滴到插旗的如果点击到了未插旗子的雷区,如果是雷,则判定游戏失败,之后对雷区的点击进行屏蔽,不予响应。如果是疑问标记则像正常区域对待。如何判断胜利,如果所有的雷都被插旗或者点击后剩余。而后为了丰富游戏添加了笑脸和计时器功能。
2. 实现功能
1、鼠标左击排雷,右击插小旗,打问号;
2、方格里面的数字表示方格周围的雷数;
3、游戏开始的同时开始计时,点笑脸能归零。
4、雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏;
5、任何时候开始游戏第一次点击不会扫到雷。
3. 编写程序
创建MFC单个文档项目,编写程序中要包含创建窗口函数,其中用到的窗口消息有WM_CREATE,WM_SIZE,WM_PAINT,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,WM_RBUTTONUP,WM_RBUTTONDOWN,WM_USER_DBBUTTONUP,WM_DESTROY。涉及到的主要函数有:
BOOL layMines(); 布雷
void placeNumber(); 计算数据
void markOtherMine(); 标雷
void markOtherFlag(); 标旗
void pushMine(POINT mousePos); 冲雷
void onMouseLButtonClick(HWND hwnd,POINT mousePos); 左键处理
void initGame(); 初始化游戏
VOID CALLBACK TimerProc (HWND, UINT, UINT, DWORD ) ; 定时器处理
4. 调试程序,试玩几遍看是否能够达到预期效果
五、实验数据及处理结果
实验部分重要源程序
1.布置雷区
BOOL layMines()
{
gameState = 0;//游戏重新开始
openCount = 0;//翻开空格数
btLandmineMapinfo[0][0]=(BYTE)0;
DWORD ixMine,iyMine,iMineBomb,icBomb=0,x,y;
//RECT rcMine;
//初始为0
for(int i=0;i { for(int j=0;j } //分4部分 ixMine=(int)floor(mineColNum/2.0); iyMine=(int)floor(mineRowNum/2.0); iMineBomb=(int)floor(mineBomb/4.0); srand((unsigned)time(NULL)); //得到时间随机 //设置左上 while (icBomb x=rand()%ixMine; y=rand()%iyMine; if (btLandmineMapinfo[x][y]!=0x10) { btLandmineMapinfo[x][y]=(BYTE)0x10; icBomb++; } } icBomb=0; //设置右上 while (icBomb x=rand()%(mineColNum-ixMine)+ixMine; y=rand()%iyMine; if (btLandmineMapinfo[x][y]!=0x10) { btLandmineMapinfo[x][y]=(BYTE)0x10; icBomb++; } } icBomb=0; //设置左下 while (icBomb