2012-02-27 2 views
1

Я принимаю waaaayyy больше классов, чем я обычно делаю в этом семестре, и просто не успел поиграть с объективом c и сделать его своим, это все еще очень чужой мне, и у меня много проблем с тем, что я знаю, должно быть довольно просто.Как поменять значения (не индексы) в NSMutableArray

Но в основном то, что у меня есть, представляет собой мозаичную головоломку из 6 предметов, которая возвращается в одно и то же место, когда головоломка перезапускается. Я пытаюсь поменять происхождение каждой части с помощью другой части случайным образом каждый раз, когда головоломка перезапускается. Так что я пытаюсь рандомизации значения CGRect, присвоенные объектам NSValue в массиве, декларируется в качестве такового:

@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

ответ

1

Обновление: Возможно, вы захотите переформулировать свой вопрос. Я понял, что вы хотите изменить происхождение двух объектов внутри вашего массива без изменения их позиций в массиве, ElJay дал отличное решение, если вы захотите поменять позиции массива. Уточнение может помочь только для того, чтобы мы знали, с чем вам помочь! : D

Я столкнулся с аналогичной ситуацией в недавнем моем проекте.

У вас есть NSMutableArray с 6 элементами в нем, теперь, очевидно, вы не хотите изменять порядок элементов, а вместо этого их происхождение. Вот решение, которое, я думаю, поможет вам в вашем деле:

  1. Создайте два случайных числа от 0 до 5 (индексы массива), чтобы представить 2 разных элемента (штук) вашего массива.
  2. С помощью оператора switch получить начало координат каждой части, соответствующей произвольно сгенерированным индексам.
  3. Снова с помощью оператора switch установите новое происхождение, которое вы приобрели для частей, соответствующих случайным образом сгенерированным индексам.

Это то, что я и сделал, мне в основном пришлось анимировать замену позиции нескольких изображений случайным образом. Я просто случайно получил 2 разных числа, получив центр, соответствующий каждому из этих предметов, а затем перевернул центры на каждом.

Я получил плавную анимацию и все это генерируется случайным образом во время выполнения :)

Надеется, что это помогает, не стесняйтесь задавать вопросы или комментарии (:

+0

Спасибо за то, что он щелкнул в моей голове. Назначение заставил меня создать приложение-головоломку из учебника, написанного профессором, и затем я пытаюсь «улучшить» его, и я определенно думаю, что способ, которым у нее были места происхождения, объявленные как CGR, завернутые в NSValues, завернутые в NSMutableArray, меня отключили, потому что много кода ссылается на CGR вместо массивов, мне потребовалось некоторое время, чтобы понять, что мне нужно изменить ссылки на использование массива, чтобы сделать эту работу. – jamzsabb

+0

Вы очень желанный :) Glad чтобы помочь – iFeli

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

+0

Я тоже не тестировал :) –

+0

Удивительное спасибо за алгоритм рандомизации, я строил что-то гораздо более сложное, используя своп и многое другое. – jamzsabb

1

Забудьте о сохранении отдельного массива истоков и избавитесь от шести свойств, которые все указывают на отдельные части головоломки.

Вместо этого дайте каждой части головоломки какую-то ценность, которая идентифицирует ее правильное положение. Простым способом сделать это было бы использование свойства UIView tag для хранения индекса в массиве, который каждая часть должна иметь, когда головоломка будет правильно завершена.Верхняя левая часть должна заканчиваться индексом 0, верхняя средняя должна иметь индекс 1 и т. Д. На нижнюю правую часть с индексом 5.

Затем рандомизируйте массив. Метод ElJay - отличный пример того, как это сделать, используя -exchangeObjectAtIndex:withObjectAtIndex:. Поместите свои фигуры в соответствии с их индексами в массиве. Добавьте код, чтобы его можно было поменять местами, перетащив или что угодно.

Наконец, добавьте код, который решает, когда головоломка завершена. Это легко - просто сравните фактический индекс каждой части с ее тегом. Если тег каждой части соответствует его индексу в массиве, головоломка завершена.

Смежные вопросы