太复杂,我分成几部分试着做一下
首先是画棋盘,定义两个二维数组来表示每个棋子的状态和棋子周围的雷数,用于显示。
//画棋盘 a表示棋子是否已被翻开,b表示附近的雷数bool MakeMap(bool a[9][9],int b[9][9])
{
int i=0,j=0
for(i=0i<9i++)
{
for(j=0j<9j++)
模扮 {
旦纤灶 if(a[i][j]) printf("%d ",b[i][j])
竖埋 else printf("# ")
}
printf("\n")
}
return true
}
扫雷需要一个探测的附程序,功能就是扫描一个点周围的八个格子里有没有0格。0格就是一个周围八个格子里都没有雷的格。主模渣程序每次翻开未知格时都会运行这个附程序,当附程序发现0格之后又会翻开0周围的8个格,然后再一次运行探测的附程序,如果又探测到0之后又会翻开新的格。。。以此循环知道谨纳没有旦晌悄0格被探测到为止。普通版本WINDOS扫雷程序是将布雷和扫雷结合扫雷程序思想讲解
在我大二的时候就编写了一个扫雷程序,现在也有很多
源程序下载,我不知道他们的算法是怎么样的,但我想我的
算法应是最清晰和简单的。碧陵下面就来讲解我的扫雷程序思想。
首先我们在雷区上随机地放上雷,没有雷的地方被点击
后就会显示一个数字表示它周围有几个雷,这是怎么实现的
呢?我们可以把整个雷区看成一个二维数组a[i,j],如雷区:
11 12 13 14 15 16 17 18
21 22 23 24 25 26 27 28
31 32 33 34 35 36 37 38
41 42 43 44 45 46 47 48
51 52 53 54 55 56 57 58
我要知道a[34]周围有几个雷,就只有去检测
a[23],a[24],a[25]
a[33], a[35]
a[43],a[44],a[45]
这8个雷区是否放上了雷,仔细观察它们成在数学关系。
抽象出来就是:a[i,j]的雷的个数就是由
a[i-1,j-1],a[i-1,j],a[i-1,j+1]
a[ i ,j-1], a[ i ,j+1]
a[i+1,j-1],a[i+1,j],a[i+1,j+1]
(如果超出边界再加以判断)
这样的8个雷区决定的。
扫雷程序还会自动展开已确定没有雷的雷区。如果悔兆戚
a[3,4]周围雷数为1,a[2,3]已被标示为地雷,那么
a[24],a[25],a[33],a[35],a[43],a[44],a[45]
将被展开,一直波及到不可确定的雷区。这也是实现的
关键。我们可以把数组的猜毕元素设定为一个类对象,它们
所属的类
因此普通版本WINDOS扫雷程序是将布雷和扫雷结合的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)