iphone开发-添加循环?

iphone开发-添加循环?,iphone,Iphone,我需要帮助创建一个循环,检查数组中选定的项目之前是否已拾取,如果已拾取,请再次随机化。 在该功能中实现: -(NSString*) randomBallPick:(NSString*) Filename { NSMutableArray *imageArray = [[NSMutableArray alloc] init]; for (int c=0;c<37;c++) { NSString *imageName = [NSString string

我需要帮助创建一个循环,检查数组中选定的项目之前是否已拾取,如果已拾取,请再次随机化。 在该功能中实现:

-(NSString*) randomBallPick:(NSString*) Filename
{
    NSMutableArray *imageArray = [[NSMutableArray alloc] init];
    for (int c=0;c<37;c++)
    {
        NSString *imageName = [NSString stringWithFormat:@"image_%d.png", c];
        [imageArray addObject: imageName];
    }
    int numFileNames = [imageArray count];
    int chosen = arc4random() % numFileNames;
    Filename = [imageArray objectAtIndex: chosen];
    return Filename;
    [imageArray release];
}
-(NSString*)随机选择:(NSString*)文件名
{
NSMutableArray*imageArray=[[NSMutableArray alloc]init];

对于(int c=0;c,您需要在某处存储是否已选择特定的球

拾取一个球后,如果之前已选择该球,请返回函数的开头并重试

请注意,这可能不是处理此问题的最佳方法-一旦您确定阵列中只有少数尚未拾取的球,您将花费大量时间重新拾取,直到获得新的球。更好的方法是维护尚未拾取的球的列表,并在拾取球时将其从列表中拼接出来

编辑:psuedocode循环版本,直到找到它的方法。您需要实现getIt()和Foo::hasNotBeenPickedYet(),并将其转换为实际代码

Foo foo = null;
while(!foo) {
    Foo temp = getIt();
    if(temp.hasNotBeenPickedYet())
        foo = temp;
}
return foo;

我回答了您关于此函数的另一个问题:这里的答案修改为仅返回尚未返回的文件名:

- (NSString*)randomBallPick
{
    static NSMutableArray *imageArray;

    if (!imageArray) {
        imageArray = [[NSMutableArray alloc] init];
        for (int c = 0; c < 37; c++)
        {
            NSString *imageName = [NSString stringWithFormat:@"ball_%d.png", c];
            [imageArray addObject:imageName];
        }
    }

    //pick one filename
    NSUInteger numFileNames = [imageArray count];
    if (numFileNames < 1) {
        return nil; // or handle this case in some other way
    }
    NSUInteger chosen = arc4random() % numFileNames;
    NSString *chosenFilename = [imageArray objectAtIndex:chosen];
    [imageArray removeObjectAtIndex:chosen];
    return chosenFilename;
}
-(NSString*)随机球拾取
{
静态NSMutableArray*imageArray;
如果(!imageArray){
imageArray=[[NSMutableArray alloc]init];
对于(int c=0;c<37;c++)
{
NSString*imageName=[NSString stringWithFormat:@“ball_%d.png”,c];
[imageArray addObject:imageName];
}
}
//选择一个文件名
NSU整数numFileNames=[imageArray计数];
if(numFileNames<1){
返回nil;//或以其他方式处理此情况
}
NSUInteger selected=arc4random()%numFileNames;
NSString*chosenFilename=[imageArray objectAtIndex:Selected];
[imageArray removeObjectAtIndex:已选择];
返回chosenFilename;
}
基本上,当它返回一个文件名时,它也会将其从
imageArray
中删除


当然,一旦
imageArray
为空(
numFileNames<1
),上述函数将返回
nil
。不确定这是否合适,您可能需要以不同的方式处理该情况。

仅对代码进行注释。[imageArray版本];永远不会接到电话。请将其放在您的回执声明之前。我不太明白,如何实施?(您必须原谅我,我是objective-c的新手)我不会有任何线索-我不是一个客观的C程序员。即使我是,我也不会给你复制粘贴的代码-如果你只是复制粘贴的东西,你什么也学不到。我已经向你展示了你需要做什么,这取决于你来制定这样做的语法。当我运行这段代码时,我会得到一个GDB错误信号EXC_BAD_ACCESS。非常感谢你的帮助。a你要在某个地方释放返回的NSString吗?你不应该。我不认为上面的代码会导致EXC_BAD_访问错误,但我已经直接在浏览器中键入了它,谁知道呢。也许我调用它是错误的?我是这样做的:NSString*temp=[self randomBallPick];upBall1.image=[UIImage ImageName:temp];这对我来说是正确的。也许其他人可以在我的代码中找到问题,或者它完全在其他地方。谢谢。继续这里