1 #define _CRT_SECURE_NO_WARNINGS
2 #define ROW 9 //9*9 16*16 16*30
3 #define COL 9
4 #define ROWS ROW+2
5 #define COLS COL+2
6 #define MINE 10 //10 40 99
7
8 #include <stdio.h>
9 #include <time.h>
10 #include <stdlib.h>
11 //初始化 参数(数组 ;行;列;字符)
12 void InItBoard(char Board[ROWS][COLS],int row,int col,char set);
13 //打印 参数(数组 ;行;列)
14 void PrintBoard(char Board[ROWS][COLS], int row, int col);
15 //埋雷 参数(数组 ;行;列)
16 void SetMine(char Mine[ROWS][COLS],int row,int col);
17 //扫雷 参数(数组 ;行;列)
18 void ClearMine(char Board[ROWS][COLS], char Mine[ROWS][COLS],int row, int col);
19 //计算周围的雷的个数
20 int SumMine(char Mine[ROWS][COLS], int x, int y);
21 //自动打开
22 void AutoDisplay(char Board[ROWS][COLS], char Mine[ROWS][COLS], int x, int y);
1 #define _CRT_SECURE_NO_WARNINGS
2
3 #include "game.h"
4
5 void menu()
6 {
7 printf("************************\n");
8 printf("***** 1.开始游戏 ******\n");
9 printf("***** 0.退出游戏 ******\n");
10 printf("************************\n");
11 printf("请选择>>\n");
12 }
13
14 void game()
15 {
16 //创建数组
17 //存雷的数组
18 char mine[ROWS][COLS] = { 0 };
19 //显示面板的数组
20 char show[ROWS][COLS] = { 0 };
21 //初始化
22 InItBoard(mine, ROWS, COLS, '0');
23 InItBoard(show, ROWS, COLS, '*');
24 //打印面板
25 //PrintBoard(mine, ROW, COL);
26 PrintBoard(show, ROW, COL);
27 //初始点击必是空格,避免开局遇雷
28 ClearMine(show, mine, ROW, COL);
29 //PrintBoard(mine, ROW, COL);
30 //PrintBoard(show, ROW, COL);
31 //扫雷
32 //ClearMine(show,mine,ROW,COL);
33 }
34 int main()
35 {
36 int input = 0;
37 srand((unsigned int)time(NULL));
38 do
39 {
40 menu();
41 scanf("%d", &input);
42 switch (input)
43 {
44 case 1:
45 game();
46 break;
47 case 0:
48 printf("退出游戏\n");
49 break;
50 default:
51 printf("选择错误,请重新选择\n");
52 break;
53 }
54
55 } while (input);
56 return 0;
57 }
1 #include "game.h"
2
3
4 //初始化数组
5 void InItBoard(char Board[ROWS][COLS], int row, int col, char set)
6 {
7 int i, j;
8 for (i = 0; i < ROWS; i++)
9 {
10 for (j = 0; j < COLS; j++)
11 {
12 Board[i][j] = set;
13 }
14 }
15 }
16
17 //打印
18 void PrintBoard(char Board[ROWS][COLS], int row, int col)
19 {
20 int i, j;
21 for (i = 0; i <= COL;i++)
22 {
23 if (i<10)
24 {
25 printf("%d ", i);
26 }
27 else
28 {
29 printf("%d ",i);
30 }
31
32 }
33 printf("\n");
34 for (i = 1; i < ROWS-1; i++)
35 {
36 if (i<10)
37 {
38 printf("%d ", i);
39 }
40 else
41 {
42 printf("%d ", i);
43 }
44 for (j = 1; j < COLS-1; j++)
45 {
46 printf("%c ", Board[i][j]);
47 }
48 printf("\n\n");
49 }
50 }
51
52 //埋雷
53 void SetMine(char Mine[ROWS][COLS], int x, int y)
54 {
55 int a, b,c,d, i = 0;
56
57 for (c = x - 1; c <= x + 1; c++)
58 {
59 for (d = y - 1; d <= y + 1; d++)
60 {
61 Mine[c][d] = '2';
62 }
63 }
64 while (i < MINE)
65 {
66 a = rand() % ROW + 1;
67 b = rand() % ROW + 1;
68
69 if (Mine[a][b] == '0')
70 {
71 Mine[a][b] = '1';
72 i++;
73 }
74 }
75 for (c = x - 1; c <= x + 1; c++)
76 {
77 for (d = y - 1; d <= y + 1; d++)
78 {
79 Mine[c][d] = '0';
80 }
81 }
82 }
83
84 //搜索周围8个格子有几个雷
85 int SumMine(char Mine[ROWS][COLS], int x, int y)
86 {
87 return Mine[x - 1][y - 1] +
88 Mine[x - 1][y] +
89 Mine[x - 1][y + 1] +
90 Mine[x][y + 1] +
91 Mine[x + 1][y + 1] +
92 Mine[x + 1][y] +
93 Mine[x + 1][y - 1] +
94 Mine[x][y - 1] - '0'*8;
95 }
96
97 //自动打开
98 void AutoDisplay(char Board[ROWS][COLS], char Mine[ROWS][COLS], int x, int y)
99 {
100 int i, j;
101 if (Board[x][y] == '0'&&x > 0 && x<ROWS-1 && y>0 && y < COLS-1)
102 {
103 if (Board[x - 1][y] == '*')
104 {
105 Board[x - 1][y] = SumMine(Mine, x - 1, y) + '0';
106 AutoDisplay(Board, Mine, x-1, y);
107 }
108 if(Board[x][y + 1] == '*')
109 {
110 Board[x][y + 1] = SumMine(Mine, x, y + 1) + '0';
111 AutoDisplay(Board, Mine, x, y + 1);
112 }
113 if (Board[x + 1][y] =='*' )
114 {
115 Board[x + 1][y] = SumMine(Mine, x + 1, y) + '0';
116 AutoDisplay(Board, Mine, x + 1, y);
117 }
118 if (Board[x][y - 1]=='*')
119 {
120 Board[x][y - 1] = SumMine(Mine, x, y - 1) + '0';
121 AutoDisplay(Board, Mine, x , y-1);
122 }
123 if (Board[x-1][y - 1] == '*')
124 {
125 Board[x-1][y - 1] = SumMine(Mine, x-1, y - 1) + '0';
126 AutoDisplay(Board, Mine, x-1, y - 1);
127 }
128 if (Board[x+1][y - 1] == '*')
129 {
130 Board[x+1][y - 1] = SumMine(Mine, x+1, y - 1) + '0';
131 AutoDisplay(Board, Mine, x+1, y - 1);
132 }
133 if (Board[x-1][y + 1] == '*')
134 {
135 Board[x-1][y + 1] = SumMine(Mine, x-1, y + 1) + '0';
136 AutoDisplay(Board, Mine, x-1, y + 1);
137 }
138 if (Board[x + 1][y + 1] == '*')
139 {
140 Board[x + 1][y + 1] = SumMine(Mine, x + 1, y + 1) + '0';
141 AutoDisplay(Board, Mine, x + 1, y + 1);
142 }
143 }
144 for (i = 0; i < ROWS; i++)
145 {
146 for (j = 0; j < COLS; j++)
147 {
148 if (Board[i][j] == '0')
149 {
150 Board[i][j] = ' ';
151 }
152 }
153 }
154 }
155 //判断输赢
156 int IsWin(char Board[ROWS][COLS], int i, int j)
157 {
158 int ret=0;
159 for (i = 1; i < ROWS-1; i++)
160 {
161 for (j = 1; j < COLS-1; j++)
162 {
163 if (Board[i][j] == '*')
164 {
165 ret++;
166 }
167 }
168 }
169 return ret;
170 }
171 //初始扫雷避免开局遇雷
172 void ClearMine(char Board[ROWS][COLS], char Mine[ROWS][COLS])
173 {
174 int x, y, ret, win;
175 printf("请输入坐标>>\n");
176 scanf("%d %d", &x, &y);
177 if (x > 0 && x <= ROW && y > 0 && y <= COL)
178 {
179
180 SetMine(Mine, x, y);
181 ret = SumMine(Mine, x, y);
182 Board[x][y] = ret + '0';
183 AutoDisplay(Board, Mine, x, y);
184 //PrintBoard(Mine, ROW, COL);
185 PrintBoard(Board, ROW, COL);
186 win = IsWin(Board, x, y);
187 if (win == MINE)
188 {
189 printf("恭喜你赢了!");
190 return;
191 }
192 while (1)
193 {
194 printf("请输入坐标>>\n");
195 scanf("%d %d", &x, &y);
196 if (x > 0 && x <= ROW && y > 0 && y <= COL)
197 {
198 if (Mine[x][y] == '1')
199 {
200 printf("你输了!\n");
201 PrintBoard(Mine, ROW, COL);
202 break;
203 }
204 else
205 {
206 ret = SumMine(Mine, x, y);
207 Board[x][y] = ret + '0';
208 AutoDisplay(Board, Mine, x, y);
209 PrintBoard(Board, ROW, COL);
210 win = IsWin(Board, x, y);
211 if (win == MINE)
212 {
213 printf("恭喜你赢了!");
214 break;
215 }
216 }
217 }
218 else
219 {
220 printf("输入的参数不合法,请重新输入");
221 }
222 }
223
224 }
225 else
226 {
227 printf("输入的参数不合法,请重新输入");
228 }
229
230 }