标签:并且 地图 ring ret 提示 ini 过程 坐标 棋盘
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<string.h>
5
6 #define ROW 9
7 #define COL 9
8 #define MINE_COUNT 10
9
10 int Menu()
11 {
12 printf("=======================\n");
13 printf("1.开始游戏\n");
14 printf("0.结束游戏\n");
15 printf("=======================\n");
16 int choice = 0;
17 printf("请输入您的选择!\n");
18 scanf("%d", &choice);
19 return choice;
20 }
21
22 void Init(char mine_map[ROW + 2][COL + 2],
23 char show_map[ROW + 2][COL + 2])
24 {
25 //1.show_map都初始化成 * (表示没有翻开的位置)
26 for (int row = 0;row < ROW + 2;++row)
27 {
28 for (int col = 0;col < COL + 2;++col)
29 {
30 show_map[row][col] = ‘*‘;
31 }
32 }
33 //2.mine_map都初始化为‘0‘
34 for (int row = 0;row < ROW + 2;++row)
35 {
36 for (int col = 0;col < COL + 2;++col)
37 {
38 mine_map[row][col] = ‘0‘;
39 }
40 }
41 //除了上面的方法还可以:利用memset对一段连续的内存空间进行赋值
42 //二维数组也是在一个连续的内存空间上
43 //memset(mine_map, ‘0‘, (ROW + 2)*(COL + 2));
44 //memset(show_map, ‘*‘, (ROW + 2)*(COL + 2));
45
46 //3.对mine_map进行雷阵的布置
47 int mine_count = MINE_COUNT;
48 while (mine_count > 0)
49 {
50 //这个循环尝试进行布雷,每次布置成功一个则mine_count--
51 //magice number
52 int row = rand() % 9 + 1;
53 int col = rand() % 9 + 1;
54 if (mine_map[ROW][COL] == ‘1‘)
55 {
56 continue;
57 }
58 //当前位置可以用来设置地雷
59 mine_map[row][col] = ‘1‘;
60 --mine_count;
61 }
62 return;
63 }
64
65 void DisplayMap(char map[ROW + 2][COL + 2])
66 {
67 //先打印四个空格
68 printf(" ");
69 //打印列的坐标
70 for (int i = 1;i <= COL;++i)
71 {
72 printf("%d ", i);
73 }
74 printf("\n");
75 //第一行打印完成
76 //这里打印上边框
77 for (int i = 1;i <= COL;++i)
78 {
79 printf("---");
80 }
81 printf("\n");
82 //打印棋盘的每一行,注意,每一行最前面的要带上行号
83 for (int row = 1;row <= ROW;++row)
84 {
85 printf(" %d|", row);
86 for (int col = 1;col <= COL;++col)
87 {
88 printf("%c ", map[row][col]);
89 }
90 printf("\n");
91 }
92 }
93
94 void UpdateShowMap(char mine_map[ROW + 2][COL + 2],
95 char show_map[ROW + 2][COL + 2], int row, int col)
96 {
97 //每次翻开一个格子的时候,如果这个格子不是雷,就需要跟新show_map
98 //把当前位置替换成一个数字(数字就表示了当前位置周围8个格子中有几个地雷)
99 int mine_count =
100 (mine_map[row - 1][col - 1] - ‘0‘)
101 + (mine_map[row - 1][col] - ‘0‘)
102 + (mine_map[row - 1][col + 1] - ‘0‘)
103 + (mine_map[row][col - 1] - ‘0‘)
104 + (mine_map[row][col + 1] - ‘0‘)
105 + (mine_map[row + 1][col - 1] - ‘0‘)
106 + (mine_map[row + 1][col] - ‘0‘)
107 + (mine_map[row + 1][col + 1] - ‘0‘);
108 //由于show_map中都是字符,需要把这个数字转换为字符
109 show_map[row][col] = mine_count + ‘0‘;
110 }
111
112 void Game()
113 {
114 printf("‘0‘表示没有地雷,‘1‘表示有地雷\n");
115 //1.设定一个二维数组,作为表示地雷的地图,‘0‘表示没有地雷,‘1‘表示有地雷
116 // 设定一个二维数组,作为给玩家看的地图,每个位置是否被翻开,如果翻开
117 //在此处加了2表示加了一圈边框:
118 char mine_map[ROW + 2][COL + 2];
119 char show_map[ROW + 2][COL + 2];
120 //2.对地图进行初始化(包含布置地雷的过程)
121 Init(mine_map, show_map);
122 int blank_not_mine_count = 0;//不是雷的个数
123 //3.先打印一下初始地图
124 DisplayMap(show_map);
125 while (1)
126 {
127 //4.提示玩家输入一组坐标,并且对玩家输入进行合法性检查
128 printf("请输入一组坐标(row col):");
129 int row = 0;
130 int col = 0;
131 scanf("%d %d", &row, &col);
132 //row,col的有效范围[1,row][1,col]地图上有边框
133 if (row<1 || row>ROW || col<1 || col>COL)
134 {
135 printf("您输入的坐标非法,请重新输入:\n");
136 continue;
137 }
138 //5.提示玩家翻开的位置是否是地雷,如果是地图就游戏结束
139 if (mine_map[row][col] == ‘1‘)
140 {
141 printf("您踩雷了,游戏结束!\n");
142 //玩家踩雷后,需要告诉玩家当前地图上都有哪些位置是地雷
143 DisplayMap(mine_map);
144 break;
145 }
146 //6.如果当前位置已经把最后一个不是雷的位置翻开了,游戏结束,玩家胜利
147 ++blank_not_mine_count;
148 if (blank_not_mine_count == ROW * COL - MINE_COUNT)
149 {
150 printf("扫雷成功!\n");
151 DisplayMap(mine_map);
152 break;
153 }
154 //7.把这个位置翻开,并计算当前位置周围8个格子中包含几个雷
155 UpdateShowMap(mine_map, show_map, row, col);
156 DisplayMap(show_map);
157 //回到3循环执行
158
159 }
160
161 }
162
163 int main()
164 {
165 while (1)
166 {
167 int choice = Menu();
168 if (choice == 1)
169 {
170 Game();
171 }
172 else
173 {
174 printf("Goodbye!\n");
175 break;
176 }
177 }
178
179
180
181 return 0;
182 }
标签:并且 地图 ring ret 提示 ini 过程 坐标 棋盘
原文地址:https://www.cnblogs.com/cuckoo-/p/10357769.html