Разработка iphone - добавление петли? - PullRequest
0 голосов
/ 07 декабря 2009

Мне нужна помощь, чтобы создать цикл, который проверяет, выбран ли элемент, выбранный в массиве, ранее, если да, то снова случайным образом. реализовать в этой функции:

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

Ответы [ 2 ]

1 голос
/ 07 декабря 2009

Я ответил на ваш другой вопрос об этой функции: Вот ответ оттуда, модифицированный так, чтобы возвращать только имена файлов, которые еще не были возвращены:

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

Обычно, когда он возвращает одно из имен файлов, он также удаляет его из imageArray.

Конечно, когда imageArray пусто (numFileNames < 1), вышеприведенное возвращает nil. Не уверен, что это уместно, и вам, возможно, придется обращаться с этим делом иначе.

0 голосов
/ 07 декабря 2009

Вам нужно где-то хранить, был ли выбран конкретный шар.

После того, как вы выбрали шар, если он был выбран ранее, вернитесь к началу функции и попробуйте снова.

Обратите внимание, что это, вероятно, не лучший способ справиться с этим - как только вы дойдете до того места, где в массиве есть только несколько невыбранных шаров, вы потратите много времени на перебор пока вы не получите новый. Лучшим способом было бы сохранить список еще не выбранных шаров и вырезать их из списка по мере их выбора.

РЕДАКТИРОВАТЬ: psuedocode-версия метода цикла, пока мы не нашли его. Вам нужно будет реализовать getIt () и Foo :: hasNotBeenPickedYet (), а также перевести его в реальный код.

Foo foo = null;
while(!foo) {
    Foo temp = getIt();
    if(temp.hasNotBeenPickedYet())
        foo = temp;
}
return foo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...