C语言实现简易的扫雷小游戏

这是一个用C语言实现的控制台扫雷小游戏,实现了随机布置炸弹、扫描炸弹、标记炸弹、百分百第一次不被炸死等功能。

编译器:vs2015

功能模块图

源代码

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

void show(int cbd[10][10],int u[10][10])  //界面输出函数
{
    int i, j;
    //for (i = 0; i < 10; i++)  //输出全部炸弹信息(上帝视角,调试用)
    //{
    //  for (j = 0; j < 10; j++)
    //  {
    //      printf("%2d ", cbd[i][j]);
    //  }
    //  printf("\n");
    //}
    printf("     1 2 3 4 5 6 7 8 9 10\n"); //行标
    printf("    --------------------\n");
    for (i = 0; i<10; i++)  //根据u数组和cbd数组的值选择输出
    {            //■:未扫描,□:周围无炸弹,◇:炸弹标记
        for (j = 0; j<10; j++)
        {
            if (j == 0)printf("%2d║ ", i+1);
            if (u[i][j] == 0)printf("■");
            else if (u[i][j] == 1)
            {
                if (cbd[i][j] == 0)printf("□");
                else printf("%2d", cbd[i][j]);
            }
            else if (u[i][j] == -1) 
            {
                printf("◇");
            }
        }
        printf("\n");
    }
}

int find(int cbd[10][10], int i, int j)  //扫描周围炸弹数目
{
    int l, c,lmin,cmin, lmax, cmax, num = 0;
    l = lmin = (i - 1) >= 0 ? (i - 1) : 0;  //计算行、列起点
    c = cmin = (j - 1) >= 0 ? (j - 1) : 0;
    lmax = ((i + 1) < 10 ? (i + 1) : 9);  //计算行、列终点
    cmax = ((j + 1) < 10 ? (j + 1) : 9);

    for (l = lmin; l <= lmax; l++)
    {
        for (c = cmin; c <= cmax; c++)
        {
            if (l == i&&c == j)continue;  //跳过自身
            if (cbd[l][c] == -1)num++;  //炸弹计数
        }
    }
    return num;
}

void init(int cbd[10][10])   //cbd数组初始化(随机布置炸弹并填充各个格子的数目)
{
    int n = 10, l, c, i, j;
    srand(time(NULL));    //随机数种子设置
    for (i = 0; i< 10; i++)
    {
        for (j = 0; j< 10; j++)
        {
            cbd[i][j] = 0;  //全0填充
        }
    }
    while (n--)   //随机行列放置炸弹
    {
        l = rand() % 10;
        c = rand() % 10;
        if (cbd[l][c] != -1)cbd[l][c] = -1;   //炸弹重复处理
        else n++;
    }
    for (i = 0; i< 10; i++)
    {
        for (j = 0; j< 10; j++)
        {
            if (cbd[i][j] != -1)
            {
                cbd[i][j] = find(cbd, i, j); //炸弹数目填充
            }
        }
    }
}

void open(int cbd[10][10],int u[10][10], int i, int j)  //周围无炸弹时的展开函数(递归展开)
{
    u[i][j] = 1;
    if (cbd[i][j] == 0)
    {
        if(i - 1 >= 0 && u[i - 1][j] != 1)open(cbd, u, i - 1, j);   //上
        if(j - 1 >= 0 && u[i][j - 1] != 1)open(cbd, u, i, j - 1);   //左
        if (i + 1 <= 9 && u[i + 1][j] != 1)open(cbd, u, i + 1, j);  //下
        if (j + 1 <= 9 && u[i][j + 1] != 1)open(cbd, u, i, j + 1);  //右
    }
}

int judge(int u[10][10]) //判断游戏是否通关
{
    int i, j, num = 0;
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            if (u[i][j] == 0 || u[i][j] == -1)num++;
        }
    }
    if (num == 10)return 1;
    else return 0;
}

void fail(int cbd[10][10], int u[10][10])  //游戏失败函数
{
    int i, j;
    for (i = 0; i < 10; i++)   //输出全部炸弹信息
    {
        for (j = 0; j < 10; j++)
        {
            if (cbd[i][j] == 0)printf("  ");
            else if (cbd[i][j] != -1)printf("%2d", cbd[i][j]); 
            else printf("●");
        }
        printf("\n");
    }
    printf("请大侠重新来过~\n");
}

void menu(int cbd[10][10],int u[10][10])  //菜单函数
{
    int chs,i,j;
    int boom = 10;  //剩余炸弹数
    int num = 0;   //步数
    while (1)                                   
    {
        system("cls");
        show(cbd,u);
        printf("还有%d个炸弹\n",boom);
        printf("1.扫描    2.标记    3.取消标记\n");
        printf("请输入选项:>");
        scanf("%d", &chs);
        if (chs > 3 || chs < 1) {
            printf("请输入正确选项!\n");
            system("pause");
            continue;
        }
        printf("请输入坐标:>");
        scanf("%d %d", &i, &j);
        if (i < 1 || i>10)
        {
            printf("请输入正确坐标!\n");
            system("pause");
            continue;
        }
        i--;  //输入行列数处理(适用数组下标)
        j--;
        if (chs == 1)
        {
            if (cbd[i][j] == -1) {
                if (num == 0) { //若第一步扫描到炸弹,就重新初始化棋盘
                    init(cbd);
                    show(cbd, u);
                    open(cbd, u, i, j);
                    num++;
                    continue;
                }
                else
                {
                    fail(cbd, u);  //否则游戏失败,循环跳出
                    break;
                }
            }
            if (u[i][j] == 1)  //重复扫描时的处理
            {
                printf("该位置已经扫描过了!\n");
                system("pause");
                continue;
            }
            open(cbd, u, i, j);
            num++;
        }
        else if(chs == 2)
        {
            if (u[i][j] == 1) {
                printf("该位置已经扫描过了!\n"); //只能标记未扫描到的
                system("pause");
                continue;
            }
            u[i][j] = -1;
            boom --;            
        }
        else if (chs == 3)
        {
            if (u[i][j] != -1) {
                printf("该位置没有标记!\n"); //只能取消标记过的
                system("pause");
                continue;
            }
            u[i][j] = 0;
            boom++;
        }
        if (judge(u))  //判断游戏是否通关
        {
            printf("Old Fe 666!\n"); //老铁666!,循环跳出
            break;
        }
    }
}

int main()
{
    int cbd[10][10] = { 0 }; //保存炸弹信息的二维数组
    int u[10][10] = { 0 };  //保存是否翻开信息的二维数组
    init(cbd);   //数组初始化
    menu(cbd, u);  //进入菜单
    return 0;
}

Tips:在扫描到周围无炸弹的格子时,要将此格子周围的部分依次打开,直到上下左右都出现炸弹数字为止,这里要用到递归的方法,我的顺序为依次递归处理上、左、下、右的格子,这里顺序可以任意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现扫雷小游戏(扩展版)

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 实现的拓展功能如下: 1.设置游戏难度等级2.保证玩家在第一把踩雷后不被炸死3.若排雷的地方无雷,自动扩展到有雷的周围,并给出雷数4.标记(相当于扫雷游戏中的插旗子)5.取消标记 分析: 1.用二维字符数组mine[ROWS][COLS]来存储雷,现在我们用字符1来表示有雷,字符0表示无雷.用二维字符数组show[ROWS][COLS]将所有的元素初始化为*,并打印作为展现给玩家的.同时用show数组来表示对应的min

  • C语言详细讲解通过递归实现扫雷的展开

    目录 用户选择菜单 棋盘初始化 布置雷(随机布置) 打印棋盘 玩家下棋 棋盘展开 展开部分思维导图 展开函数最后一个else return 作用 周围雷个数判断 用户选择菜单 void menu() { printf("****************************\n"); printf("******** 1.play **********\n"); printf("******** 0.exit **********\n"); p

  • C语言实现自定义扫雷游戏(递归版)

    本文实例为大家分享了C语言自定义扫雷游戏的具体代码,供大家参考,具体内容如下 实现过程 对于用C语言实现扫雷游戏得实现,可将游戏过程分为两个板块. 实现游戏关键功能得函数 搭建合理得游戏过程 实现游戏关键功能 为了将游戏功能方便管理和键入,首先我们创建一个头文件,mine.h对游戏功能进行声明.然后创建对应的源文件mine.c对这些函数进行定义. 对于游戏功能,我们首先想到的是构建一个目标规格的雷盘,也就是二维数组.为了使游戏更具可玩性,所以雷盘的规格应可以自定义.所以在mine.h头文件中,应

  • C语言实现扫雷游戏详细流程

    目录 前言 头文件部分 主函数部分(源文件) 函数定义(原文件) 1.菜单打印 2.初始化棋盘 3.打印棋盘 4.生成地雷 5.数雷并赋值给trueboard 6.排查雷区 7.展开 8.判断输赢 前言 嘿!是不是写扫雷小游戏的时候发现一个个输入太慢了?是不是想要展开却发现陷入了死递归?让小黄教教你怎么巧妙地解决这个问题吧! 其实总结起来就是一句话“可以让计算机多判断,但是不能让他多算”.只要每次判断一个格子周围雷数的时候赋值到另一个棋盘,后续递归的时候就不判断这个地方的棋盘就解决啦! PS:采

  • C语言扫雷排雷小游戏实现全程

    目录 test.c game.h game.c 详解游戏代码的实现 1初化扫雷区 2打印扫雷区 3 设置雷 4 排雷 4.1展开一片的功能 4.2雷标记功能的实现 游戏过程 test.c 在这个文件中,我们主要是完成游戏逻辑的测试,在这里我们要注意的点,我们建立了二个数组,mine数组我们用来存放布置雷的信息,show数组存放排查出雷的信息.本次排雷区域是9*9的格子,为了防止数组出现越界,我们特意把数组的下标定义大点变为11*11. #define _CRT_SECURE_NO_WARNING

  • C语言实现递归版扫雷游戏实例

    目录 思路 清晰的逻辑 菜单 棋盘 布置雷 排雷 判断输赢 text.c实现 game.c实现 game.h实现 递归部分详解 总结 思路 清晰的逻辑 为方便将其分为三个文件:text.c(测试) game.c(函数实现) game.h(头文件声明) 在排雷的时候为了方便,我们需要将每一行每一列对应的行数,列数打印出来. #define LEI 10 #define ROW 10 #define LOW 10 #define ROWS ROW+2 #define LOWS LOW+2 //在定义

  • C语言实现第一次防死版扫雷游戏

    目录 前言 一.功能描述 二.实现的步骤 1.菜单的打印函数: 2.初始化雷盘函数: 3.打印雷盘函数: 4.埋雷函数: 5.排雷函数: 6.防止第一次死的函数: 7.展开函数: 总结 前言 扫雷这款经典的游戏想必大多数人都玩过了,今天用C语言实现了扫雷小游戏,小伙伴们快来看看吧. 一.功能描述 扫雷代码有以下功能: 1.若输入的坐标周围没雷,可以直接展开 2.防止第一次玩就直接踩雷,被炸死 3.若输入的坐标周围有雷,会显示周围雷的个数 4.若排雷失败,会展示出雷图的雷分布是怎样的 二.实现的步

  • C语言实现经典扫雷小游戏完整代码(递归展开 + 选择标记)

    目录 游戏介绍 游戏整体框架 游戏具体功能及实现 1.雷盘的定义 2.雷盘的初始化 3.布置雷 4.排查雷 5.递归式展开一片 6.获取周围雷的个数 7.标记特定位置 8.打印雷盘 游戏完整代码 1.test.c 2.game.h 3.game.c 游戏效果展示 大家好,今天我们将一起用C语言实现一个经典小游戏 – 扫雷,Let is go ! 游戏介绍 扫雷游戏相信大家都玩过,上图就是一个网页版的扫雷,它的规则是玩家选择一个方格,若此方格没有地雷,那么该方格会显示与它相邻的八个方格中雷的个数,

  • C语言实现简易的扫雷小游戏

    这是一个用C语言实现的控制台扫雷小游戏,实现了随机布置炸弹.扫描炸弹.标记炸弹.百分百第一次不被炸死等功能. 编译器:vs2015 功能模块图 源代码 #include<stdio.h> #include<stdlib.h> #include<time.h> void show(int cbd[10][10],int u[10][10])  //界面输出函数 {     int i, j;     //for (i = 0; i < 10; i++)  //输出全

  • C语言实现简易版扫雷小游戏

    本文实例为大家分享了C语言实现简易版扫雷的具体代码,供大家参考,具体内容如下 声明 本次扫雷小游戏用多文件来编写.首先,要自定义的一个头文件 mine.h,里面有扫雷程序里面所需要的头文件.常量和所有函数的声明.其次,创建主函数 test.c,用自己喜欢的方式构建一个游戏的框架,最后,创建自定义函数 mine.c,编写各项功能. 设计思路 1.先写主函数,理清整个游戏流程. int main() { int quit = 0; do{ int select = 0; Menu(); scanf(

  • C语言开发简易版扫雷小游戏

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地

  • 基于C语言实现简单的扫雷小游戏

    本文实例为大家分享了C语言实现简单的扫雷小游戏的具体代码,供大家参考,具体内容如下 首先来规划一下扫雷游戏实现的几个步骤: 初始化棋盘:二维数组的遍历及赋值 为了后续代码的简洁方便,我们用'0'来初始化 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++

  • C语言简易实现扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 经典扫雷游戏规则: 当玩家点击游戏区域,该处周围的八个位置有几个雷(如果是角落则是周边三个位置雷的个数,边缘位置同理),就展示数字几.如果该处是雷则直接结束游戏. 用C语言实现基本思路: 假设我们要实现一个9*9棋盘的扫雷,为了计算边缘或者角落雷的个数我们可以将雷区变成12*12的棋盘,将最外围的棋盘全部变为0,这样不论是哪个位置的雷,我们都可以计算其周边8个位置雷个数的和, 1.设置游戏菜单,让用户输入数据选择是否进

  • C语言实现简单的扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 在编写扫雷小游戏之前,第一,我们应该列出我们想要实现的扫雷小游戏的功能: 1.显示选中的坐标周围的雷的个数. 2.保证第一次选中的坐标不是雷. 3.选中的坐标周围8个格子中没有雷,则展开. 第二,我们应该明白我们需要两个棋盘来实现扫雷游戏:一个棋盘用来展示给玩家,初始界面全为" * " (未翻开的格子),这个页面就是我们常见的扫雷页面.另一个棋盘用来给编写者看,棋盘内只有字符'1'和字符'0' .'1'代表雷

  • C语言代码实现简单扫雷小游戏

    用C语言写一个简单的扫雷,供大家参考,具体内容如下 1.所需要的知识 c语言的基本语法,简单的二维数组,一点简单的递归知识. 2.总体思路 扫雷游戏主要由3个部分组成,埋雷子,扫雷,判断输赢. 扫雷游戏的主体是两个个字符类型的二维数组.一个是mine[][]它的构成是'0'和'1',其中'0'表示无雷,'1'表示有雷.一个是show[][]它的构成是'*'和'数字'.星号表示未开启的地方,数字表示周围的雷数.这里要注意的是:mine和show的实际大小是11x11,但是展示的效果是 9x9.这样

  • C语言实现简易的扫雷游戏

    本文实例为大家分享了C语言实现简易的扫雷游戏的具体代码,供大家参考,具体内容如下 在正式讲内容之前先说一说扫雷游戏的规则 游戏规则很简单,点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利 .刚开始需要碰运气,只要点开一个区域,就可以正式开始了. 3.根据现有情况,判断出一定有雷的位置. 4.进一步计算,因为"2"右边的"1"已经有从属的雷了,所以右边的"2"的正下方没有雷,因此可以判断出左边有两颗雷,满足两个"2". 5.

  • C语言实现简单扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 语言写一个简单的扫雷游戏 */ // 1.写一个游戏菜单 Menu() // 2.开始游戏 // 1.初始化二维数组 Init_Interface() // 2.打印游戏界面 Print_Interfa

  • C语言代码实现扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 主页面: 游戏页面: 虽然页面比较low,但我已经尽力了 具体代码实现: #include<stdio.h> #include<windows.h> #include<conio.h> #include<stdlib.h> #include<time.h> int n;//记录已经探索的区域数 int x,y;//光标的横纵坐标 int T;//判断游戏是否失败,T=1

随机推荐