C语言实现扫雷游戏

一、实现内容:

在传统扫雷游戏上,添加如下功能:

        1>第一次下子,不炸死。
        2>坐标周围没雷,可以实现展开。

二、主要设计方法:

1.采用三个二维数组,分别为mine[ROWS][COLS],show[ROWS][COLS],state[ROWS][COLS]。

mine[ROWS][COLS],‘1‘’表示雷,‘0‘’表示无雷。用于初始化放置雷,后续操作只进行访问,不会进行修改。

show[ROWS][COLS],‘x’(x为数值)表示所在位置周边雷的个数,‘*’表示未被玩家扫描的位置。用于展示玩家每次扫雷后的界面展示,每次扫雷都需要进行赋值,以便展示玩家扫雷后更新的界面。

state[ROWS][COLS],初始化全为0,作为递归的标志位数组。若state[i][j]为1,则不对mine[ROWS][COLS]进行递归遍历;若state[i][j]为0并且show[i][j]为‘0’,则对mine[ROWS][COLS]进行递归遍历。

2.计算show[i][j]周边雷的数量的方法为:

在mine数组中,雷用字符‘1’表示,无雷用‘0’表示,所以某位置周边的8个字符分别-‘0’(字符0)后加和即为雷的个数(字符与字符相减得数值)。

表达式:show[i][j] = mine[i-1][j-1] +mine[i-1][j] +mine[i-1][j+1]+ mine[i][j-1] + mine[i][j+1] + mine[i+1][j-1] + mine[i+1][j] +mine[i+1][j+1] - 8 * '0';

三、设计步骤:

四、实现代码

 

 

五、测试结果 

 

六、问题与反思

        在用递归函数实现任一坐标周围没雷,可以实现展开的过程中,出现了溢出。

        主要原因是在不采用标志位进行标记,直接进行某一坐标周围的8个坐标进行函数调用,然后在继续对8个坐标周围的坐标遍历……,递归调用的空间复杂度为以8为底的指数级,发生了溢出。

        解决办法:采用标志位进行标记,已调用过的坐标标志位设置为1,后续不进行递归。

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值