首页 > 编程语言 > 详细

扫雷(C语言)

时间:2021-02-09 22:08:45      阅读:45      评论:0      收藏:0      [点我收藏+]
一,游戏规则
1.输入9*9的格的坐标(*显示其坐标未被选择过)(共有10颗雷)
技术分享图片
2.如果是雷,游戏结束
3.如果不是,将显示所点击的位置相邻八个位置有几颗雷
技术分享图片
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;
}

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

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;
        }
    }
}

技术分享图片
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个雷要布置
技术分享图片
将雷设为字符‘1’
技术分享图片
一个数%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--;
        }
    }
}

技术分享图片
5.扫雷
技术分享图片
字符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");
}

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

扫雷(C语言)

原文:https://blog.51cto.com/15083388/2622795

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!