前两章我们完成了数据生成与数据展现,实际上数据展现时默认图案都是被遮盖住的,如何实现这样的效果呢,博主的思路是另外增加一个216长度的列表states来表示各单元格的状态,默认值均为0,被点击过的单元格就将自身状态修改为1。
实际应用时需要判断被点击单元格的值来区别对待,如果点到地雷(值为10),那么就结束了。如果点到了map列表值小于10的单元格,我们就把对应的states表中的数值修改为1,修改值后还需要继续判断该单元格是否是空格(等于0),包含数字的格子可以被视为边界,我们不再往外扩展,等于0的空格我们加入另一个列表,挨个处理。
新建立一个bfs列表,新建立一个bfscount变量,当被点击格子为空时,检测并改变四周的方格的states列表值,同时检测是否是空格,是空格则继续拉入bfs列表,bfs列表的中止条件是计数器大于其项目总数,因为随时可能有空格添加进来,所以这个项目总数是变化的。
检测周边空格很容易出现重复添加的情况,比如空格14的旁边15也是个空格,于是15被添加进了bfs表,检测15的时候又发现14也是个空格,这个时候我们需要一个去重的操作,检测一下该空格对应的states的值是否为0,为0说明尚未被处理过,毫不犹豫的加入bfs,如为1那么就不再进行添加。随着越来越多的空格的状态被标记为1,可供加入bfs表的空格也就越来越少,最终bfscount会大于bfs的项目数。
判断游戏胜利
博主是判断state列表的剩余0值,假设布雷20颗,当前states表内还有20个0,即20个格子未被翻开,那就说明其余格子都已经被正确展开了,从而判断玩家胜利。