【C语言】扫雷高级版:可进行展开

C语言实现扫雷(含展开,附源码) 我相信在做的各位都是玩过扫雷的,游戏玩法就不赘述了。 直接进入主题:先思考后敲代码!! 首先,我将扫雷分为两个棋盘,一个放雷,另一个为玩家猜测盘。 这就有同学问了,设置一个棋盘不就完了,这样不就搞复杂了吗? 先简短的回答这位同学的问题: 因为我的考虑是这样的,我用‘1’代表有雷,‘0’代表没有雷,如果放在一个盘中,出现多个1的时候,无法确定这是雷还是代表周围8个格子中有一个雷。 进一步解释 图片参考: 当雷是1,还有记录数字也为1时,以下黄色标记位置为例: ... 阅读详情

  这次是写一个扫雷的小游戏,可实现周围没雷时展开和第一次排雷不被炸死(防止欧皇直接暴毙!)。

首先我们先梳理代码思路:

1、既然要展示和布雷,所以我们需要2个二维数组,一个用来展示给观众,一个显示雷利于我们编程,我们将雷数组初始化为 0 ,将展示的数组初始化为 * ,保持神秘~
2、我们需要将雷布置到雷数组中去,当然是随机布置;
3、我们还需要一个安全函数,就是当第一次排雷的时候不被炸死;(就是如果第一次排的是雷,就将此位置的雷转移)
4、排雷的过程,包括了如何展开,还有表明旁边有几颗雷;

1、初始化数组(mine和show),而且为了边上的坐标也能排雷,所以需要建的数组要比棋盘多两行两列。然后就是初始化数组(mine初始化为字符0,show初始化为 *)
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++)
  {
   board[i][j] = set;
  }
 }
}
2、打印数组,当然要都打印出来以便我们测试(为了排雷方便,我们给数组加上了序号)
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 printf("----------------------------------\n");
 for (i = 0; i <= col; i++)
 {
     printf("%d ", i);   
 }
 printf("\n");
 for (i = 1; i <= row; i++)
 {
     printf("%d ", i);
  for (j = 1; j <= col; j++)
  {  
      printf("%c ", board[i][j]);
  }
  printf("\n");
 }
 printf("----------------------------------\n");
}
3、将雷布置到 mine数组中去,这里我们需要用到随机数,我们用的是rand()这个函数来产生随机数,当然范围要控制在数组范围中
void SetMine(char mine[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int count = EASY_COUNT;
 while (count)
 {
  x = rand() % row + 1;
  y = rand() % col + 1;
  if (mine[x][y] == '0')
  {
   mine[x][y] = '1';
   count--;
  } 
 }
}
4、安全函数,这个函数的作用是保证我们第一次排雷不被炸死…
void SafeMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row, int col)
{
 int ret = 1;
 int x = 0;
 int y = 0;
 int count = 0;
 printf("请输入你要排查的坐标:");
 scanf("%d%d", &x,&y);
 if (mine[x][y] == '1')
 {
  mine[x][y] = '0';
  count = GetMine(mine, x, y);
  show[x][y] = count + '0';

 while (ret)
 {
  if (mine[x][y] == '1')
  {
   int m = rand() % 9 + 1;
   int n = rand() % 9 + 1;
   mine[x][y] = '0';
   mine[m][n] = '1';
  }
  ret--;
 }
 }
 OpenMine(mine, show, row, col,x,y);
 DisplayBoard(show, row, col);
}

5、最后就是排雷的过程了,展开函数也在里面(展开函数是用递归来完成的)

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int win = 0;
 int count = 0;
 while (1)
 {
  printf("请输入要排查的坐标:");
  scanf("%d%d", &x, &y);
  if (x >= 0 && x <= row && y >= 0 && y <= col)
  {
   if (mine[x][y] == '1')
   {
    printf("很遗憾,你被炸死了!\n");
    DisplayBoard(mine, row, col);
    break;
   }
   else
   {   
    count = GetMine(mine, x, y);
    show[x][y] = count+'0';
    OpenMine(mine, show, row, col, x, y);
    DisplayBoard(show, row, col);
    if (MyWin(show,row,col) == EASY_COUNT)
    {
     break;
    }
   }
  }
  else
  {
   printf("坐标非法,请重新输入!\n");
  }
 }
 if (MyWin(show, row, col) == EASY_COUNT)
 {
  printf("恭喜你排雷成功!\n");
  DisplayBoard(mine, row, col);
 }
}

void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y)
{
 int ret = 0;
 ret = GetMine(mine, x, y);
 if (ret == 0) {
  show[x][y] = ' ';
  if (x - 1>0 && y>0 && show[x - 1][y] == '*')
   OpenMine(mine, show, row, col, x - 1, y);
  if (x - 1>0 && y + 1 <= col && show[x - 1][y + 1] == '*')
   OpenMine(mine, show, row, col, x - 1, y + 1);   
  if (x>0 && y + 1 <= col && show[x][y + 1] == '*')
   OpenMine(mine, show, row, col, x, y + 1);
  if (x + 1 <= row && y + 1 <= col && show[x + 1][y + 1] == '*')
   OpenMine(mine, show, row, col, x + 1, y + 1);
  if (x + 1 <= row && y>0 && show[x + 1][y] == '*')
   OpenMine(mine, show, row, col, x + 1, y);
  if (x + 1 <= row && y - 1>0 && show[x + 1][y - 1] == '*')
   OpenMine(mine, show, row, col, x + 1, y - 1);
  if (x>0 && y - 1>0 && show[x][y - 1] == '*')
   OpenMine(mine, show, row, col, x, y - 1);
  if (x - 1>0 && y - 1>0 && show[x - 1][y - 1] == '*')
   OpenMine(mine, show, row, col, x - 1, y - 1);
 }
  else 
  { 
   show[x][y] = GetMine(mine, x, y) + '0';
  } 	
}
6、其中有一个GetMine函数是用来统计周围有多少雷,这个函数写的很巧妙,这也是我们为什么非要设计0和1作为雷数组
int GetMine(char mine[ROWS][COLS], int x, int y)
 {  return mine[x - 1][y] + 
   mine[x - 1][y - 1] +  mine[x][y - 1]
    +  mine[x + 1][y - 1] +  mine[x + 1][y] +
    +   mine[x + 1][y + 1] +  mine[x][y + 1] + 
    +  mine[x - 1][y + 1] - 8 * '0';
}

总结:这个游戏总体来说不是很难,难点就在于展开的那里,是用递归来进行完成的,总体设计和三子棋的界面一样,我们需要注意的就是雷的布置和雷的统计还有雷的展开。

室友说你怎么才学到数组,然后我用C语言做了个扫雷(递归展开+难度选择+优化打印) 该文章优化了扫雷的递归展开、难度选择、棋盘打印,希望能够帮助到你 阅读详情

相关推荐

C语言扫雷(递归展开)(详细注释)(完整代码)

c语言扫雷游戏

AAAAA_9的博客 8894

c语言扫雷(强化版)(可展开)(后附完整代码)

简单简易适合新手的扫雷啦

m0_73790767的博客 1666

C语言模拟实现扫雷游戏(可展开)

<font color=#999AAA > <font color=#999AAA > <hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

「zero」的博客 3440

C语言 扫雷(含递归展开)

想必大家在上学时代都或多或少玩过扫雷游戏,通过棋盘上已有的数据分析出雷所在的位置获取胜利,每一次游戏都带给我们强大的满足感与能力的提升。那么今天我就带领大家用C语言实现扫雷的编写。(长文加详细代码)

weixin_73258319的博客 4509

【C语言】扫雷(递归展开 + 标记功能)

扫雷图文讲解实现 + 递归展开一篇 + 标记功能

StackFrame 2915

2024高教社杯数学建模国赛B题丨国一原创论文解析及源码超详细分享!

继续分享一篇2024国赛B题的国奖论文,包含可运行源代码jupyter,国赛B题通常比较聚焦实际复杂系统的多目标优化决策,主要偏重算法实现与概率建模解决开放性的管理问题。而且高度开放,无标准答案,学科交叉复杂,如资源调度、交通优化、海洋探测等。比较建议有一定统计学基础的同学参加。

ihui永不放弃 6738

C语言“扫雷”(可以展开)

大家在学习C语言的时候是不是有时候会感觉很枯燥,觉得自己学的知识不能整合运用起来,那今天我给大家带来了一个特别适合小白新手的小游戏,这个小游戏也算是整合了一些简单的,分支循环,函数,数组等一些基础的知识,如果你是刚刚接触C语言,那么这个扫雷小游戏教程非常适合你哦 ! ! !

2301_77865915的博客 340

C#上位机与OneNET云平台数据交互实战——基于HTTP与JSON解析

本文详细介绍了使用C#开发上位机软件与OneNET物联网云平台进行数据交互的实战方法。通过构建HTTP请求、解析JSON数据,实现设备数据的实时获取、界面展示与本地存储,为工业监控与数据采集提供了一套完整高效的C#解决方案。

kkk56的博客 219

C语言扫雷(展开功能)

此外,若需将展开部分显示为空白,可考虑使用条件语句,将“show[x][y] = num + '0';”改为“if (num == 0){show[x][y] = ' ';2. 展开功能中所排查坐标的合法性,应为1~ROW、1~COL【ROW:布雷棋盘行数,COL:布雷棋盘列数】1. 函数需返回与判断“排雷成功”条件相关的值(此处为“last”,即剩余需排查的雷的数量)

EZ_st的博客 288

手把手教你用vivado2018.3为复旦微JFMQL15T打IP补丁(含环境变量配置技巧)

本文详细介绍了在Vivado 2018.3环境中为复旦微JFMQL15T开发板打IP补丁的全流程,包括环境变量配置、IP缓存管理等关键步骤。通过实战验证的解决方案,帮助工程师快速搭建开发环境,解决国产芯片开发中的常见问题,提升开发效率。

weixin_30374009的博客 725

MoveIt2项目想换掉KDL求解器?试试这个trac_ik插件(附源码编译避坑指南)

本文详细介绍了如何在MoveIt2项目中用trac_ik插件替代KDL求解器,提升机械臂运动学求解的效率和成功率。内容涵盖环境准备、源码编译避坑、项目集成及性能调优,特别适合需要高精度控制的协作机械臂应用场景。通过实测数据对比,trac_ik在求解时间和奇异点处理上显著优于传统KDL求解器。

weixin_30730053的博客 696

c语言必做——扫雷游戏(含展开一片雷区)

在完成代码之前,我们要先了解一下我们想实现功能1.使用控制台来实现简单扫雷游戏2.游戏通过菜单实现游戏的开始与结束3.扫雷棋盘为9*94.默认随机步至10个雷(当然我们的代码也可以根据要求更改雷的个数5.排查雷如果是雷,提醒玩家被炸死,并提供雷的分布如果不是雷,计算周围一圈雷的数量,并告知玩家,直到所有雷都被排查出来,排雷成功。6.拓展:当不是雷时,能够展开一片提示:以下是本篇文章正文内容,下面案例可供参考。

2301_80151382的博客 1521

从零构建工业级SPI-CAN网关:CH347与CH9431的软硬件协同设计实战

本文详细介绍了基于CH347和CH9431芯片构建工业级SPI-CAN网关的完整方案。通过硬件架构设计、Linux驱动定制、并发处理优化和EMC抗干扰测试,实现高可靠性通信网关,适用于工业自动化和汽车电子等严苛环境。

spark7igniter的博客 632

【C语言】扫雷小游戏详解

在编写扫雷小游戏之前,第一,我们应该列出我们想要实现的扫雷小游戏的功能: 1.显示选中的坐标周围的雷的个数。 2.保证第一次选中的坐标不是雷。 3.选中的坐标周围8个格子中没有雷,则展开。 第二,我们应该明白我们需要两个棋盘来实现扫雷游戏:一个棋盘用来展示给玩家,初始界面全为“ * ” (未翻开的格子),这个页面就是我们常见的扫雷页面。另一个棋盘用来给编写者看,棋盘内只有字符‘1’和字符‘0’ 。‘1’代表雷,‘0’代表非雷。使用字符‘1’‘0’来代表雷和非雷有利于我们下一步计算坐标周围雷的个数。 1.初始

weixin_45177279的博客 1万+

新手必看:C#调用YOLO模型完成图片/视频目标检测(上位机版)

新手学习C#调用YOLO模型,核心是先把基础流程跑通,再逐步优化。图片检测是基础,视频检测就是在图片的基础上加循环和线程,而上位机的实际项目,就是在这个基础上适配工业硬件和业务需求。本文的代码都是新手能直接复制运行的,如果你运行时遇到问题,先检查前期准备是否到位,再看避坑指南。记住,新手别追求一步到位,先实现功能,再慢慢优化性能和界面。等你能熟练调用YOLO模型后,再去研究模型训练、量化优化等进阶内容,会轻松很多。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 987

对CryptoDriver里密钥格式定义的探索(1)

一入网络安全才发现深似海,传统汽车MCU码农转型之路异常艰难。在CP AUTOSAR中的CryptoDriver SWS对密钥格式的需求来源于RFC,其中要求了RSA、ECC、SHE等key material的格式。再往下看,我就有些迷糊了,例如关于RSA Private Key的OCTEE STRING格式根据IETF RFC8017,Public Key又得根据RFC5280,完全不得其解。所以今天先从生成密钥对,并对其进行解析开始,一步一步拆解。

认真搞搞汽车MCU 527

C语言实现扫雷(包含递归展开)

C语言实现扫雷(包含递归展开)

2301_76269963的博客 1877

EtherCAT从站EEPROM组成信息详解(2):字8-15产品标识区

以实际的从站EEPROM数据为例,参照EtherCAT的SII规范,详细分析了从站EEPROM字8-字15的产品标识区内容组成。

kevin1499的博客 719

C语言实现扫雷——详解

扫雷大家应该都玩过,这是一个十分经典的游戏,今天我将给大家讲解如何用C语言多文件编程实现扫雷,我的这个扫雷有如下几个功能: 显示该点周围雷的个数 第一次下子,不炸死 坐标周围没雷,可以实现展开 游戏结束后展示玩家用时 话不多说,先附上效果图: 我们只要输入坐标就可以扫雷了,是不是很有趣? 其实要想实现这也不难,我们要用几个算法模块来模拟游戏规则,需要用函数来调用...

一砚梨花雨 7万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【C语言项目】扫雷-鼠标版

前言   你的「扫雷」 还不能用「鼠标」玩❓ 还在输入「坐标」❓ 已经都 「2021」了 ❗️ 谁还会玩你的「扫雷」呢❓    ❤️「看过来」❤️,本文将 手把手 带你写出「新的扫雷」???? 提示:该项目基于C语言编写,由 VisualStudio 2019 所实现 文章目录前言一、游戏效果展示:二、界面函数2.0 句柄2.0.1 GetStdHandle() 函数2.1 控制台标题2.1.1 COORD结构体2.1.2 SetConsoleTitle() 函数2.2 隐藏光标2.2.1 CONS

qq_56780490的博客 9022

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C语言扫雷代码(可以展开一片)

展开函数需要用到两个数组,因为在计算雷个数的函数中需要用到mine数组,在展开时候需要在show数组中展示出来。

s13057696399的博客 1120

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[C语言] [游戏] 扫雷

使用C语言写一个扫雷游戏 !(练习二维数组)!(超详细的游戏设置思路和书写细节)!(看看7318字就很......)

博主学浅才疏,权当信笔涂鸦。嘿嘿,就算是记录我的学习历程吧,不过有时我会写得很细,但解题思路常常只有一种,别介意哈 ^ ^ (也许能学到一点点)。希望大家多来踩踩,顺便可以关注我,一起交流学习。 1万+

C语言 | 扫雷小游戏(可自动展开)

在我小时候的记忆里,每台电脑总会有那么几款经典的游戏,今天给大家带来实现的这款游戏相信大家会油然而生出一种熟悉感,这款游戏叫扫雷,相信大家大部分都有接触过这款游戏,今天我就给大家带来该游戏的实现和代码。

Nice_W的博客 1万+

C语言实现扫雷游戏【完善版】{含递归展开}

本篇讲解的扫雷的主体思路和实现代码

2301_80216111的博客 2198

【C语言】扫雷小游戏(递归展开版)

想必大家都玩过扫雷这款小游戏吧?在一个棋盘上随机摆放数个雷,这些雷用户无法看见,只能一个个将雷排查出来,用户点击一个格子,如果这个格子含有雷,游戏就以失败告终,如果这个格子不是雷,就会在这个格子上显示周围8个格子共有多少个雷,如下图:今天我们就用C语言来实现这个扫雷小游戏。

m0_73648729的博客 2396

C语言扫雷(主要讲解扫雷递归展开)

在博客上面已经有好多博主撰写过扫雷相关的游戏代码,而且写的也很全面,在这我就不再详细写出扫雷的代码。但是对于扫雷中的一个难点就是递归展开,在这我可能会把重点放在递归展开。扫雷棋盘设计和菜单打印:菜单打印:int main()domenu();printf("请选择

多敲代码防脱发的博客 1035
上一篇: 【C语言】三子棋智能版(初学者必看)
下一篇: 【C++】基础知识(上)
信手斩龙
博客等级 码龄8年 13粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值