如何在NSMutableArray中交换值(而不是索引)

时间:2012-02-27 21:16:11

标签: objective-c ios

我正在接受比平时更多的课程,并且没有时间玩目标c而且是我自己的,这对我来说仍然感觉很陌生,而且我有很多做一些我知道应该相当简单的麻烦。

但基本上我所拥有的是一块6件马赛克拼图,当拼图重新启动时,这些拼图会回到同一个地方。每次重新开始拼图时,我都试图以随机方式将每件作品的原点与另一件作品的原点交换。所以我试图随机化分配给数组中NSValue对象的CGRect值,声明如下:

@synthesize topLeft;
@synthesize topMiddle;
@synthesize topRight;
@synthesize bottomLeft;
@synthesize bottomMiddle;
@synthesize bottomRight;
@synthesize scoreLabel;

topLeftRectOrigin=[NSValue valueWithCGRect: topLeft.frame];
topMiddleRectOrigin=[NSValue valueWithCGRect: topMiddle.frame];
topRightRectOrigin=[NSValue valueWithCGRect: topRight.frame];
bottomLeftRectOrigin=[NSValue valueWithCGRect: bottomLeft.frame];
bottomMiddleRectOrigin=[NSValue valueWithCGRect: bottomMiddle.frame];
bottomRightRectOrigin=[NSValue valueWithCGRect: bottomRight.frame];

puzzlePieces=[[NSMutableArray alloc]initWithObjects:topLeft, topMiddle, topRight, bottomLeft, bottomMiddle, bottomRight, nil];
puzzleOrigins=[[NSMutableArray alloc]initWithObjects:topLeftRectOrigin, topMiddleRectOrigin, topRightRectOrigin, bottomLeftRectOrigin, bottomMiddleRectOrigin, bottomRightRectOrigin, nil];

topLeftRectGrid=CGRectMake(145, 95, 30, 30);
topMiddleRectGrid=CGRectMake(235, 95, 30, 30);
topRightRectGrid=CGRectMake(325, 95, 30, 30);
bottomLeftRectGrid=CGRectMake(145, 185, 30, 30);
bottomMiddleRectGrid=CGRectMake(235, 185, 30, 30);
bottomRightRectGrid=CGRectMake(325, 185, 30, 30);

我真的很难理解这个问题,你们可以推荐我应该怎样做吗?非常感谢你的帮助。

3 个答案:

答案 0 :(得分:5)

未经测试,但这应该有效:

(NSMutableArray *)randmomizeMutableArrayWithArray:(NSMutableArray)mutableArray {
    NSUInteger count = [mutableArray count];
    for (NSUInteger i = 0; i < count; ++i) {
        // Select a random object in the array
        int numObjects = count - i;
        int n = (random() % numObjects) + i;
        [mutableArray exchangeObjectAtIndex:i withObjectAtIndex:n];
    }

    return mutableArray
}

我的建议是制作puzzleOrigins的副本(不需要是MutubleArray BTW),然后使用该副本:

NSMutableArray *copyOfPuzzleOrigins = [[NSMutableArray alloc] initWithArray:puzzleOrigins];
copyOfPuzzleOrigins = [self randmomizeMutableArrayWithArray:copyOfPuzzleOrigins];

答案 1 :(得分:1)

更新:您可能想重新提出问题。我理解它是因为你想要改变数组中两个对象的原点而不改变它们在数组中的位置,ElJay提供了一个很好的解决方案,以防你想要交换数组位置。澄清可能有帮助,所以我们知道该怎么做! :d

我在最近的一个项目中遇到了类似的情况。

你有一个包含6个元素的NSMutableArray,现在显然你不想改变项目的顺序,而是改变它们的来源。以下是我认为可以帮助您解决问题的解决方案:

  1. 从0-5(您的数组索引)生成两个随机数,以表示数组的两个不同项目(件)。
  2. 通过switch语句,获取与随机生成的索引对应的每个部分的原点。
  3. 再次通过switch语句,为随机生成的索引对应的部分设置新获取的原点。
  4. 这就是我所做的,我基本上不得不动画随机交换几张图像的位置。我随机获得了两个不同的数字,检索了与这些项目相对应的中心,然后将每个项目的中心反转。

    我得到了一个平滑的动画,它在运行时随机生成:)

    希望这有帮助,随时提出更多问题或意见(:

答案 2 :(得分:1)

忘记保留一个单独的原点数组,并摆脱所有指向各个拼图块的六个属性。

相反,给每个拼图块一些标识其正确位置的值。一个简单的方法是使用UIView的tag属性将索引存储在数组中,当拼图正确完成时,每个部分应该具有该索引。左上角的部分应该以索引0结束,顶部中间应该有索引1,依此类推到右下角的索引为5。

接下来,随机化阵列。 ElJay的方法是如何使用-exchangeObjectAtIndex:withObjectAtIndex:执行此操作的一个很好的示例。根据数组中的索引定位您的碎片。添加一些代码,以便使用可以通过拖动或其他任何方式交换片段。

最后,添加一些代码来决定拼图何时完成。这很简单 - 只需将每个部分的实际索引与其标记进行比较即可。如果每个部分的标记与数组中的索引匹配,那么拼图就完成了。