1、项目结构图
Viewcontroller
:扫雷逻辑代码
LevelModel
:扫雷难度选择代码
2、定义
相信很多人小时候都玩过Windows XP系统的扫雷游戏。记得刚开始玩时不知道游戏规则,以为全靠运气,点到白色区域就是没有地雷,高兴地又蒙对了。后来发现了其中的奥秘,原来白色块代表周围都没有地雷,数字块代表其周围有几块地雷。根据这个规则我们开始扫雷游戏的实现:
以下以10×10地图为例进行分析
1)用数组mineMapArray
(0 - 9)存储每个单元的状态,初始化全为0
0,表示单元周围没有地雷
1 - 8,表示单元周围有1 - 8个地雷
9,表示该单元是地雷单元的周围是指,当前单元的左上方、上方、右上方、右方、右下方、下方、左下方、左方的单元。一个单元周围最多有8个单元。
2)用数组minesArray
(0 - 99)存储所有地雷的位置
3)用数组turnoverArray
(0 - 99)存储点击空白单元时可翻转所有单元的位置
3、随机地雷的位置
1)先创建临时地图位置数组tmpMapArray
(0 - 99),方便下一步随机_mineNums
个地雷位置用
//1.创建临时地图位置数组,用于随机出地雷位置
NSMutableArray *tmpMapArray = [NSMutableArray array];//临时地图位置数组
for (int i = 0; i < _row * _column; i++) {
[tmpMapArray addObject:@(i)];
}
2)随机产生_mineNums
个地雷并记录地雷位置到地图相应mineMapArray
上
delIndex
,临时地图数组tmpMapArray
的删除的位置
addIndex
,地雷地图数组minesArray
上添加地雷的位置
//2.更新地图地雷位置和记录地雷位置
int delIndex;//随机地雷的位置
int addIndex;//地雷添加到地图的位置
for (int i = 0; i < _mineNums; i++) {
delIndex = arc4random() % tmpMapArray.count;
addIndex = [tmpMapArray[delIndex] intValue];
[self.mineMapArray replaceObjectAtIndex:addIndex withObject:@(9)];//更地图上地雷位置
[self.minesArray addObject:tmpMapArray[delIndex]];//添加地雷位置到存储所有地雷位置的数组
[tmpMapArray removeObjectAtIndex:delIndex];//删除临时随机的地雷位置
}
3)计算每个不是地雷的单元的周围地雷数量
一般情况下地雷的数量比较少,所以,首先我们可以遍历找到地雷单元,然后再遍历地雷周围的单元,再在mineMapArray
数组相应位置上加1。
地雷的位置是
location
,_row
是行数,_column
是列数,即一行单元的个数
所以,
左上 =location - _column - 1
上 =location - _column
右上 =location - _column + 1
右 =location + 1
右下 =location + _column + 1
下 =location + _column
左下 =location + _column - 1
左 =location - 1
注意:在遍历周围单元是要注意是否在边界位置
location / _column != 0
判断当前单元是否在第一行
location % _column != 0
判断当前单元是否在第一列
location / _column != _row - 1
判断当前单元是否在最后一行
location % _column != _column - 1
判断当前单元是否在最后一列左上单元,需要判断当前单元是否在第一行&&是否在第一列
上单元,需要判断当前单元是否在第一行
右上单元,