初始化游戏状态数据(2)

来源:互联网 发布:如何建立网络销售平台 编辑:程序博客网 时间:2024/05/21 06:25

13.3.2  初始化游戏状态数据(2)

由于《疯狂连连看》游戏的初始状态可能有很多种,比如,横向分布的方块、竖向分布的方块、矩阵排列的方块、随机分布的方块等,该程序为了考虑以后的扩展性,此处只采用了模板模式:FKBaseBoard基类负责完成通用的代码,对于暂时无法确定的需要子类实现的部分定义成createPieces:方法。

由于Objective-C没有提供抽象类和抽象方法的概念,因此,此处将createPieces:方法定义成返回nil的空方法。

上面的程序中还用到了一个ImageUtil工具类,它的作用是自动搜寻项目包的图片,并根据需要随机读取该目录下的图片。后面会详细介绍该工具类的用法。

下面为该FKBaseBoard实现三个子类。

1.矩阵排列的方块

矩阵排列的方块会填满二维数组的每个数组元素,只是把四周留空即可,该子类的代码实现如下(接口部分几乎没有代码,因此此处不再给出)。

程序清单:/Users/yeeku/publish/codes/13/Link/Link/sources/board/FKFullBoard.m
 

  1. @implementation FKFullBoard  
  2. - (NSArray*) createPieces: (NSArray*) pieces  
  3. {  
  4.     // 创建一个NSMutableArray,该集合中存放初始化游戏时所需的FKPiece对象  
  5.     NSMutableArray* notNullPieces = [[NSMutableArray alloc] init];  
  6.     // i从1开始,小于pieces.count - 1,用于控制最上、最下一行不放方块  
  7.     for (int i = 1; i < pieces.count - 1; i++)  
  8.     {  
  9.         // i从1开始,小于pieces.count - 1,用于控制最左、最右一列不放方块  
  10.         for (int j = 1; j < [[pieces objectAtIndex:i] count] - 1; j++)  
  11.         {  
  12.             // 先构造一个FKPiece对象,只设置它在FKPiece二维数组中的索引值,  
  13.             // 所需要的FKPieceImage由其父类负责设置  
  14.             FKPiece* piece = [[FKPiece alloc] initWithIndexX:i indexY:j];  
  15.             [notNullPieces addObject:piece];  // 添加到FKPiece集合中  
  16.         }  
  17.     }  
  18.     return notNullPieces;  
  19. }  
  20. @end 

该子类初始化的游戏界面如图13.7所示。
 
 

2.竖向排列的方块

竖向排列的方块以垂直的空列分隔开,该子类的代码实现如下(接口部分几乎没有代码,因此此处不再给出)。

程序清单:codes/13/Link/Link/sources/board/FKVerticalBoard.m
 

  1. @implementation FKVerticalBoard  
  2. - (NSArray*) createPieces:(NSArray*) pieces  
  3. {  
  4.     // 创建一个NSMutableArray集合, 该集合中存放初始化游戏时所需的FKPiece对象  
  5.     NSMutableArray* notNullPieces = [[NSMutableArray alloc] init];  
  6.     for (int i = 0; i < pieces.count; i++)  
  7.     {  
  8.         for (int j = 0; j < [[pieces objectAtIndex:i] count]; j++)  
  9.         {  
  10.             // 加入判断,符合一定条件才构造FKPiece对象,并加到集合中  
  11.             // 如果i能被2整除,即单数列不会创建方块  
  12.             if (i % 2 == 0)  
  13.             {  
  14.                 // 先构造一个FKPiece对象,只设置它在FKPiece二维数组中的索引值,  
  15.                 // 所需要的FKPieceImage由其父类负责设置  
  16.                 FKPiece* piece = [[FKPiece alloc] initWithIndexX:i indexY:j];  
  17.                 // 添加到FKPiece集合中  
  18.                 [notNullPieces addObject:piece];  
  19.             }  
  20.         }  
  21.     }  
  22.     return notNullPieces;  
  23. }  
  24. @end 
0 0
原创粉丝点击