iOS 扫雷游戏

代码地址如下:
http://www.demodashi.com/demo/11254.html

1、项目结构图

!mineframe

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。
10×10

地雷的位置是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 判断当前单元是否在最后一列

左上单元,需要判断当前单元是否在第一行&&是否在第一列
上单元,需要判断当前单元是否在第一行
右上单元,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值