班级: 信计 1102
姓名: 李娜娜。
学号: 1108060209
设计日期: 2013.07.15
西安科技大学计算机学院
1.实验题目
编制一个演绎扫雷游戏的程序。
2.问题描述。
做一个n x m的扫雷游戏,每个方格包含两种状态:关闭(closed)和打开(opened),初始化时每个方格都是关闭的,一个打开的方格也会包含两种状态:一个数字(clue)和一个雷(bomb)。
你可以打开(open)一个方格,如果你打开的是一个bomb,那么就失败;否则就会打开一个数字,该数字是位于[0,8]的一个整数,该数字表示其所有邻居方格(neighboring squares)所包含的雷数。3.需求分析。
(1) 能够打开一个方格,一个已打开的方格不能再关闭。 (2)能够标记一个方格,标记方格的含义是对该方格有雷的预(并不表示真的一定有雷),当一个方格标记后该方格不能被打开,只能执行取消标记的操作,只能在取消后才能打开一个方格。 (3)能够给出游戏结果(输、赢、剩余的雷数、用掉的时间按秒计).
在一个10*10的方格中,随机分布10个地雷,并在其它没有地雷的格中显示该方格周围相邻的方格中共有几枚地雷。
4.概要设计。
本程序包含个11函数:
(1)主函数main(),包括矩阵的初始化。
(2) 布雷putmine(int n1);
(3)打开相关不是地雷的数组元素int expand(int row,int col);
(4)计算游戏矩阵中剩余的未被排开的方格数 remain()
(5)打印当前雷区状态 myprintf1();
(6)打印游戏矩阵myprintf2();
(7)获得周围地雷个数aroundmine(int row,int col)
(8)标记方格 biaoji()
(9)统计剩余雷的个数 lei()
(10)计雷区的地雷个数 minenumber()
(11)是否在雷区 inminearea(int row,int col)
各函数间的调用关系。
5.详细设计。
(1)数据结构的选择,也就是怎样表示扫雷的区域,很自然就会想到矩阵,也就是二维数组。一个游戏矩阵game[一个当前布雷矩阵mine[一个标记矩阵tag[
(2)基本函数及一些主要算法。
void main()
*初始化雷区*/
for(i=0;i
*布雷*/void putmine(int n1)
for(i=0; minenumber() row=rand()%n , col=rand()%n;
mine[row][col]=42; }
*打开相关不是地雷的数组元素*/
int expand(int row,int col)
for(i=row-1;i<=row+1;i++)
for(j=col-1;j<=col+1;j++)
if( !inminearea(i,j) )continue;
if(game[i][jcontinue;
game[i][j]=aroundmine(i,j)+48;
if (aroundmine(i,j)==0) expand(i,j);
*获得周围地雷个数*/
int aroundmine(int row,int col)
for(i=row-1;i<=row+1;i++)
for(j=col-1;j<=col+1;j++)
if(!inminearea(i,j)) continue;
if(mine[i][j]==42) around++;
return around; }
*是否在雷区*/
int inminearea(int row,int col)
* 计雷区的地雷个数*/
int minenumber()
for(i=0;i for(j=0;j
return minenum;
*计算game[中剩余的'#
int remain()
for(i=0;i for(j=0;j if(game[i][j]==#') odd++;
return odd;
*打印当前雷区状态*/
void myprintf1()
for(i=0;i for(j=0;jprintf("%c\t",mine[i][j]);
printf("");
*游戏矩阵*/
void myprintf2()
for(i=0;i for(j=0;j printf("%c\t",game[i][j]);
printf("");
*标记*/void biaoji()
while(b==1)
printf("是否标记你已经确定为雷的位置,是(1),否(0)");
scanf("%d",&b);
if(b==1)
printf("输入要标记的坐标,以逗号分开");
scanf("%d,%d",&i,&j);
tag[i-1][j-1]=1;}
*统计剩余雷的个数*/
int lei()
for(i=0;i for(j=0;j if(tag[i][j]==1&&mine[i][j]==42)
count++;
return count;}
6.调试分析。
在调试过程中遇到了很多困难,就比如说对不是雷的地方统计其周围雷的个数。中间部分通过循环很好统计,而边缘部分通过循环不一定就在雷区,一开始打算全都分开写,但是**很长,最后就加了一个函数,保证在雷区。还有就是由于在扫雷过程中要计时,但我并不知道该怎样添加这个功能,我就通过查看关于c的课本然后知道了clock()的用法。
不过已全部完成任务。
由于这个算法整体有点乱,时间复杂性达到了o(n^4),空间占用也很大,三个矩阵就是o(3n^2),我觉得如果采用结构体数组或许更好一些。标记采用一个共用体就会节省空间。
在编写程序初,其实还是很担心自己是否能完成,毕竟自己之前并没尝试过比较复杂的的编程,但是当问题在一步步解决时我就下定决心一定要完成它。遇到的困难很多但都想办法一一解决。编写完之后,我就觉得只要下定决心做某事就一定能做好,要有不怕困难和敢于挑战困难的勇气。
其实程序并不是很好,若化效果应该更好。
7. 使用说明。
(1)输入布雷个数,显示出当前雷区状态。
2) 输入扫雷的坐标,当该位置已被标记,提示是否取消标记,是输入1,否输入0.显示当前游戏矩阵,提示是否标记你认为是雷的位置,如果是就输入1,然后输入标记位置。否就输入0。
8.测试结果。
扫雷成功测试结果,由于篇幅有限,所以给出一部分测试结果。
扫雷失败,踩到雷运行结果。
附录:源程序。
#include <>
#include <>
#include <>
#define n 10
int mine[n][n],game[n][n],tag[n][n];
int row=0,col=0,a,b;
void main()
void putmine(int n1);
int expand(int row,int col);
int remain();
void myprintf1();
void myprintf2();
int aroundmine(int row,int col);
void biaoji();
int lei();
int n1,i=0,j=0,c,s;
/*初始化雷区*/
s=clock();
for(i=0;i
printf("此游戏为%d*%d雷阵,请输入需布雷的数量(%d以内)>>n,n,n*n);
scanf("%d",&n1);
printf("下面是所布雷阵》 ");
putmine(n1);
myprintf1();
for(i=0;i for(j=0;j { if(mine[i][j]!=
mine[i][j]=aroundmine(i,j)+48;
数据结构课程设计
课程设计说明书 题目哈夫曼编码问题的设计和实现。课程名称数据结构课程设计。院 系 部 中心。专业。班级。学生姓名。学号。设计地点。指导教师。设计起止时间 2008 年6月 2日至 2008 年 6月 6 日。目录。1 问题描述 2 1.1 题目内容 2 1.2 基本要求 2 1.3 测试数据 2 2...
数据结构课程设计
数据结构 课程设计。实验报告。学院 信息工程学院。班级 姓名 学号 指导老师 题目2 一元多项式的计算。1 实验目的。1 掌握链表的灵活运用 2 学习链表初始化和建立一个新的链表 3 知道怎样去实现链表删除结点操作与插入结点 4 理解链表的基本操作 包括数据域数据的相加 并能灵活运用。2 实验内容。...
数据结构课程设计
数据结构 课程设计报告。安徽工业大学计算机学院。2014年6月。目录。一 迷宫问题求解 2 二 大数相乘 8 三 学生成绩查询系统 二叉排序树 10 一 问题描述 利用栈求解迷宫问题。二 设计思路 首先先定义栈,初始化,入栈,出栈,删除栈,判空等,然后再结合具体迷宫算法。三 数据结构定义。typed...