2012-05-04 23 views
-2

我有一个非常意想不到的问题,让我发疯。这是36卡非常简单的记忆游戏类型。在下面的代码中,我使用36个objets(18个双重对象)进行数组。当你在1-12之间选择卡时,一切都很好。当您选择较高的卡片时,匹配过程无法识别匹配。为什么???匹配图片

memory.m

for (int i = 0; i < [imagesArray count]; ++i) 
{ 
    int n = i; 
    [imagesArray exchangeObjectAtIndex:i withObjectAtIndex:n]; 
    NSLog(@"index obrázku %i",i); 
    NSLog(@"index array %i",n); 
} 

// Set button images 
for (int i=0; i<[buttonsArray count]; i++) { 
NSLog(@"index button %i",i); 

UIButton *singleButton = [buttonsArray objectAtIndex:i];  
[singleButton setBackgroundImage:[UIImage imageNamed:TILE_BACKGROUND] forState:UIControlStateNormal]; 
[singleButton setBackgroundImage:[UIImage imageNamed:TILE_BACKGROUND] forState:UIControlStateHighlighted]; 

if ([[imagesArray objectAtIndex:i] integerValue] == 1) { 
    [singleButton setBackgroundImage:[UIImage imageNamed:TILE_IMAGE1] forState:UIControlStateDisabled]; 
    NSLog(@"Karta 1 tag %i",i); 
} else if ([[imagesArray objectAtIndex:i] integerValue] == 2) { 
    [singleButton setBackgroundImage:[UIImage imageNamed:TILE_IMAGE2] forState:UIControlStateDisabled]; 
    NSLog(@"Karta 2 tag %i",i); 
} 

对象是从1到18 ...

- (IBAction)tileClicked:(id)sender { 

    // Button is clicked 
    if (!matchingInPogress) { 
     UIButton *clickedButton = sender; 
     tilesOpened++; 
     NSLog(@"Počet otočených karet je %i",tilesOpened); 
     [clickedButton setEnabled:NO]; 

     if (tilesOpened == 1) { 
      // Only one tiled opened, remeber tag for match 
      openTileIndex = clickedButton.tag; 
     } else { 
      // Second tile is opened, perform match 
      matchingInPogress = YES; 
      [self performSelector:@selector(matchTiles:) withObject:[NSNumber numberWithInt:clickedButton.tag] afterDelay:0.5]; 
      tilesOpened = 0; 
     } 
    } 

按钮控制..

- (void)matchTiles:(NSNumber *)clickedTile { 

    // Match opened tiles 
    int clickedTileIndex = [clickedTile integerValue]; 
    NSLog(@"Karta 1 tag %i",clickedTileIndex); 
    NSLog(@"Karta 2 tag %i",openTileIndex); 

    if ([imagesArray objectAtIndex:clickedTileIndex] != [imagesArray objectAtIndex:openTileIndex]) { 
     NSLog(@"Porovnává hodnoty v clickedTileIndex a openTileIndex"); 

     // If tiles don't match set them to enabled state 
     UIButton *firstButton = [buttonsArray objectAtIndex:openTileIndex]; 
     UIButton *secondButton = [buttonsArray objectAtIndex:clickedTileIndex]; 
     NSLog(@"Nesouhlas tag je %i",openTileIndex); 
     NSLog(@"Nesouhlas tag je %i",clickedTileIndex); 

     [firstButton setEnabled:YES]; 
     [secondButton setEnabled:YES]; 
    } else { 
     NSLog(@"Match!"); 
     UIButton *firstButton = [buttonsArray objectAtIndex:openTileIndex]; 
     UIButton *secondButton = [buttonsArray objectAtIndex:clickedTileIndex]; 
     NSLog(@"Souhlas tag je %i",openTileIndex); 
     NSLog(@"Souhlas tag je %i",clickedTileIndex); 
     [firstButton setHidden:YES]; 
     [secondButton setHidden:YES]; 
    } 

    matchingInPogress = NO; 
} 

和finaly匹配处理

由于!

+1

这是什么,Objective-C的? – JJJ

+0

@Juhana:我猜Obj-C/Cocoa ...我正在设置标签 – Seki

+0

这里有一个明显缺乏信息imo –

回答

0

由于数组只能包含对象,因此您不会使用!=进行测试,因为这只会比较指针的值而不是对象本身的值。很多时候,对于某些(通常较低的)值,这种方式很有效(即使您不期望它),但因为UIKit对象经常缓存对象而返回相同的对象地址,即使对于不同的实例也是如此。

您需要更改这一行tileClicked:

if ([imagesArray objectAtIndex:clickedTileIndex] != [imagesArray objectAtIndex:openTileIndex]) { 

这样:

if (![(UIImage *)[imagesArray objectAtIndex:clickedTileIndex] isEqual: 
    (UIImage *)[imagesArray objectAtIndex:openTileIndex]]) {