13.3.2 初始化游戏状态数据(2)
由于《疯狂连连看》游戏的初始状态可能有很多种,比如,横向分布的方块、竖向分布的方块、矩阵排列的方块、随机分布的方块等,该程序为了考虑以后的扩展性,此处只采用了模板模式:FKBaseBoard基类负责完成通用的代码,对于暂时无法确定的需要子类实现的部分定义成createPieces:方法。
由于Objective-C没有提供抽象类和抽象方法的概念,因此,此处将createPieces:方法定义成返回nil的空方法。
上面的程序中还用到了一个ImageUtil工具类,它的作用是自动搜寻项目包的图片,并根据需要随机读取该目录下的图片。后面会详细介绍该工具类的用法。
下面为该FKBaseBoard实现三个子类。
1.矩阵排列的方块
矩阵排列的方块会填满二维数组的每个数组元素,只是把四周留空即可,该子类的代码实现如下(接口部分几乎没有代码,因此此处不再给出)。
程序清单:/Users/yeeku/publish/codes/13/Link/Link/sources/board/FKFullBoard.m
- @implementation FKFullBoard
- - (NSArray*) createPieces: (NSArray*) pieces
- {
- // 创建一个NSMutableArray,该集合中存放初始化游戏时所需的FKPiece对象
- NSMutableArray* notNullPieces = [[NSMutableArray alloc] init];
- // i从1开始,小于pieces.count - 1,用于控制最上、最下一行不放方块
- for (int i = 1; i < pieces.count - 1; i++)
- {
- // i从1开始,小于pieces.count - 1,用于控制最左、最右一列不放方块
- for (int j = 1; j < [[pieces objectAtIndex:i] count] - 1; j++)
- {
- // 先构造一个FKPiece对象,只设置它在FKPiece二维数组中的索引值,
- // 所需要的FKPieceImage由其父类负责设置
- FKPiece* piece = [[FKPiece alloc] initWithIndexX:i indexY:j];
- [notNullPieces addObject:piece]; // 添加到FKPiece集合中
- }
- }
- return notNullPieces;
- }
- @end
该子类初始化的游戏界面如图13.7所示。
2.竖向排列的方块
竖向排列的方块以垂直的空列分隔开,该子类的代码实现如下(接口部分几乎没有代码,因此此处不再给出)。
程序清单:codes/13/Link/Link/sources/board/FKVerticalBoard.m
- @implementation FKVerticalBoard
- - (NSArray*) createPieces:(NSArray*) pieces
- {
- // 创建一个NSMutableArray集合, 该集合中存放初始化游戏时所需的FKPiece对象
- NSMutableArray* notNullPieces = [[NSMutableArray alloc] init];
- for (int i = 0; i < pieces.count; i++)
- {
- for (int j = 0; j < [[pieces objectAtIndex:i] count]; j++)
- {
- // 加入判断,符合一定条件才构造FKPiece对象,并加到集合中
- // 如果i能被2整除,即单数列不会创建方块
- if (i % 2 == 0)
- {
- // 先构造一个FKPiece对象,只设置它在FKPiece二维数组中的索引值,
- // 所需要的FKPieceImage由其父类负责设置
- FKPiece* piece = [[FKPiece alloc] initWithIndexX:i indexY:j];
- // 添加到FKPiece集合中
- [notNullPieces addObject:piece];
- }
- }
- }
- return notNullPieces;
- }
- @end