扫雷游戏

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档