其中的open函数在下面讲解。
5.设计随机雷
我们设置雷的个数为10个。
其EASY_COUNT,在上面的宏定义部分有讲到,意思是我们选择了简单模式。
我们使用使用srand和rand函数生成随机数,使得雷的分布为随机位置。
void SetMine(char a[COLS][ROWS], int col, int row) { int set = EASY_COUNT; do { int x = rand() % col + 1; int y = rand() % row + 1;//产生1~9的数字 a[x][y] = '1'; set--; } while (set != 0); }
在show数组中,用字符‘0’表示无雷区域,用字符‘1’表示有雷区域,
至于rand函数,我在 “ 三子棋 ” 和 “ 猜数字 ”的博客中都有提到,大家可以去看看,支持一下,蟹蟹大家!!
6.统计周围雷的个数
int FindMine(char a[COLS][ROWS], int x, int y) { return (a[x - 1][y - 1] + a[x - 1][y] + a[x - 1][y + 1] + a[x][y - 1] + a[x][y + 1] + a[x + 1][y - 1] + a[x + 1][y] + a[x + 1][y + 1] - 8 * '0'); }
show数组是字符类型的数组,我们将周围8格的数字加起来再减去8个字符零,就能得到雷数目。
通过它统计已选位置周围八个位置中含有雷的个数,并在该位置上数字的形式打印出来。
7.当周围无雷时展开空白
倘若我们只能一个一个格子来点,那会使游戏非常复杂,为此,当一个格子周围没有雷时,我们需要让它展开一片空白。我们将用递归来实现这样的操作。
void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) { if (x >= 1 && x <= ROWS-2 && y >= 1 && y <= COLS-2) { int count = FindMine(show, x, y); if (count != 0) { mine[x][y] = count + '0';//如果该格子周围雷的个数不为0,我们就把该格子周围雷的个数传到玩家玩的show棋盘对应的格子中,而如果是0,我们传入空格‘ ’ } else if (mine[x][y] != ' ') { mine[x][y] = ' '; int i = 0; for (i = x - 1; i <= x + 1; i++) { int j = 0; for (j = y - 1; j <= y + 1; j++) { open(mine, show, i, j);//不停调用函数,直到周围有雷为止 } } } else { return; } } }
接下来让我们快乐地来上一局!
接下来就愉快地被炸死了,过程太惨,就不发了。
最后,总结一下各部分文件。
game.h
#pragma once #define COLS 11 #define ROWS 11 #define EASY_COUNT 10 #include<stdio.h> #include<stdlib.h> #include<time.h> void InitBoard(char a[COLS][ROWS], int col, int row, char set); void DisplayBoard(char a[COLS][ROWS], int col,int row); void SetMine(char a[COLS][ROWS], int col, int row); void BreakBoard(char mine[COLS][ROWS],char show[COLS][ROWS], int col, int row); int FindMine(char a[COLS][ROWS], int col, int row); void menu(); void open(char mine[COLS][ROWS],char show[COLS][ROWS], int col, int row);
game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void InitBoard(char a[COLS][ROWS], int col, int row, char set) { int i, j; for (i = 0;i <=col;i++) { for (j = 0;j <=row;j++) { a[i][j] = set; } } } void DisplayBoard(char a[COLS][ROWS], int col, int row) { int i, j; printf("********扫雷*******\n"); for (i = 0;i < 10;i++) { printf("%d ", i); }printf("\n"); for (i = 1;i < 10;i++) { printf("%d ", i); for (j = 1;j < 10;j++) { printf("%c ", a[i][j]); } printf("\n"); } } void SetMine(char a[COLS][ROWS], int col, int row) { int set = EASY_COUNT; do { int x = rand() % col + 1; int y = rand() % row + 1; a[x][y] = '1'; set--; } while (set != 0); } void BreakBoard(char mine[COLS][ROWS],char show[COLS][ROWS], int col, int row) { int x, y, set, k = 0; do { scanf("%d%d", &x, &y); if (x >= 1 && x <= 9 && y >= 1 && y <= 9) { if (show[x][y] == '1') { DisplayBoard(show, COLS, ROWS); printf("很遗憾,你被炸死\n"); break; } else { open(mine, show, x, y); DisplayBoard(mine, COLS, ROWS); printf("未发现危险\n"); k++; } } else { printf("重新输入\n"); } if (k == 71) { printf("恭喜你,扫雷成功!\n"); break; } } while (k<71); } int FindMine(char a[COLS][ROWS], int x, int y) { return (a[x - 1][y - 1] + a[x - 1][y] + a[x - 1][y + 1] + a[x][y - 1] + a[x][y + 1] + a[x + 1][y - 1] + a[x + 1][y] + a[x + 1][y + 1] - 8 * '0'); } void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) { if (x >= 1 && x <= ROWS-2 && y >= 1 && y <= COLS-2) { int count = FindMine(show, x, y); if (count != 0) { mine[x][y] = count + '0'; } else if (mine[x][y] != ' ') { mine[x][y] = ' '; int i = 0; for (i = x - 1; i <= x + 1; i++) { int j = 0; for (j = y - 1; j <= y + 1; j++) { open(mine, show, i, j); } } } else { return; } } }
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void game() { char mine[COLS][ROWS], show[COLS][ROWS]; InitBoard(mine, COLS, ROWS, '*'); InitBoard(show, COLS, ROWS, '0'); DisplayBoard(mine, COLS, ROWS); SetMine(show, COLS-2, ROWS - 2); //DisplayBoard(show, COLS, ROWS); BreakBoard(mine,show, COLS-2, ROWS-2); open(mine, show, COLS - 2, ROWS - 2); } void menu() { printf("**************************\n"); printf("******** 1 play ********\n"); printf("******** 0 exit ********\n"); printf("**************************\n"); } int main() { int input; srand((unsigned int)time(NULL)); do { menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case 0:printf("游戏结束\n"); break; default:printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }
如果您觉得我写得好,不妨给我点赞,关注来鼓励我,我一定会继续努力的!
咱们下次再见!