我是Objective C的新手。我正在编写游戏Mastermind,计算机从6中选择4种随机颜色,用户试图在6次尝试中猜测4种颜色。
我有一个NSArray代表所有六种可能的颜色:
NSArray * allColors = [[NSArray alloc] initWithObjects:@"r", @"g", @"b", @"y", @"p", @"o", nil];
//Computer choose 4 random colors:
NSArray * computersSelection = [[NSArray alloc] init];
我需要编写代码从数组中选择4种独特的随机颜色。有一种聪明的方法吗?
我可以创建四个int变量并使用while循环生成四个随机数,然后根据四个随机整数值从NSArray中拉出对象并将它们放在computerSelection数组中,但我想知道是否有更简单的方法做事?
由于
答案 0 :(得分:4)
确保唯一值的一种相对简单的方法是,因为初始数组是固定的,所以删除对象而不是选择它们。在这种情况下,删除两个,你有一个四个数组,保证唯一性。这是基本代码:
NSArray *allColors = @[@"r", @"g", @"b", @"y", @"p", @"o"];
NSMutableArray *fourColors = [allColors mutableCopy];
[fourColors removeObjectAtIndex:arc4random_uniform((u_int32_t)(fourColors.count + 1))];
[fourColors removeObjectAtIndex:arc4random_uniform((u_int32_t)(fourColors.count + 1))];
NSLog(@"%@", fourColors);
答案 1 :(得分:1)
//0 r
//1 g
//2 b
//3 y
//4 p
//5 o
NSArray * allColors = [[NSArray alloc] initWithObjects:@"r", @"g", @"b", @"y", @"p", @"o", nil];
//Computer choose 4 random colors:
NSUInteger x1 =1;
NSUInteger x2 =1;
NSUInteger x3 =1;
NSUInteger x4 =1;
while(x1 == x2 || x1 == x3 || x1 == x4 || x2 == x3 || x2 == x4 || x3 == x4)
{
x1 = arc4random() % 6;
x2 = arc4random() % 6;
x3 = arc4random() % 6;
x4 = arc4random() % 6;
}
NSArray * computersSelection = [[NSArray alloc] initWithObjects: [allColors objectAtIndex: x1], [allColors objectAtIndex: x2], [allColors objectAtIndex: x3], [allColors objectAtIndex: x4], nil];
NSLog(@"%@, %@, %@, %@", [computersSelection objectAtIndex:0], [computersSelection objectAtIndex:1], [computersSelection objectAtIndex:2], [computersSelection objectAtIndex:3]);
所以这是我的尝试。但我仍然更喜欢@jshier的回应。
答案 2 :(得分:0)
保留原始来源列表:
NSUInteger const kChoiceSize = 4;
NSArray * allColors = [[NSArray alloc] initWithObjects:@"r", @"g", @"b", @"y", @"p", @"o", nil];
NSMutableSet *choice = [[NSMutableSet alloc] init];
while ([choice count] < kChoiceSize) {
int randomIndex = arc4random_uniform([allColors count]);
[choice addObject:[allColors objectAtIndex:randomIndex]];
}