C语言扫雷游戏的实现代码

 更新时间:2020年03月16日 12:57:35   作者:Monster_ii  
这篇文章主要为大家详细介绍了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:在扫描到周围无炸弹的格子时,要将此格子周围的部分依次打开,直到上下左右都出现炸弹数字为止,这里要用到递归的方法,我的顺序为依次递归处理上、左、下、右的格子,这里顺序可以任意。

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

相关文章

  • C/C++深入讲解内存管理

    C/C++深入讲解内存管理

    本章主要介绍C语言与C++的内存管理,以C++的内存分布作为引入,介绍C++不同于C语言的内存管理方式(new delete对比 malloc free),感兴趣的朋友来看看吧
    2022-05-05
  • C语言中main函数与命令行参数详细讲解

    C语言中main函数与命令行参数详细讲解

    这篇文章主要为大家详细介绍了C语言main()函数与命令行参数问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-04-04
  • c++难以发现的bug(有趣)

    c++难以发现的bug(有趣)

    这篇文章主要介绍了c++难以发现的bug(有趣)的相关资料,需要的朋友可以参考下
    2017-10-10
  • C语言实现简单的抽奖系统

    C语言实现简单的抽奖系统

    这篇文章主要为大家详细介绍了C语言实现简单的抽奖系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • C语言实现CRC校验算法的示例详解

    C语言实现CRC校验算法的示例详解

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的错误检测技术,用于验证数据在传输或存储过程中是否发生了错误,本文主要介绍了C语言如何实现CRC校验算法,需要的可以参考一下
    2023-08-08
  • C语言栈之顺序栈

    C语言栈之顺序栈

    这篇文章主要为大家详细介绍了C语言的顺序栈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言实现导航功能

    C语言实现导航功能

    这篇文章主要为大家详细介绍了C语言实现导航功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • c++ 头文件<cwchar>中常见函数的实现代码

    c++ 头文件<cwchar>中常见函数的实现代码

    本文记录了c++ 头文件<cwchar>中常见函数的实现,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • C++ 单例模式的详解及实例

    C++ 单例模式的详解及实例

    这篇文章主要介绍了C++ 单例模式的详解及实例的相关资料,这里对单例中的懒汉模式和饿汉模式进行实现和比较,需要的朋友可以参考下
    2017-07-07
  • C语言按关键字搜索文件夹中文件的方法

    C语言按关键字搜索文件夹中文件的方法

    这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论