2012-02-27 55 views
1

我正在学习waaaayyy的课程,比我通常在这个学期做的要多,而且没有时间玩弄客观的c,让它成为我自己的,这一切依然让人感觉非常对我来说是陌生的,我遇到很多麻烦,我知道我应该很简单。如何交换NSMutableArray中的值(不是索引)

但基本上我所拥有的是一块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); 

我真的遇到了麻烦我解决这个脑子,你们可以建议我应该怎么去这样做?非常感谢您的帮助。

+0

感谢所有帮助人员,每个人都贡献了一点点,向我展示了解决此问题的最佳方法。事实证明,很多问题都是教授让我们跟随的教程中糟糕的算法,这使得很难在没有重写的情况下改变任何东西。但是之后重写一切都会奏效:-D我基本上只需要改变对数组的所有引用,而不是数组中的对象,这将不允许数组混排。 – jamzsabb 2012-02-29 03:30:16

回答

1

更新:您可能想要重新制定您的问题。我理解它是因为你想改变阵列中两个对象的原点而不改变它们在阵列中的位置,ElJay给出了一个很好的解决方案,以便你想交换阵列位置。澄清可能会有所帮助,所以我们知道该怎么帮忙! :D

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

你有一个有6个元素的NSMutableArray,现在显然你不想改变项目的顺序,而是改变它们的起源。这里有一个解决方案,我认为这将有助于你的情况:

  1. 从0-5(你的数组索引)生成两个随机数来表示你的数组的2个不同的项目(件)。
  2. 通过switch语句,获取与随机生成的索引对应的每个片断的原点。
  3. 再次通过switch语句,设置您为随机生成的索引所对应的碎片获取的新原点。

这就是我所做的,我基本上不得不动画交换几个图像的位置随机。我只是随机获得了两个不同的数字,找回了与这些项目相对应的中心,然后在每个中心上翻转了中心。

我有一个流畅的动画和它的所有随机在运行时:)

希望这有助于,随意问更多的问题或意见(产生:

+0

谢谢你,它使我的脑海中点击。这个任务让我从教授编写的教程构建了一个谜题应用程序,然后我试图“改善”它,我绝对认为她将原始位置声明为包含在NSValues中的CGRects的方式包装在NSMutableArray中因为很多代码引用了CGRects而不是数组,我花了一些时间才意识到我需要更改引用来使用这个数组来实现这个功能 – jamzsabb 2012-02-29 01:51:19

+0

非常欢迎:) Glad以帮助 – iFeli 2012-02-29 19:59:38

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]; 
+0

你比我快) – 0xDE4E15B 2012-02-27 21:57:54

+0

我没有测试它:) – 2012-02-27 22:09:58

+0

真棒谢谢你的随机算法,我正在使用交换和whatnot构建更复杂的东西。 – jamzsabb 2012-02-29 01:48:56

1

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

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

接下来,随机化数组。 ElJay的方法是使用-exchangeObjectAtIndex:withObjectAtIndex:的一个很好的例子。根据阵列中的索引定位您的作品。添加一些代码,以便使用可以通过拖动或其他方式交换部分。

最后,添加一些代码来决定何时拼图完成。这很简单 - 只需比较每件作品的实际索引与其标签。如果每件作品的标签与数组中的索引相匹配,则拼图完成。

相关问题