扫雷的程序

扫雷的程序,第1张

普通版本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扫雷程序是将布雷和扫雷结合的

c++:

#include<iostream>

#include<fstream>

#include <ctime>

using namespace std

void layout(int n) {

char**cs = (char**) malloc(sizeof(char*) * n)

srand((unsigned) time(0))

for (int i = 0 i < n ++i) {

cs[i]=(char*) malloc(sizeof(char) * n)

for (int j = 0 j < n ++j) {

int r0 = rand() % 100

int r1 = rand() % 100

if (r1 >= r0 && r1>70) { //雷

cs[i][j] = '*'

} else {

cs[i][j] = ' '

}

}

}

//计算雷的个数

for (int i = 0 i < n ++i) {

for (int j = 0 j < n ++j) {

if (cs[i][j] == '*')

cout <<"  "<< cs[i][j]

else {

int count = 0

for (int k = i - 1 k <= i + 1 k++) {

for (int l = j - 1 l <= j + 1 l++) {

if (k >= 0 && l >= 0 && k < n && l < n

&& cs[k][l] == '*'){

count++

}

}

}

cs[i][j]=(char)('0'+count)

cout <<"  "<< cs[i][j]

}

}

cout << endl

}

}

int main() {

int n = 4

cout << "请输入行数:"

cin >> n

layout(n)

}

因为扫雷是随机生成雷的,所以到最后要猜的情况是经常会出现的,我以前玩扫雷游戏的时候,往往在前面玩得不错,可以后来要猜,就OVER掉了。还有遇见两处要猜的情况,就是两处地方都是剩两个,但靠周围的数字只能判断出两个里面有一个,但不知道是哪个,就只有点了,反正有50%的成功率。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12082538.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存