一,游戏规则
1.输入9*9的格的坐标(*显示其坐标未被选择过)(共有10颗雷)
扫雷(C语言)
2.如果是雷,游戏结束
3.如果不是,将显示所点击的位置相邻八个位置有几颗雷
扫雷(C语言)
4.若除了雷位未选后,玩家胜利
例:(有80颗雷)

-------------------------------
-------------------------------
----1.play       0.exit--------
-------------------------------
-------------------------------
请输入(0/1):3
输入错误,请重新输入
-------------------------------
-------------------------------
----1.play       0.exit--------
-------------------------------
-------------------------------
请输入(0/1):1
扫雷游戏开始
0 1 2 3 4 5 6 7 8 9
1 * * * * * * * * *
2 * * * * * * * * *
3 * * * * * * * * *
4 * * * * * * * * *
5 * * * * * * * * *
6 * * * * * * * * *
7 * * * * * * * * *
8 * * * * * * * * *
9 * * * * * * * * *
//有雷的为1
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 0
请输入坐标(行 列):9 9
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 0
恭喜你游戏成功
-------------------------------
-------------------------------
----1.play       0.exit--------
-------------------------------
-------------------------------
请输入(0/1):1
扫雷游戏开始
0 1 2 3 4 5 6 7 8 9
1 * * * * * * * * *
2 * * * * * * * * *
3 * * * * * * * * *
4 * * * * * * * * *
5 * * * * * * * * *
6 * * * * * * * * *
7 * * * * * * * * *
8 * * * * * * * * *
9 * * * * * * * * *
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 0 1 1
4 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 1
请输入坐标(行 列):8 7
很遗憾,你被炸死了,游戏结束
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 0 1 1
4 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 1
-------------------------------
-------------------------------
----1.play       0.exit--------
-------------------------------
-------------------------------
请输入(0/1):0
退出游戏

二,游戏代码分析
1.设置游戏菜单,让玩家选择
输入1,游戏开始
输入0,游戏结束
输入其他值,提示输入错误,重新输入

void mnue()
{
    printf("-------------------------------\n");
    printf("-------------------------------\n");
    printf("----1.play       0.exit--------\n");
    printf("-------------------------------\n");
    printf("-------------------------------\n");
}
void test()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do
    {
        mnue();
        printf("请输入(0/1):");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("游戏开始\n");
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
    } while (input);
}

int main()
{
    test();
    return 0;
}

游戏效果:
扫雷(C语言)
2.由于输入坐标后,如果没踩雷,要显示周围八个位置共有几颗雷,为了防止数组的溢出选用11*11的棋盘
扫雷(C语言)
将字符‘0’放入不是雷的位置中
将字符‘1’放入是雷的位置中
所以将创造两个数组
1.一个数组将存储雷的信息
2.另一个数组排查出的雷的信息
扫雷(C语言)
一个数组初始化为‘0’
扫雷(C语言)
一个数组初始化为‘*’
扫雷(C语言)
函数的初始化
注意:设置一个变量用来接收初始化的结果,可以使不同的二维数组初始化为不同的值

void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
    int i = 0;

    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            board[i][j] = set;
        }
    }
}

扫雷(C语言)
3.函数的打印函数
注意打印的是9*9的棋盘
为了便于阅读,将坐标也打印了出来

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
    int i = 0;
    for (i = 0; i <= col; i++)
    {
        printf("%d ", i);
    }
    printf("\n");
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);
        int j = 0;
        for (j = 1; j <= col; j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
}

4.随机布置10个雷
将有10个雷要布置
扫雷(C语言)
将雷设为字符‘1’
扫雷(C语言)
一个数%9那么这个数在0到8之间
若再加一那么这个数将在1-9之间

void SetMine(char board[ROWS][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    int count = EASY_COUNT;
    while (count)
    {
        x = rand() % row + 1;//1-8+1//1-9
        y = rand() % col + 1;//1-8+1//1-9
        if (board[x][y] == '0')
        {
          board[x][y] = '1';
            count--;
        }
    }
}

扫雷(C语言)
5.扫雷
扫雷(C语言)
字符3与字符0差数字3
计算周围8个(炸弹)数组元素为1的方法:
将8个字符元素相加-8个字符0得到的就是字符1的个数
因为返回值是int,所以需要加上字符0,转化为char

//'3'-'0'=3
//'4'-'0'=4
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
    return mine[x - 1][y - 1] +
        mine[x - 1][y] +
        mine[x - 1][y + 1] +
        mine[x][y - 1] +
        mine[x][y + 1] +
        mine[x + 1][y - 1] +
        mine[x - 1][y] +
        mine[x - 1][y + 1] - 8 * '0';
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    printf("请输入坐标(行 列):");
    int x = 0;
    int y = 0;
    scanf("%d%d", &x, &y);
    int win = 0;//从0开始计数
    while (win<col * row - EASY_COUNT)//下的次数小于9*9-10=71次时都未踩到炸弹
    {
        //坐标合法
        if (x > 1 && x <= row && y > 1 && y <= col)
        {
            if (mine[x][y] == '1')//踩雷
            {
                printf("很遗憾,你被炸死了,游戏结束\n");
                DisplayBoard(mine, ROW, COL);
                break;
            }
            else//计算周围八个位置的雷数
            {
                int count = get_mine_count(mine, x, y);
                show[x][y] = count+'0';//存的是字符,返回值是int
                DisplayBoard(mine, ROW, COL);
                win++;
            }
        }
        //坐标非法
        else
            printf("输入错误坐标,请重新输入:\n");
    }
    //两个情况
    //1.break;
    //2. win == col * row - EASY_COUNT
    if (win == col * row - EASY_COUNT)
        printf("恭喜你游戏成功\n");
}

三,用文件实现
扫雷(C语言)
test.c源文件中的内容
调用函数时记得要引头文件(函数的声明一般放在相应的头文件中)
扫雷(C语言)
菜单函数
扫雷(C语言)
游戏的流程控制
扫雷(C语言)
游戏的流程
扫雷(C语言)
game.h头文件的内容
1.行,列
2.雷的个数
3.所用到的头文件
4.函数的声明
扫雷(C语言)
game.c源文件中的内容
调用函数时记得要引头文件(函数的声明一般放在相应的头文件中)
扫雷(C语言)
函数的初始化
扫雷(C语言)
棋盘的打印
扫雷(C语言)
雷设置的位置
扫雷(C语言)
周围8个位置中雷数的总和
扫雷(C语言)
扫雷流程
扫雷(C语言)