C语言实现扫雷游戏
Posted 小740
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,后续不进行递归。
以上是关于C语言实现扫雷游戏的主要内容,如果未能解决你的问题,请参考以下文章