2014-10-15 5 views
-1

Я создаю игру с помощью SpriteKit. У меня есть 8 разных цветных шаров, расположенных на 8 различных обозначенных CGPoints на экране. Как только пользователь доберется до определенного балла, я хотел бы рандомизировать цвета шаров, чтобы все были разными цветами, но я хотел бы получить этот результат без дублирования цветов и типов.Ранжирование значений объекта без дублирования

Я добавил шары в качестве объектов в глобальный NSMutableArray и установил метод для перечисления массива. Затем я написал метод arc4random, чтобы выбрать случайный тип цвета из массива, а затем применить его к старому типу шара. К сожалению, я получаю несколько дубликатов. Есть ли у кого-нибудь предложения помочь мне рандомизировать мои типы мячей без дублирования?

FYI, я потратил достаточно времени, чтобы прочитать другие методы рандомизации, и ни один из них, кажется, не обязательно отвечает на мой вопрос. Я нахожусь в крайнем сроке. Может кто-нибудь, пожалуйста, помогите мне?

-(void)ballRotation{ 


    NSLog(@"initial ball list: %@",_ballList); 

    [_ballList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

     int selectedIndex = arc4random() % _ballList.count; 
     NSLog(@"Selected Index: %i", selectedIndex); 

     //get a remain list of temp 
     Ball *newBall = _ballList[idx]; 

     //get the ball at the current _ballList index 
     Ball *oldBall = _ballList[selectedIndex]; 

     //change the ball in the old position to have the type & texture of the randomly selected ball 
     oldBall.Type = newBall.Type; 
     oldBall.texture = newBall.texture; 

     NSLog(@"new ball list: %lu", newBall.Type); 
     NSLog(@"new ball list: %@", newBall.texture); 


     [_ballList removeObjectAtIndex:selectedIndex]; 

    }]; 
} 
+0

Возможный дубликат [Случайное число без повторения] (http://stackoverflow.com/questions/11578816/random-number-without-repeating) – trudyscousin

ответ

0

Создайте изменяемый массив, в котором хранятся выбранные цвета. Каждый раз, когда вы производите выборку и получаете цвет, сравните этот цвет со всеми цветами, хранящимися в массиве «alreadyChosenColor». Если цвета равны, рандомизируйте снова, пока он, наконец, не будет соответствовать цвету, уже существующему в массиве.

Код:

//Create an array named allColorArray with all colors in it that you will use 
bool unique = NO; 
while(unique==NO) 
{ 
unique = YES; 
//randomIndex is a random int in the range of the allColorArray 
randomColor = [allColorArray objectAtIndex:randomIndex] 
    for(int i=0;i<alreadyChosenColor.count;i++) 
    { 
     if([alreadyChosenColor objectAtIndex:i]== randomColor) 
      unique=false; 
    } 
} 
//Set SKSpritenode to use randomColor. 
//add randomColor to alreadyChosenColor array. 
+0

Не могли бы вы узнать, как это сделать программно? – John

+0

Я не уверен в синтаксисе, но идея звучит. – meisenman

0

Создайте массив со всеми цветами. Перемешайте его и назначьте каждому шару по порядку. См. Fisher-Yates Shuffle. Вот категории, чтобы сделать это:

#import <Foundation/Foundation.h> 

@interface NSMutableArray (KD) 
-(void) kd_shuffleArray; 
@end 

@implementation NSMutableArray (KD) 

-(void) kd_shuffleArray { 

    NSUInteger count = self.count; 

    for (int i=count-1; i>0; i--) { 
     int random = arc4random_uniform(i+1); 
     [self exchangeObjectAtIndex:i withObjectAtIndex:random]; 
    } 
} 

@end 

О, и вы не хотите, чтобы добавить/удалить в массив при перечислении. Это один из смертельных грехов.

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