基于C语言控制台输出的扫雷游戏2.0版

1.修改了开局踩雷的情况

2.修改了16*16和16*30棋盘无法对齐情况

game.h

 

 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);

 

test.c

 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 }

game.c

  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 }

 

posted @ 2021-09-22 10:39  贞德窦  阅读(62)  评论(0)    收藏  举报