Цикл внутри цикла? - PullRequest
       18

Цикл внутри цикла?

0 голосов
/ 08 февраля 2011

У меня есть два изменяемых массива, которые я зацикливаю, когда объекты удаляются из массивов, меняются индексы, и мне нужно, чтобы значения 'rpoint' и 'rsprite' уменьшались на единицу, когда он повторяется и повторяет код.1001 *

вот то, что у меня есть, оно работает, когда у меня есть это.

    CGPoint cg1 = CGPointMake(33,33);
    NSValue *cg1obj = [NSValue valueWithCGPoint:cg1];

    CGPoint cg2 = CGPointMake(33,97);
    NSValue *cg2obj = [NSValue valueWithCGPoint:cg2];

    NSMutableArray *numberxy = [[NSMutableArray alloc] initWithCapacity:2]; int pointcount = 0;
    [numberxy insertObject:cg1obj atIndex:pointcount++];
    [numberxy insertObject:cg2obj atIndex:pointcount++];

    CGPoint red1point = CGPointMake(red1.position.x,red1.position.y);
    NSValue *red1pointobj = [NSValue valueWithCGPoint:red1point];

    CGPoint red2point = CGPointMake(red2.position.x,red2.position.y);
    NSValue *red2pointobj = [NSValue valueWithCGPoint:red2point];

    NSMutableArray  *sprites = [[NSMutableArray alloc] initWithCapacity:2]; int spritecount = 0;
    [sprites insertObject:red1pointobj atIndex:spritecount++];
    [sprites insertObject:red2pointobj atIndex:spritecount++];



    for (int i=0; i<3;i++) {
        int rpoint;
        int rsprite;

        do{
            rpoint = arc4random() % 2;
        rsprite = arc4random() % 2;
        } while (rpoint == 0 && rsprite == 0);

        CGPoint point = [[numberxy objectAtIndex:rpoint] CGPointValue];

        CGPoint sprite = [[sprites objectAtIndex:rsprite] CGPointValue];

        sprite = ccp(point.x,point.y);
        CCSprite *sprite1;

        if (rsprite <3) {
            sprite1 = [CCSprite spriteWithFile:@"Red tile.png"];
            sprite1.position = sprite;
            sprite1.scale = 0.9;
            [self addChild:sprite1];
        }
    }

, но как только я добавляю это в цикл for, оно не работает, и я понял, индексчисла изменяются из объектов в массивах при удалении, и поэтому диапазон для случайного числа, которое генерируется для целых чисел rpoint и rsprite (которые используются для получения случайного порядкового номера), должен уменьшаться на единицу, когда код повторяетсяно я не уверен, как ты это сделаешь.

if (sprite1.position.x == point.x && sprite1.position.y == point.y) {
            [numberxy removeObjectAtIndex:rpoint];
            [sprites removeObjectAtIndex:rsprite];
        }

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Очень плохая идея удалять элементы из массива, пока вы выполняете итерации по нему.

Предложением чего-то, что вы можете сделать вместо этого, является сохранение другого массива "элементов«удалить» (предпочтительно фактические указатели сохраненных объектов, а не индексы), затем, когда вы определили все объекты, которые вы хотите удалить из массива, вы перебираете этот список «элементов для удаления» и находите каждый объект восновной массив и удалите его.

0 голосов
/ 08 февраля 2011

Вы можете получить случайное число в зависимости от количества объектов в массиве, например:

do{            
    rpoint = arc4random() % [numberxy count];
    rsprite = arc4random() % [sprites count];
} while (rpoint == 0 && rsprite == 0);
...