一 有关棋盘的步骤
1.定义棋盘
2.打印棋盘
3.布置雷
4.排查雷
二 有关游戏选项菜单
1.菜单
三 需要解决问题、
1.存放易产生歧义
解决:初始化两个数组 一个存放需要的信息 一个排查出的信息
2.统计一个坐标需要周围雷 可能会越界
解决 :扩大棋盘 计划9*9的棋盘实际打印11*11的棋盘
3.随机布置雷时可能重复导致埋雷数变少
解决:在埋雷是加入if()语句判断埋雷位置是否重复
四 操作中可能发生的问题
1.在初始化 和打印数组中要准确地写好数组的规格 哪些地方是11*11哪些地方用的是9*9
2.定义函数是要写正确函数的类型 不然在写完后出错又要重新检查
五 为了配合检查代码是否可以正常运行和执行该有的功能 将通过define定义行 列 布置雷数等一些代码中常用的变量 方便只会修改方便
六 写代码时将采用两个.c文件和一个.h文件
一 先看头文件
.h文件中的内容 其中包含三个头文件 分别引用标志库 time()函数和srand()函数 rand()函数
define 分别定义计划行 列 row 和col 已经实际行 列 rows和cols 以及布置雷数 C
函数声明有打印菜单menu
初始化棋盘数组init 这里的set是用来存放分别对两个数组的内容 一个存放‘0’mine数组一个存放‘*’show数组这两个都是二维数组
display用来打印棋盘 一次打印一个棋盘 其中打印的范围一个是9*9 下标行列都是从1到9
setplay用来布置雷的数目这里需要使用rand()来随机布置雷的位置 且要将雷放在9*9规定的位置
findplay用来查找坐标是否有雷 以及有雷无雷时要进行的不同的功能
conunts是用来数查找坐标周围的8个格雷的个数并进行返回
二 源文件1
第一步先设置时间差种子方便之后布置雷使用
第二步创建input 一是用来选择菜单是否开始游戏 二是用来作为循环条件判断控制循环
第三步循环内部使用分支语句用来判断输入分别是1和0等不同的选择时执行不同功能 这里可用Switch也可以用if语句 输入0是游戏结束并跳出Switch 同时input此时为0使得循环结束 input为1时则进入game()函数中开始进行扫雷游戏
1.game函数中首先定义两个数组 mine是用来布置雷用的 而show是用来排查雷用这里数组大小是11*11
2.因此在对mine初始化是对set形参中传输的是‘0’而show对set形参中传输的是‘*’这里初始化是11*11全部初始化
3.display是打印棋盘的 在正常游戏中只打印show就可以 但是为了测试代码的功能也可以再雷布置好后打印mine 打印时是打印9*9
4.setplay用来布置雷所以传输的是mine数组 布置时也是在9*9的格子中布置
5findplay是排查雷这样mine和show都用到都要传输 这里使用的也是9*9的范围
这是打印好的菜单 这里的形式不唯一 只要是告诉游玩者1是开始游戏0是结束游戏的规则信息
初始化 给11*11的棋盘全部赋上set变量所存储器的字符下标是行列都是从0到10
打印棋盘这里除了打印9*9的棋盘内容外还要加上几行几列的信息 方便游玩 第一个循环打印列的信息 第二个循环负责打印棋盘和行信息 这里下标是行列都是从0到8
setplay用来布置雷 利用提前定义好的雷数作为循环判断条件 每成功放置一个雷 雷数就-1当未布置雷数为0时循环结束 同时内部通过rand()来随机坐标布置雷%9+1使范围控制在下标1到9中if条件用来放置重复一个位置布置雷
findplay用来排查雷 首先scanf输入要排查的坐标 第一个if用来判断输入的范围是否是行列1到9的正确位置 在里面嵌套的第二个if是用来判断排查位置是否有雷 若有雷 则游戏结束 若无雷 则在排查位置显示出排查位置周围8个位置具有雷的数目
并通过do while 循环不断进行排查 设置win作为循环是否停止的条件 只有被炸死 或者胜利才会停止可以通过break停止或者给win赋值为0的方式来停止
设置o是用来计数的 计排查次数 初始o为9*9=81 每成功排查一次就o-1一次当o与布置雷的数目相等时就说明所有的雷都排查完毕 游戏胜利循环结束
conuts是用来提示玩家周围排查位置周围8个位置有几个雷的信息 由于函数是int类型 所以返回也需要是int类型 而在初始化和布置雷时所用的都是字符‘0’和‘1’所以需要转换 通过‘4’-‘0’=4 ‘5’=5+‘0’可以通过加减‘0’来得到想要的类型是字符还是整型
这就是整个扫雷代码的过程 有些瑕疵其中还有许多可以优化的步骤 还望多多包涵