Назначение случайного изображения с помощью arc4random? - PullRequest
0 голосов
/ 19 февраля 2010

Хорошо, я попытаюсь прояснить это, потому что мой последний вопрос был очень запутанным. На этот раз я включил картинку. Каждый из этих кругов представляет собой UIImageView, и каждому из них назначается случайное изображение, которое имеет один из 7 цветов. Таким образом, каждый круг может быть одного из 7 цветов. Я хочу сделать так, чтобы пользователю приходилось нажимать на кружки в порядке предварительно определенного порядка в соответствии с цветом. Например, синий, зеленый, желтый, розовый, фиолетовый, оранжевый, красный. Моя огромная проблема заключается в том, что я не могу понять, как определить, ударил ли по цвету, который не должен быть выбран. Есть ли способ присвоить нескольким представлениям изображений одно и то же значение, а затем каким-то образом иметь оператор if, который говорит ....

if(a blue circle is hit && ANY ORANGE CIRCLE IS STILL IN VIEW){
do something
}

Единственный способ, которым я знаю, как закодировать это, - это безумное количество кода, потому что все случайные изображения назначаются.

    bluebubble = [UIImage imageNamed:@"bluebubble.png"];
    greenbubble = [UIImage imageNamed:@"greenbubble.png"];
    redbubble = [UIImage imageNamed:@"redbubble.png"];
    yellowbubble = [UIImage imageNamed:@"yellowbubble.png"];
    orangebubble = [UIImage imageNamed:@"orangebubble.png"];
    pinkbubble = [UIImage imageNamed:@"pinkbubble.png"];
    purplebubble = [UIImage imageNamed:@"purplebubble.png"];


    image1 = arc4random()%7;

    if(image1 == 0){
        [test setImage:bluebubble];
    }
    else if(image1 == 1){
        [test setImage:greenbubble];
    }
    else if(image1 == 2){
        [test setImage:redbubble];
    }
    else if(image1 == 3){
        [test setImage:yellowbubble];
    }
    else if(image1 == 4){
        [test setImage:orangebubble];
    }
    else if(image1 == 5){
        [test setImage:pinkbubble];
    }
    else if(image1 == 6){
        [test setImage:purplebubble];
    }

    image2 = arc4random()%7;

    if(image2 == 0){
        [test2 setImage:bluebubble];
    }
    else if(image2 == 1){
        [test2 setImage:greenbubble];
    }
    else if(image2 == 2){
        [test2 setImage:redbubble];
    }
    else if(image2 == 3){
        [test2 setImage:yellowbubble];
    }
    else if(image2 == 4){
        [test2 setImage:orangebubble];
    }
    else if(image2 == 5){
        [test2 setImage:pinkbubble];
    }
    else if(image2 == 6){
        [test2 setImage:purplebubble];
    }

alt text

Ответы [ 4 ]

0 голосов
/ 28 февраля 2010

Я думаю, что также разумно создать более разумный способ присвоения изображений разного цвета вашим представлениям изображений, поэтому это решение делает и то и другое.

Они должны быть объявлены в заголовке класса

NSArray *allCircleImagesViews; // These are suppose to be the onscreen UIImagesViews 

NSArray *circlesByColor;
NSMutableArray *correctCircles; // The current circles the user is allowed to click
NSArray *colorOrder; // The order of the colors to click
int currentColorIndex; // The current index in the order of colors

Теперь о функциях: Первый создает назначение разных цветных изображений, устанавливает правильный порядок цветов и устанавливает механизм, чтобы определить, был ли выбран правильный цвет

- (void) populateImages
{
    NSArray *images = [NSArray arrayWithObjects:
                       [UIImage imageNamed:@"bluebubble.png"],
                       [UIImage imageNamed:@"redbubble.png"],
                       [UIImage imageNamed:@"yellowbubble.png"],
                       [UIImage imageNamed:@"greenbubble.png"],
                       [UIImage imageNamed:@"orangebubble.png"],
                       [UIImage imageNamed:@"pinkbubble.png"],
                       [UIImage imageNamed:@"purplebubble.png"],
                       nil];

    NSArray *circlesByColor=[NSArray arrayWithObjects:
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             nil];
    [circlesByColor retain];

    // Assign images to circles and set the 
    for (UIImageView *currCircle in allCircleImagesViews)
    {
        int nextIndex = arc4random()%7; 
        currCircle.image = [images objectAtIndex:0];
        [(NSMutableArray *)[circlesByColor objectAtIndex:nextIndex] addObject:currCircle];
    }

    // Set the correct order
    NSArray *colorOrder = [NSArray arrayWithObjects:
                  [NSNumber numberWithInt:5], // Pink
                  [NSNumber numberWithInt:0], // Blue 
                  [NSNumber numberWithInt:1], // etc.
                  [NSNumber numberWithInt:4],
                  [NSNumber numberWithInt:2],
                  [NSNumber numberWithInt:3],
                  [NSNumber numberWithInt:6],nil];
    [colorOrder retain];

    currentColorIndex = 0;            
    correctCircles = [circlesByColor objectAtIndex:[[colorOrder objectAtIndex:currentColorIndex] intValue]];
}

Следующая функция проверяет, был ли выбран правильный круг

- (void) checkCircle:(UIImageView *)clickedImageView
{
    BOOL result;

    if ([correctCircles containsObject:clickedImageView])
    {
        [correctCircles removeObject:clickedImageView];
        result = YES;
    }
    else {
        result =  NO;
    }


    if ([correctCircles count] == 0)
    {
        currentColorIndex++;
        if (currentColorIndex < 7)
            correctCircles = [circlesByColor objectAtIndex:[[colorOrder objectAtIndex:currentColorIndex] intValue]];
        else
            correctCircles = nil;
    }

    if (!result)
    {
        // Wrong circle clicked logic
    }
    else {
        if (!correctCircles)
        {
            // Game won logic
        }
        else {
            // Correct circle clicked logic
        }

    }

}
0 голосов
/ 28 февраля 2010

Если ваша цель - просто предложение if, то я бы определил два словаря с ключом в качестве цвета и со значениями в виде массивов булыжников со значением, определяющим местоположение буллы.

NSDictionary *hitDictionaryOfBurbles;
NSDictionary *notCurrentlyBeingHitDictionaryOfBurbles;

С этим определенным словарем у вас есть все предметы всех цветов, которые в настоящее время не поражены. Затем вы можете легко проверить этот словарь по значению массива оранжевого цвета, чтобы увидеть, сколько элементов есть.

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

Es.

hitDictioanryOfBurbles: 
        "blue", [0,7,13]
        "green", [2,6,16]
         etc...
notCurrentlyBeingHitDictioanryOfBurbles: 
        "blue", [25,33,37]
        "green", [19,27,29]
         etc...

Если у вас есть другая логика для поддержки, вам следует определить больше структур данных.

0 голосов
/ 28 февраля 2010

Всегда ли вы будете наносить удары по ним в определенном порядке, один за другим, где одновременно действует только один цвет? Если это так, вы можете создать стек UIImage с (я не думаю, что есть встроенный тип данных стека, но вы можете легко смоделировать его с помощью NSMutableArray), состоящим из цветов по порядку.

Вы также отслеживаете все подпредставления цветового круга на экране в отдельном NSMutableArray. Затем всякий раз, когда пользователь попадает в круг, выполняется следующий код:

if(hitImageView.image == [imageStack peek]) {
    //"hit the right one" logic

    //you hit it, so remove it from the screen
    [allImageViews removeObject:hitImageView];
    [hitImageView removeFromSuperView];

    //if it was the last imageview of the "correct" color...
    BOOL wasLast = YES;

    for(UIImageView *imageView in allImageViews) {
        if(imageView.image == [imageStack peek]) {
            wasLast = NO;
            break;
        }
    }

    //...then set the correct color to whatever is next
    if(wasLast)
        [imageStack pop];

    if(![imageStack hasItems])
       ;//"won the game" logic

}
else {
    //"hit the wrong one" logic
}

(Это O (N) для определения оставшихся кругов, но если вы имеете дело с таким небольшим набором, это действительно не имеет значения. Если вам нужно оптимизировать его, вы, конечно, можете отслеживать оставшиеся количество каждого цвета.)

С другой стороны, вы будете намного счастливее, если вместо того, чтобы использовать этот гигантский блок if-else для определения правильного цвета, просто назовите файлы color1.png, color2.png и т. Д. И скажите [UIImage imageNamed:[NSString stringWithFormat:@"color%i.png", randNum]];

0 голосов
/ 19 февраля 2010

Да, вы можете установить для свойства image UIImageView то же UIImage.Фактически, вы уже делаете это!

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

Однако вы должны получитьчетыре ссылки UIImage один раз, а затем использовать их.Вы также должны использовать массив и цикл или, по крайней мере, функцию, чтобы сделать этот код короче и проще.

На самом деле, звучит так, как будто вы хотите, чтобы ваши четыре ссылки UIImage были переменными экземпляра, чтобы вы могли сравнить image свойство подключенных объектов UIImageView к ним позже.

...