只需百行C语言代码,轻松实现经典扫雷小游戏!

C语言文章更新目录

C语言学习资源汇总,史上最全面总结,没有之一
C/C++学习资源(百度云盘链接)
计算机二级资料(过级专用)
C语言学习路线(从入门到实战)
编写C语言程序的7个步骤和编程机制
C语言基础-第一个C程序
C语言基础-简单程序分析
VS2019编写简单的C程序示例
简单示例,VS2019调试C语言程序
C语言基础-基本算法
C语言基础-数据类型
C语言中的输入输出函数
C语言流程控制语句
C语言数组——一维数组
C语言数组——二维数组
C语言数组——字符数组
C语言中常用的6个字符串处理函数
精心收集了60个C语言项目源码,分享给大家
C语言核心技术——函数
C代码是怎样跑起来的?
C语言实现字符串的加密和解密
C语言——文件的基本操作
使用C语言链表创建学生信息并且将信息打印输出
图解C语言冒泡排序算法,含代码分析
实例分析C语言中strlen和sizeof的区别
开发C语言的3款神器,VS2019、VScode和IntelliJ Clion
动图图解C语言选择排序算法,含代码分析
动图图解C语言插入排序算法,含代码分析
C语言指针数组和数组指针详解
5分钟搞懂C语言中的传值和传址
C语言——动态数组的创建和使用
C语言中#include<…>和#include“…“的区别
2024年C语言最新经典面试题汇总(1-10)
2024年C语言最新经典面试题汇总(11-20)
C语言中如何动态分配内存并进行操作
如何在C语言中使用命令行参数
【揭秘C语言】零基础也能懂!一篇文章带你掌握C语言指针核心知识点

C语言实例专栏(持续更新中…)

正文

废话不多说,直接上代码

环境

  • Windows11
  • VS2022

源码

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

#define ROW 10 //雷区行数
#define COL 10 //雷区列数
#define MINES 10 //地雷数量
#define BOARD_SIZE ROW * COL //棋盘格子数

char board[ROW][COL]; //棋盘
char vis[ROW][COL]; //标记是否访问过
char mines[ROW][COL]; //地雷位置
int remain; //剩余未揭开的格子数

//插入地雷
void insert_mines()
{
    int r, c, i = 0;
    while (i < MINES) {
        r = rand() % ROW;
        c = rand() % COL;
        if (mines[r][c] == 0) { //如果该格没有地雷
            mines[r][c] = 1; //插入地雷
            i++;
        }
    }
}

//计算周围地雷数
int count_mines(int r, int c)
{
    int i, j, count = 0;
    for (i = r - 1; i <= r + 1; i++) {
        if (i < 0 || i >= ROW) //边界判断
            continue;
        for (j = c - 1; j <= c + 1; j++) {
            if (j < 0 || j >= COL) //边界判断
                continue;
            if (mines[i][j])
                count++;
        }
    }
    return count;
}

//递归揭开一片区域
void dfs(int r, int c)
{
    int i, j;
    vis[r][c] = 1; //标记已访问
    remain--; //未揭开格子数减少
    if (board[r][c] == '*') //如果揭开的是地雷,游戏结束
        return;
    //计算周围地雷数
    int count = count_mines(r, c);
    board[r][c] = count + '0'; //显示周围地雷数
    if (count == 0) { //如果周围没有地雷,继续递归揭开
        for (i = r - 1; i <= r + 1; i++) {
            if (i < 0 || i >= ROW) //边界判断
                continue;
            for (j = c - 1; j <= c + 1; j++) {
                if (j < 0 || j >= COL) //边界判断
                    continue;
                if (!vis[i][j])
                    dfs(i, j);
            }
        }
    }
}

int main()
{
    int i, j;
    srand(time(NULL)); //初始化随机种子
    insert_mines(); //插入地雷
    remain = BOARD_SIZE - MINES; //初始化未揭开格子数
    while (remain > 0) { //如果有未揭开的格子
        //显示棋盘
        printf(" ");
        for (j = 0; j < COL; j++)
            printf("%2d ", j + 1);
        printf("\n");
        printf(" ");
        for (j = 0; j < COL; j++)
            printf("---");
        printf("\n");
        for (i = 0; i < ROW; i++) {
            printf("%2d|", i + 1);
            for (j = 0; j < COL; j++) {
                if (!vis[i][j])
                    printf(" * ");
                else
                    printf(" %c ", board[i][j]);
            }
            printf("|\n");
        }
        printf(" ");
        for (j = 0; j < COL; j++)
            printf("---");
        printf("\n");
        //输入坐标并递归揭开一片区域
        int r, c;
        printf("请输入要揭开的格子坐标(行 列):");
        scanf("%d%d", &r, &c);
        r--; //坐标从1开始,转化为数组下标
        c--;
        if (mines[r][c]) { //如果揭开的是地雷,游戏结束
            printf("游戏结束,你输了!\n");
            return 0;
        }
        dfs(r, c); //递归揭开一片区域
    }
    //如果没有未揭开的格子,游戏胜利
    printf("游戏结束,你赢了!\n");
    return 0;
}

运行结果

在这里插入图片描述
以下是一轮游戏的完整结果

  1  2  3  4  5  6  7  8  9 10
 ------------------------------
 1| *  *  *  *  *  *  *  *  *  * |
 2| *  *  *  *  *  *  *  *  *  * |
 3| *  *  *  *  *  *  *  *  *  * |
 4| *  *  *  *  *  *  *  *  *  * |
 5| *  *  *  *  *  *  *  *  *  * |
 6| *  *  *  *  *  *  *  *  *  * |
 7| *  *  *  *  *  *  *  *  *  * |
 8| *  *  *  *  *  *  *  *  *  * |
 9| *  *  *  *  *  *  *  *  *  * |
10| *  *  *  *  *  *  *  *  *  * |
 ------------------------------
请输入要揭开的格子坐标(行 列):3 3
  1  2  3  4  5  6  7  8  9 10
 ------------------------------
 1| *  *  *  *  *  *  *  *  *  * |
 2| *  *  *  *  *  *  *  *  *  * |
 3| *  *  1  *  *  *  *  *  *  * |
 4| *  *  *  *  *  *  *  *  *  * |
 5| *  *  *  *  *  *  *  *  *  * |
 6| *  *  *  *  *  *  *  *  *  * |
 7| *  *  *  *  *  *  *  *  *  * |
 8| *  *  *  *  *  *  *  *  *  * |
 9| *  *  *  *  *  *  *  *  *  * |
10| *  *  *  *  *  *  *  *  *  * |
 ------------------------------
请输入要揭开的格子坐标(行 列):5 4
  1  2  3  4  5  6  7  8  9 10
 ------------------------------
 1| 0  0  0  0  1  *  *  *  *  * |
 2| 0  0  0  0  1  1  *  *  *  * |
 3| 1  1  1  0  0  1  *  *  *  * |
 4| *  *  1  0  0  1  *  *  *  * |
 5| 1  1  1  0  0  1  1  2  2  2 |
 6| 0  0  0  0  0  0  0  0  0  0 |
 7| 0  0  0  1  1  1  0  0  0  0 |
 8| 0  0  0  1  *  1  0  0  0  0 |
 9| 1  1  1  1  1  1  0  1  1  1 |
10| *  *  1  0  0  0  0  1  *  * |
 ------------------------------
请输入要揭开的格子坐标(行 列):3 8
  1  2  3  4  5  6  7  8  9 10
 ------------------------------
 1| 0  0  0  0  1  *  *  *  *  * |
 2| 0  0  0  0  1  1  *  *  *  * |
 3| 1  1  1  0  0  1  *  4  *  * |
 4| *  *  1  0  0  1  *  *  *  * |
 5| 1  1  1  0  0  1  1  2  2  2 |
 6| 0  0  0  0  0  0  0  0  0  0 |
 7| 0  0  0  1  1  1  0  0  0  0 |
 8| 0  0  0  1  *  1  0  0  0  0 |
 9| 1  1  1  1  1  1  0  1  1  1 |
10| *  *  1  0  0  0  0  1  *  * |
 ------------------------------
请输入要揭开的格子坐标(行 列):1 9
  1  2  3  4  5  6  7  8  9 10
 ------------------------------
 1| 0  0  0  0  1  *  *  *  1  * |
 2| 0  0  0  0  1  1  *  *  *  * |
 3| 1  1  1  0  0  1  *  4  *  * |
 4| *  *  1  0  0  1  *  *  *  * |
 5| 1  1  1  0  0  1  1  2  2  2 |
 6| 0  0  0  0  0  0  0  0  0  0 |
 7| 0  0  0  1  1  1  0  0  0  0 |
 8| 0  0  0  1  *  1  0  0  0  0 |
 9| 1  1  1  1  1  1  0  1  1  1 |
10| *  *  1  0  0  0  0  1  *  * |
 ------------------------------
请输入要揭开的格子坐标(行 列):2 7
  1  2  3  4  5  6  7  8  9 10
 ------------------------------
 1| 0  0  0  0  1  *  *  *  1  * |
 2| 0  0  0  0  1  1  2  *  *  * |
 3| 1  1  1  0  0  1  *  4  *  * |
 4| *  *  1  0  0  1  *  *  *  * |
 5| 1  1  1  0  0  1  1  2  2  2 |
 6| 0  0  0  0  0  0  0  0  0  0 |
 7| 0  0  0  1  1  1  0  0  0  0 |
 8| 0  0  0  1  *  1  0  0  0  0 |
 9| 1  1  1  1  1  1  0  1  1  1 |
10| *  *  1  0  0  0  0  1  *  * |
 ------------------------------
请输入要揭开的格子坐标(行 列):4 7
游戏结束,你输了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言中文社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值