使用arc4random分配随机图像?

时间:2010-02-19 02:39:07

标签: iphone image sdk uiimage imageview

好的,我会试着让这个更清楚,因为我的上一个问题非常令人困惑。这次我加了一张照片。这些圆圈中的每一个都是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 :(得分:0)

是的,您可以将UIImageView的image属性设置为相同的UIImage。事实上,你已经这样做了!

imageNamed:类方法在使用相同的图像文件名再次调用时将返回对同一对象的引用。

但是,您应该获取四次UIImage引用,然后使用它们。您还应该使用数组和循环或至少一个函数来使此代码更短更简单。

实际上,听起来你会希望你的四个UIImage引用是实例变量,以便你可以稍后将点击的UIImageView对象的image属性与它们进行比较。

答案 1 :(得分:0)

如果您的目的只是if子句,那么我要做的是定义两个字典,其中键作为颜色,值作为burbles数组,值为burble的位置。

NSDictionary *hitDictionaryOfBurbles;
NSDictionary *notCurrentlyBeingHitDictionaryOfBurbles;

定义了这个词典,你就拥有了当前没有被击中的所有颜色的所有项目。然后,您可以轻松地检查此字典中橙色数组的值,以查看有多少项。

当然,一旦被击中,你应该改变这两个词典的价值以反映这种变化。

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

如果您有其他逻辑支持,那么您应该定义更多数据结构。

答案 2 :(得分:0)

你总是按照一定的顺序一个接一个地击中这些,一次只有一种颜色有效吗?如果是这样,您可以创建一个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.pngcolor2.png,这将是一个更快乐的人。等等,并说出[UIImage imageNamed:[NSString stringWithFormat:@"color%i.png", randNum]];

答案 3 :(得分:0)

我认为创建一种更合理的方式将不同的彩色图像分配给图像视图也是明智之举,因此这个解决方案同时做到了。

这些应该在类的标题中声明

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
        }

    }

}