1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<time.h>
4
5 #define ROW 9 //行
6 #define COL 9 //列
7
8 #define EASY_COUNT 10 //雷数
9
10 #define ROWS ROW+2
11 #define COLS COL+2
12
13 void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
14 void DisplayBoard(char board[ROWS][COLS],int row,int col);
15 void SetMine(char board[ROWS][COLS],int row,int col);
16 void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
17
18 //#include"game.h"
19
20 //初始化
21 void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
22 {
23 int i = 0;
24 int j = 0;
25 for(i=0;i<rows;i++)
26 {
27 for(j=0;j<cols;j++)
28 {
29 board[i][j]=set;
30 }
31 }
32 }
33
34 //打印棋盘
35 void DisplayBoard(char board[ROWS][COLS],int row,int col)
36 {
37 int i = 0;
38 int j = 0;
39 for(i=0;i<=col;i++)
40 {
41 printf("%d ",i);//打印行数
42 }
43 printf("\n");
44 for(i=1;i<=row;i++)
45 {
46 printf("%d ",i);
47 for(j=1;j<=col;j++)//打印列数
48 {
49 printf("%c ",board[i][j]);//打印棋盘
50 }
51 printf("\n");
52 }
53 }
54
55 //布置雷
56 void SetMine(char board[ROWS][COLS],int row,int col)
57 {
58 int count = EASY_COUNT;
59 while(count)
60 {
61 int x = rand() % row+1;//1~9
62 int y = rand() % col+1;
63 if(board[x][y] == '0' )
64 {
65 board[x][y] ='1';
66 count--;
67 }
68 }
69 }
70
71 //判断周围雷的个数
72 int get_mine_count(char mine[ROWS][COLS],int x,int y,int* win)
73 {
74 (*win)++;//计算无雷区域的个数,便于判断输赢
75 return mine[x-1][y]+
76 mine[x-1][y-1]+
77 mine[x][y-1]+
78 mine[x+1][y-1]+
79 mine[x+1][y]+
80 mine[x+1][y+1]+
81 mine[x][y+1]+
82 mine[x-1][y+1]-8*'0';
83 }
84
85 void Recursion(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y,int* win)
86 {
87 int res = get_mine_count(mine, x, y,win);
88 int i;
89 int arr[8][2] = {-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
90 if (res == 0 )
91 {
92 show[x][y] = res+'0';
93 for (i = 0; i < 8; ++i)
94 {
95 if (x + arr[i][0] >= 1 && x + arr[i][0] <= ROW && y + arr[i][1] >= 1 && y + arr[i][1] <= COL
96 && show[x + arr[i][0]][y + arr[i][1]] == '*')
97 Recursion(mine, show, x + arr[i][0], y + arr[i][1],win);//递归展开
98 }
99 }
100 else
101 {
102 show[x][y] = res + '0';
103 }
104
105 }
106
107 //扫雷
108 void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
109 {
110 int x = 0;
111 int y = 0;
112 int win = 0;
113 while(win<row*col-EASY_COUNT)
114 {
115 printf("请输入排除雷的坐标:");
116 scanf("%d%d",&x,&y);
117 if(show[x][y] !='*')
118 {
119 printf("此坐标已经排查过,请重新输入!\n");
120 DisplayBoard(show,row,col);
121 continue;
122 }
123 if(x>=1 && x<=row && y>=1 && y<=col)
124 {
125
126 if(mine[x][y]=='1')
127 {
128 printf("很遗憾,你输了\n");
129 DisplayBoard(mine,row,col);
130 break;
131 }
132
133 else
134 {
135 //int count=get_mine_count(mine,x,y);
136 //show[x][y]=count+'0';
137 Recursion(mine,show, x,y,&win);
138 DisplayBoard(show,row,col);
139 //win++;
140 }
141 }
142 else
143 {
144 printf("输入坐标非法,请重新输入!\n");
145 }
146 }
147 if(win==row*col-EASY_COUNT)
148 {
149 printf("恭喜你,排雷成功!\n");
150 DisplayBoard(mine,row,col);
151 }
152 }
153
154
155 //#include"game.h"
156
157 //菜单
158 void menu()
159 {
160 printf("************************\n");
161 printf("******* 1.play *******\n");
162 printf("******* 0.exit *******\n");
163 printf("************************\n");
164 }
165
166 void game()
167 {
168 char mine[ROWS][COLS] ={ 0 };//雷的存储
169 char show[ROWS][COLS] ={ 0 };//棋盘
170 //初始化
171 InitBoard(mine,ROWS,COLS,'0');
172 InitBoard(show,ROWS,COLS,'*');
173 //打印棋盘
174 //DisplayBoard(mine,ROW,COL);
175 DisplayBoard(show,ROW,COL);
176 //布置雷
177 SetMine(mine,ROW,COL);
178 //DisplayBoard(mine,ROW,COL);
179 //扫雷
180 FindMine(mine,show,ROW,COL);
181 }
182
183 void test()
184 {
185 int input = 0;
186 srand((unsigned int)time(NULL));//通过时间戳设置随机数
187 do
188 {
189 menu();//菜单
190 printf("请选择:");
191 scanf("%d",&input);
192 switch(input)
193 {
194 case 1:
195 game();//扫雷游戏
196 break;
197 case 0:
198 printf("退出游戏\n");
199 break;
200 default:
201 printf("选择错误,请重新选择!\n");
202 break;
203 }
204 }while(input);
205 }
206
207 int main()
208 {
209 test();
210 return 0;
211 }