程序设计报告
( 2017 / 2018 学年 第 一 学期)
题 目:挖地雷
专
业
计算机科学与技术
组长 学号姓名
组员 学号姓名
指 导 教 师
指 导 单 位 计算机学院软件教学中心
日
期
2017/11/17
-
设计程序框架和核心算法,分配任务,完成大部分
代码,测试并完善程序,撰写实验报告。
编写 Open,Close,Delay,InitGraph,SelectLevel,
NumOfMine,gotoxyWithFullwidth,setColor,End
函数,对程序提出修改意见。
组员()
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
使用 STL 排序,既简洁又快速。
除设计图形界面外,功能要求、选作要求、其他要求全部达到。
代码规范,注释详尽,风格良好。
教师签名:
年
月 日
成
员
分
工
评
分
细
则
简
短
评
语
级
评
分
等
优秀
备
注 评分等级共五种:优秀、良好、中等、及格、不及格
-
挖地雷
一、课题内容和要求
【问题描述】
你玩过扫雷游戏吧?Windows 操作系统中带了这个小游戏,那个系统叫什么来着? 在
游戏中要想过关,就必须要在一个 NxM 的区域上找出所有的地雷。游戏过程中,计算机
会在地图上显示一些数字从而帮助你确定哪里有地雷。例如,在下面这个有两颗地雷的
4x4 的地图(*表示地雷):
*...
....
.*..
....
根据上面的地图,可以计算出应该提供给游戏者的数字如下所示:
*100
2210
1*10
1110
每个数字表示了该方格周围到底有几个地雷,当然,一个方格周围最多的时候只会有
八个。
【功能要求】
代码要能提供以下几个基本功能。
(1) 定义一个矩阵,随机产生地雷的分布并由此产生提供给游戏者的数字信息。
(2) 定义成绩排行榜,记录前五名的用户名及时间。
(3) 提供菜单功能,定义不同等级的地雷地图供选择。
(4) 游戏者通过坐标(如 1(1,2)、0(3,4)判定第一行第二列位置为地雷,第
3 行第四列不是地雷)判定是否为地雷,标记地雷位置正确,则正确位置显示
@符号,如触碰地雷,游戏结束,没有触碰地雷,显示该坐标位置周边地雷分
布情况,如果周边有地雷不显示。
(5) 成绩排行榜以文件形式保存。
(6) 数据结构
-
struct game_player
{
char name[10];
char password[10];
int time;
int best_time;
//姓名
//密码
//累计时间
//最佳成绩
……
}
【选做要求】
(1) 对用户的输入进行一定的正确性检查。
(2) 游戏者可以查看游戏累计时间。
【其他要求】
(1) 界面美观,交互方便。
(2) 注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、
返回值也要以注释的形式说明用途;关键的语句段要求有注—释解释。
(3) 程序的层次清晰,可读性强。
(4) 变量、函数命名符合规范。
(5) 如有可能,可使用 MFC 等开发工具,实现彩色或图形操作界面。
【开发环境】
可以选择 TC2.0、TC3.0、VC++6.0 等开发环境,或者与老师讨论,选择自己熟悉的开
发工具与平台。
二、需求分析
挖地雷的功能框架图如图 1 所示。
-
图 1 功能框架图
-
(1)提供可操作的主菜单:注册或登录、开始游戏、显示用户信息、查看排行榜、
修改密码、选择难度、自定义行数列数和雷的个数、继续游戏、切换账号、结束游戏。根
据用户输入的选项来运行不同的功能,运行不同的函数。
(2)为了用户账号的安全,用户输入密码时,要显示*而不显示密码,且可以回删。
(3)在用户错误的输入下也能给出提示,让用户重新输入,继续运行。
(4)保证用户第一次点击必不踩雷,使游戏不靠运气靠技术,提升用户的游戏体验。
(5)第一行总是显示程序名称,第二行显示登录的用户名。
(6)在雷区第一行第一列显示行数列数,方便用户看是第几行第几列,提升用户的
游戏体验。
(7)可以随时查看排行榜,排行榜中简单、普通、困难难度分开计,自定义难度不
算排行榜。
(8)可以随时查看用户信息,用户信息中包括用户名、游戏累计时间、最快成绩、
总游戏局数、胜局数、负局数、游戏胜率。
(9)像微软扫雷一样,如果点击到没有地雷的地方,要向四周扩散。
(10)登录后继续游戏无需再登录,可以切换账号。
三、概要设计
1 主要存储结构
struct GamePlayer
{
char Name[10];
char Password[10];
double Time;
double AllTime;
double BestTime;
int GameCount;
int NumOfWin;
int NumOfLose;
double Rate;
}Gameplayer, gameplayer[1010];
//游戏用户
//用户名
//密码
//当前游戏所用时间
//累计游戏时间
//最佳成绩,即最短时间
//总游戏局数
//历史胜利次数
//历史失败次数
//总胜率
//Gameplayer 存储当前游戏用户
//gameplayer 存储用户文件中的用户
-
struct GRAPH
{
int s[110][110];
char Show[110][110];
int Row;
int Col;
int Lei;
}Graph;
struct RANK
{
//雷区地图
//矩阵存储,0 表示没有雷,1 表示有雷
//显示给用户的雷区地图
//雷区的行数
//雷区的列数
//雷的个数
//雷区地图
//存储排行榜
char Name[10];
double Time;
bool operator < (const RANK& r) const
{
//用户名
//时间
//重载小于号,使排序更简单
if(Time != r.Time)
//先按照时间从小到大排序
return Time < r.Time;
else
{
int len1 = strlen(Name);
int len2 = strlen(r.Name);
return len1 < len2;
}
}
}Rank[6];
2 主要函数流程
//时间相同则按照用户名从短到长排序
//用于排名的结构体数组
(1)InitPlayer 函数:用于从文本中载入用户信息并存入结构体数字,返回文本中用
户个数和当前用户所在文件中的位置。提示用户输入用户名密码,若为新用户则自动注册,
若 为 老 用 户 则 核 对 密 码 是 否 正 确 。 InitPlayer 函 数 流 程 图 如 图 2 所 示 。
-
图 2 InitPlayer 函数
(2)Sweep 函数:一次扫雷操作,如果越界就返回,如果翻开过就返回,如果标记过
且 k=0 就重新标记,如果是雷且 k=0 就返回踩雷了,如果 k=1 就直接标记,如果周围有雷
就显示数字,如果周围没雷就向四周调用八个 Sweep 函数,Sweep 函数流程图如图 3 所示。
-