扫雷

正文

应该是给19级计算机写的扫雷吧,windows下可用,其他系统不可用。

大晚上不好好写论文写了个扫雷 。。。。代码如下,每次输入为三个数空格隔开。其中前两个数表示坐标。最后一个数如果是1表示挖这个地方。如果是2表示标记这个地方是雷。明天要加班写论文了。。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
//2.随机雷
//3.输入分为 定雷 扫雷
//4.扫雷时要判断是否为雷点,如果不是遍历领域是否存在雷,返回雷的个数。
//5.扫雷如果雷不存在,需要进行大片领域开放
//6.雷标记为* 定雷标记为$ 扫雷成功显示#
//#include<windows.h>
#include <stdio.h>
#include <stdlib.h>
#define N 9
char layout1[N][N];//棋盘1
char layout2[N][N];//棋盘2

void init(){
int sum = 0;
int i,j;
//初始化棋盘
for(i=0;i<N;i++){
for(j=0;j<N;j++){
layout1[i][j] = ' ';//先全部标记为空
layout2[i][j] = ' ';
}
}
//随机化10个雷
while(sum < N){
i = rand()%N;//生成0~9
j = rand()%N;
if(layout1[i][j]!='*'){ //防止随机生成的这个地方已经存在雷
layout1[i][j] = '*'; //标记为雷
sum += 1; //雷的数目+1
}
}

}
//显示
void menu(){
//system('clr');
printf("-----------------欢迎来到扫雷-----------------\n");
int i,j;
for(i=0;i<N+1;i++){
for(j=0;j<N+1;j++){
if(i==0||j==0){
printf("%d ",i==0?j:i);
}else{
if(layout2[i-1][j-1]==' '){
printf(" ");
}else{
printf("%c ",layout2[i-1][j-1]);
}
}
}
printf("\n");
}
printf("请输入坐标如3,3扫雷请输入1,定雷请输入2\n");

}
//判断领域
void del(int x,int y){
int i,j;
int sum = 0;
for(i=-1;i<=1;i++){
for(j=-1;j<=1;j++){
if(x+i>=0&&x+i<N&&y+j>=0&&y+j<N&&(i!=0||j!=0)){//防止数组越界
if(layout1[x+i][y+j]=='*'){
sum += 1; //统计领域内雷的个数
}
/*else if(layout2[x+i][y+j]!='$'){
layout2[x+i][y+j] = '#';//不是雷标记为非雷
}*/
}
}
}
//判断领域有雷不,没有则迭代领域
if(sum==0){//领域无雷
layout1[x][y] = '#'; //在棋盘1上标记他为已遍历
layout2[x][y] = '#'; //棋盘2上标记为白班
for(i=-1;i<=1;i++){
for(j=-1;j<=1;j++){
if(x+i>=0&&x+i<N&&y+j>=0&&y+j<N&&layout1[x+i][y+j]!='#'&&layout2[x+i][y+j]!='$'&&(i!=0||j!=0)){//防止数组越界 最后防止反复回掉导致死循环
del(x+i,y+j);
}
}
}
}else{//领域有雷
layout2[x][y] = sum+48;
}

}
//输入
bool input_kill(){
int i,j,n;
scanf("%d %d %d",&i,&j,&n);
i = i-1;
j = j-1;
if(i<0||j<0||i>=N||j>=N||(n!=2&&n!=1)){
printf("输入有误,请重新输入");
return true;
}
if(n==2){
layout2[i][j] = '$';
return true;
}else{//扫雷
if(layout1[i][j]=='*'){
layout2[i][j] = '*';
printf("游戏结束\n");
return false;
}else{
//领域遍历
del(i,j);
return true;
}
}

}
//判断游戏结束
bool end(){
int i,j;
int sum = 0;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
if(layout2[i][j]==' ')
return true;
else if(layout2[i][j]=='$')
sum += 1;
}
}
if(sum == N){
printf("游戏结束,恭喜胜利\n");
return false;
}else{
return true;
}
}
int main(){
init();
bool f = true;
while(f){
menu();
f = input_kill();
f = end();
//因为mac电脑没有<windows.h>文件无法调用system('clr');刷新输出,所以这里就不刷新了. windows下需要刷新,把那两个注释消掉就行。
}
//结束界面
int i,j;
for(i=0;i<N+1;i++){
for(j=0;j<N+1;j++){
if(i==0||j==0){
printf("%d ",i==0?j:i);
}else{
if(layout1[i-1][j-1]!='*'){
printf(" ");
}else{
printf("%c ",layout1[i-1][j-1]);
}
}
}
printf("\n");
}
return 0;
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!