首先,我们先来介绍一下扫雷游戏的规则。
存在一个已经藏好地雷的棋盘,玩家需要输入认为不是地雷的坐标进行排雷的 *** 作,若点击位置没有‘ 雷 ’存在,玩家点击的坐标处就会出现在该位置(以坐标点为中心的3*3二维数组中含雷的个数)
若在排雷过程中,点击到‘ 雷 ’所在坐标,则游戏失败。反之,如果玩家排除所有的非‘ 雷 ’区域,只剩下‘ 雷 ’没被玩家挖掘,则玩家获胜。
现在,我们开始编程试试看吧。
1.棋盘的初始化设计考虑到,游戏过程中‘ 雷 ’盘和展示给玩家观看扫‘ 雷 ’的棋盘如果在同一个二维数组中,会变得相对复杂,而且难以 *** 作,对此,我采用的是‘ 雷 ’盘和棋盘用两个不同的二维数组进行 *** 作。并且展示给玩家的棋盘直接为9*9数组表示的即可。
考虑到待会对于数组行和列会频繁使用,我们将它定义为宏;
考虑到游戏过程中会对选定位置周围‘ 雷 ’数的统计,我们用‘ 1 ’表示地雷,‘ 0 ’表示安全区,所以在初始化过程中我们将整个数组置为0;
防止数组的泄露,我们先将9*9棋盘外围(上下各一行,即11*11)也考虑上,把‘ 雷 ’盘设计为(9+2)*(9+2)的二维数组。
同时,对于‘ 雷 ’的个数,我们也可以设计为可变化的量。
接着,我们要进行的是对数组的初始化 *** 作(对于ROWS*COLS数组),并且由于‘ 雷盘 ’和棋盘上放置的不是同一符号,我们可以将初始化符号也考虑上。(初始化实现过程如下)
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } }
接下来,我们考虑一下棋盘向玩家展示的大致形状,考虑到今后棋盘尺寸的不唯一,我们可以将棋盘设计的灵活些。
void DisplayBoard(char board[ROWS][COLS], int row, int col) { //1~9 int i = 0; int j = 0; //列号的打印 for (i = 0; i <= col; i++) { printf("%d ", i); } printf("n"); for (i = 1; i <= row; i++) { printf("%d ", i);//打印行号 for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("n"); } }2.‘ 雷 ’的布置
按照之前的想法,我们在‘ 雷 ’盘随机分布上相应的‘ 雷 ’数。
void SetMine(char mine[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } }
同时,我们可以开始思考当玩家点击安全区后,怎样进行周围‘ 雷 ’计数的 *** 作。
由于在我们之前的思考中,我们将‘ 雷 ’定为了‘ 1 ’,于是我们可以将玩家点击坐标周围(以给坐标为中心的3*3二维数组)的数据直接相加,得出的数据作为‘ 雷 ’数展示给大家。
static int get_mine_count(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0'; }
当然也可以将‘ 雷 ’设计为其他符号,同样的 *** 作,对于坐标周围进行‘雷’符号的计数即可。
3.扫‘ 雷 ’ *** 作让玩家输入一个排查的坐标,然后在‘ 雷 ’盘中判断玩家输入坐标位置的元素进行是否为‘ 雷 ’;若为雷,则游戏结束,玩家失败,并将‘ 雷 ’盘展示给玩家。若玩家排‘ 雷 ’次数已达安全区最大数量(即数组最大范围减去‘ 雷 ’数),则游戏结束,玩家获胜。
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0; while (win < row * col - EASY_COUNT) { printf("请输入要排查的坐标:>"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾,你踩到雷了n"); DisplayBoard(mine, row, col); break; } else { //计算x,y坐标周围有几个雷 int n = get_mine_count(mine, x, y); show[x][y] = n + '0'; DisplayBoard(show, row, col); win++; } } else { printf("输入坐标非法,无法排雷,请重新输入n"); } } if (win == row * col - EASY_COUNT) { printf("恭喜你,排雷成功n"); DisplayBoard(mine, row, col); } }
最后,不要忘记了在test函数里设置可以让玩家重复游戏的代码。
void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: //扫雷 game(); break; case 0: printf("退出游戏n"); break; default: printf("选择错误n"); break; } } while (input); }
好了,关于扫雷游戏的简单实现,先讲到这里,大家可以自己动手试试看呢。
欢迎大家找出错误和分享更加好的方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)