# c语言学完数组就能做的小游戏--扫雷

## 游戏介绍：

《扫雷》是一款大众类的益智小游戏，于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子，同时避免踩雷，踩到一个雷即全盘皆输。

## 代码：

### 1.test.c源文件下：

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"

void menu() {
printf("******************\n");
printf("****1 play********\n");
printf("****2 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, '*');
//打印
PrintBoard(show, ROW, COL);

//设置雷
SetMine(Mine, ROW, COL);
//排雷
FindMine(Mine,show,ROW,COL);

}

int main() {
srand((unsigned int)time(NULL));
int input = 0;
do {
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("%d\n", 1);
game();
break;
case 2:
printf("退出游戏\n");
break;
default:
printf("输入有误\n");
break;
}

} while (input!=2);

return 0;
}

### 2.game.c源文件下：

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int row, int col, char set) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
//printf("%d %d\n", i, j);
board[i][j] = set;
//printf("%c ", set);
}
}
}

//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col) {
printf("*****排雷*****\n");
for (int i = 0; i <= col; i++)
printf(" %d", i);
printf("\n");

for (int i = 1; i <= row; i++) {
printf(" %d", i);
for (int j = 1; j <= col; j++) {
printf(" %c", board[i][j]);
}
printf("\n");
}
printf("*****排雷*****\n");
}

//设置雷
void SetMine(char Mine[ROWS][COLS], int row ,int col) {
int num = 0;
while (num < Easy_conut) {
int x = rand() % row + 1;
int y = rand() % col + 1;
if (Mine[x][y] == '0') {
Mine[x][y] = '1';
num++;
}
}
}

//计算周围有多少个雷
static int FindAround(char Mine[ROWS][COLS], int x, int y) {
int dx[8] = { -1,-1,-1,0,0,1,1,1 };
int dy[8] = { -1,0,1,-1,1,-1,0,1 };
int num = 0;
for (int i = 0; i < 8; i++) {
int a = x + dx[i];
int b = y + dy[i];
if (Mine[a][b] == '1') {
num++;
}
}
//printf("num==%d\n", num);
return num;
}

//连带排雷bfs

static void bfsfind(int st[ROWS][COLS], char Mine[ROWS][COLS],char show[ROWS][COLS],int row,int col,int x,int y) {
int dx[8] = { -1,-1,-1,0,0,1,1,1 };
int dy[8] = { -1,0,1,-1,1,-1,0,1 };

for (int i = 0; i < 8; i++) {
int a = x + dx[i];
int b = y + dy[i];
int k = FindAround(Mine, a, b);
if (a>=1&&a<=row&&b>=1&&b<=col&&st[a][b] == 0 && k == 0&&show[a][b]=='*'&&Mine[a][b]!='1') {
st[a][b] = 1;
show[a][b] = '-';
bfsfind(st, Mine, show, row, col, a, b);
}
else if (a >= 1 && a <= row && b >= 1 && b <= col && st[a][b] == 0 && k > 0 && show[a][b] == '*'&&Mine[a][b]!='1') {
st[a][b] = 1;
show[a][b] = k + '0';
}
}
}
//判断是否赢了
static int Iswin(char show[ROWS][COLS], int row, int col,int target) {
int num = 0;
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= col; j++) {
if (show[i][j] == '*')
num++;
}
}
if (num == target)return 1;
return 0;
}

//排雷
void FindMine(char Mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x = 0;
int y = 0;
int win = 0;
int st[ROWS][COLS] = { 0 };
memset(st, 0, sizeof st);
while (win<(row*col-Easy_conut)) {
printf("请输入排雷的坐标->\n");
scanf("%d %d", &x, &y);
//合法
if (x >= 1 && x <= row && y >= 1 && y <= col) {
if (show[x][y] != '*') {
printf("这个位置已经被排过了\n");
}
else {
//如果这个位置是雷
if (Mine[x][y] == '1') {
printf("你踩到雷了，游戏结束\n");
PrintBoard(Mine, ROW, COL);
break;
}
else {
//if (win);
//计算周围有多少个雷
int k = FindAround(Mine, ROW, COL);
//周围的周围要是都没有雷
show[x][y] = '-';
//搜索过就置1
st[x][y] = 1;
bfsfind(st, Mine, show, row, col, x, y);
if (Iswin(show, ROW, COL, Easy_conut) == 1) {
printf("恭喜你把所有雷都排成功了\n");
PrintBoard(Mine, ROW, COL);
win = 0;
break;
}
PrintBoard(show, ROW, COL);
}
}
}
else {
printf("输入不合法\n");
}
}
//胜利
if (win == (row * col - Easy_conut)) {
printf("恭喜你把所有雷都排成功了\n");
}

}

### 3.game.h头文件下：

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>

#define ROWS 11
#define COLS 11

#define ROW 9
#define COL 9

#define Easy_conut 5

void InitBoard(char board[ROWS][COLS], int row, int col, char set);//初始化棋盘

void PrintBoard(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);//排雷

|
3天前
|
C语言
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
13 0
|
7天前
|

C语言之数组
C语言之数组
13 1
|
7天前
|

【C语言基础】：数组
【C语言基础】：数组
17 1
|
15天前
|

C语言学习记录——7000+字长文-复习&学习指针（指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针）二
C语言学习记录——7000+字长文-复习&学习指针（指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针）二
14 1
|
15天前
|

C语言学习记录——7000+字长文-复习&学习指针（指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针）一
C语言学习记录——7000+字长文-复习&学习指针（指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针）一
12 1
|
16天前
|

C语言——oj刷题——字符串左旋和轮转数组
C语言——oj刷题——字符串左旋和轮转数组
10 1
|
15天前
|
C语言
C语言小插曲——对图形库的初步探索（消除小球小游戏）
C语言小插曲——对图形库的初步探索（消除小球小游戏）
11 0
|
15天前
|
C语言
C语言学习记录——鹏哥扫雷项目实现及递归展开、记录雷坐标
C语言学习记录——鹏哥扫雷项目实现及递归展开、记录雷坐标
19 0
|
15天前
|
C语言
C语言学习记录——矩阵转换（定义一个数组实现或定义两个数组实现）
C语言学习记录——矩阵转换（定义一个数组实现或定义两个数组实现）
11 0
|
15天前
|
C语言
C语言学习记录——找数组中的鞍点
C语言学习记录——找数组中的鞍点
6 0