C语言-使用二维数组实现扫雷
C语言多文件编程简单实现扫雷
扫雷游戏规则简介:
点击一个坐标后会判断该处是否是雷:
1、是雷则游戏结束
2、不是雷则会,计算并显示它的周围(围绕的8个块)雷的个数

扩散问题:
当判断一个块不是雷的同时,计算它的周围的8个块周围雷的个数,迭代计算它的周围的8个块,周围雷个数为零的块继续迭代,直接至附近再没有这样的块为止。
实现:
1、创建两个二维数组,一个数组mine进行雷的布置,初始化为字符‘0’,另一个数组show则是用来显示用户棋盘,初始化为字符‘*’
2、然后对数组mine设置雷,用户输入的坐标与mine数组进行找雷的相应处理,对应修改用户棋盘数组show。
下面是具体的操作及代码:
创建建了三个文件:
- game.h中是各个函数的声明,以及宏定义等
- game.c对游戏相关函数的实现
- test.c中是主函数以及菜单的实现
test.c代码:
# define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("***********************************************\n"); printf("*************** 1. play ******************\n"); printf("*************** 0. exit ******************\n"); printf("***********************************************\n"); } void game() { //存放布置好雷的信息 char mine[ROWS][COLS] = { 0 }; //存放排查出的雷的信息 char show[ROWS][COLS] = { 0 }; //初始化 InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); system("cls"); //打印棋盘 DisplayBoard(show, ROW, COL); //布雷 SetMine(mine, ROW, COL); //排查雷 FindMine(mine, show, ROW, COL); } 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("退出游戏"); break; default: printf("重新选择:>"); break; } } while (input); } int main() { test(); return 0; }
game.h代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define EASY_COUNT 79 #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set);//初始化棋盘 void DisplayBoard(char board[ROWS][COLS], int row, int col);//打印棋盘 void SetMine(char mine[ROWS][COLS], int row, int col);//布雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//扫雷
game.c代码:
#include "game.h" 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) { 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"); } } 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--; } } } int GetMine(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] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] + mine[x + 1][y - 1] - 8 * '0'); } void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) { int temp = 0; if (show[x][y] == '*') { show[x][y] = GetMine(mine, x, y) + '0'; } if (mine[x][y - 1] == '0'&& y - 1 >= 1 && show[x - 1][y] == '*')//1 x, y - 1 { if ((temp = GetMine(mine, x, y - 1)) == 0) { show[x][y -1] = temp + '0'; OpenMine(mine, show, x - 1, y); } } if (mine[x][y + 1] == '0'&& y + 1 <= COL && show[x][y + 1] == '*')//2 x, y + 1 { if ((temp = GetMine(mine, x, y + 1)) == 0) { OpenMine(mine, show, x, y + 1); show[x][y + 1] = temp + '0'; } } if (mine[x + 1][y] == '0'&& x + 1 <= ROW && show[x + 1][y] == '*')//3 x + 1, y { if ((temp = GetMine(mine, x + 1, y)) == 0) { OpenMine(mine, show, x + 1, y); show[x + 1][y] = temp + '0'; } } if (mine[x - 1][y] == '0'&& x - 1 >=1 && show[x - 1][y] == '*')//4 x - 1, y { if ((temp = GetMine(mine, x - 1, y)) == 0) { OpenMine(mine, show, x - 1, y); show[x - 1][y] = temp + '0'; } } if (mine[x - 1][y + 1] == '0'&& x - 1 >=1 && y + 1 <= COL && show[x - 1][y + 1] == '*')//5 x - 1, y + 1 { if ((temp = GetMine(mine, x - 1, y + 1)) == 0) { OpenMine(mine, show, x - 1, y + 1); show[x - 1][y + 1] = temp + '0'; } } //6 x + 1, y - 1 if (mine[x + 1][y - 1] == '0'&& x + 1 <= ROW && y - 1 >= 1 && show[x + 1][y - 1] == '*') { if ((temp = GetMine(mine, x + 1, y - 1)) == 0) { OpenMine(mine, show, x + 1, y - 1); show[x + 1][y - 1] = temp + '0'; } } //7 x + 1, y + 1 if (mine[x + 1][y + 1] == '0'&& x + 1 <= ROW && y + 1 <= COL && show[x + 1][y + 1] == '*') { if ((temp = GetMine(mine, x + 1, y + 1)) == 0) { OpenMine(mine, show, x + 1, y + 1); show[x + 1][y + 1] = temp + '0'; } } }
int CountBoard(char show[ROWS][COLS]) {
//判断是否已经排查出所有雷 int i = 0; int j = 0; int count = 0; for (i = 1; i <= ROW; i++) { for (j = 1; j <= ROW; j++) { if (show[i][j] == '*') { count++; } } } if (count == EASY_COUNT) { return 0; } else { return 1; } } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { // int x = 0; int y = 0; //9*9 - ASY_COUNT = 71 while (CountBoard(show)) { printf("请输入排查的坐标:>"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { system("cls"); printf("很遗憾,你被炸死了!!!!!\n"); DisplayBoard(mine, row, col); break; } else { OpenMine(mine, show, x, y); system("cls"); DisplayBoard(mine, row, col); DisplayBoard(show, row, col); } } else { printf("请注意,坐标有误,请重新输入:>"); } } if (CountBoard(show) == 0) { printf("恭喜你,排雷成功!!!\n"); DisplayBoard(mine, row, col); } }
浙公网安备 33010602011771号