随机化对象值而不重复

时间:2014-10-15 14:56:38

标签: ios objective-c nsmutablearray sprite-kit arc4random

我正在使用SpriteKit创建游戏。我有8个不同颜色的球,位于屏幕上8个不同的指定CGPoints。一旦用户达到某个分数,我想将球的颜色随机化为所有不同的颜色,但我想得到这个结果,没有任何颜色和类型重复。

我将球作为对象添加到全局NSMutableArray中,并设置了枚举数组的方法。然后我编写了一个arc4random方法从数组中选择一个随机颜色类型,然后将其应用于旧球类型。不幸的是,我得到了一些重复。有没有人有任何建议可以帮我随机化我的球类而不重复?

仅供参考,我已经花了很多时间阅读其他随机化方法,但似乎没有一个能够回答我的问题。我在截止日期前。有人可以帮帮我吗?

-(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];

    }];
 }

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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

哦,你绝不想在枚举时添加/删除数组。这是致命的罪行之一。