#扫雷游戏
这个扫雷游戏和之前的三子棋游戏有异曲同工之处,通过数组初始化棋盘,利用各个函数实现游戏的各个模块功能,玩家利用键盘输入坐标达到翻雷的目的。相似却不尽相同,扫雷游戏需要创作两张地图,一张是初始的图,一张是翻雷过后结果显示。
游戏创作思路:
利用宏定义棋盘的行(row)MAX_ROW 9
列 (col) MAX_COL 9
雷的个数 DEFAULT_MINE_COUNT 10
1、设计主菜单,让玩家选择游戏是否开始
int menu() {
printf("======================\n");
printf(" 1. 开始游戏\n");
printf(" 0. 结束游戏\n");
printf("======================\n");
printf(" 请输入您的选择: ");
int choice = 0;
scanf("%d", &choice);
return choice;
}
1、利用数组初始化两个棋盘“showMap”显示全都设为 * 和“mineMap”.还是利用时间戳随机生成雷(1)
void init(char showMap[MAX_ROW][MAX_COL],
char mineMap[MAX_ROW][MAX_COL]) {
// 1. 初始化 showMap, 全都设为 * 即可
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
showMap[row][col] = '*';
}
}
// 2. 初始化 mineMap, 先全设为 '0', 然后随机生成 N 个 '1'
// N 的值就是 DEFAULT_MINE_COUNT
// 复制粘贴虽然爽, 但是一定要小心~~~
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
mineMap[row][col] = '0';
}
}
int n = DEFAULT_MINE_COUNT;
while (n > 0) {
// 生成雷的随机位置.
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (mineMap[row][col] == '1') {
// 如果当前位置已经有雷了, 就直接进入下次循环, 重新
// 产生随机位置.
continue;
}
mineMap[row][col] = '1';
n--;
}
}
2、将游戏的两个地图打印出来且在玩家每次扫雷结束后更新地图
void printMap(char theMap[MAX_ROW][MAX_COL]) {
/*for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
printf("%c ", theMap[row][col]);
}
printf("\n");
}*/
// 先打印出第一行, 第一行就是包含所有的列号
// 然后在打印下面的每一行的时候再打印行号
printf(" |");
for (int col = 0; col < MAX_COL; col++) {
printf("%d ", col);
}
printf("\n");
printf("--+------------------\n");
for (int row = 0; row < MAX_ROW; row++) {
printf(" %d|", row);
for (int col = 0; col < MAX_COL; col++) {
printf("%c ", theMap[row][col]);
}
printf("\n");
}
}
// 根据当前 row, col 的位置, 计算出当前位置周围有几个雷
// 并且更新显示到 showMap 中.
void updateShowMap(char showMap[MAX_ROW][MAX_COL],
char mineMap[MAX_ROW][MAX_COL], int row, int col) {
int count = 0;
for (int r = row - 1; r <= row + 1; r++) {
for (int c = col - 1; c <= col + 1; c++) {
if (r < 0 || r >= MAX_ROW
|| c < 0 || c >= MAX_COL) {
// r, c 下标越界, 就直接跳过
continue;
}
if (mineMap[r][c] == '1') {
count++;
}
}
}
// 此时 count 里面就已经存好了 row, col 周围 八个格子 的雷的个数
// 把这个结果写到 showMap 中即可.
// 需要把数字 count 转成对应的字符
// 例如 count 为 2, 就需要转成 '2' (ASCII 50)
showMap[row][col] = count + '0';
}
3、玩家通过界面显示的坐标输入想要翻开的坐标即可参与游戏即可。