-3

非常に予期せぬ問題が発生し、頭がおかしくなりました。36枚のカードを使ったとてもシンプルなタイプのメモリーゲームです。以下のコードでは、36 個のオブジェクト (18 個の double オブジェクト) で配列を作成しています。1 ~ 12 のカードを選択すると、すべてがうまく機能します。より高いカードを選択すると、マッチングプロセスは一致を認識できません。どうして???

メモリ.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;
}

そして最終的なマッチングプロセス

ありがとう!

4

1 に答える 1

0

配列にはオブジェクトのみを含めることができるため!=、オブジェクト自体ではなくポインターの値のみを比較するため、配列をテストしません。非常に多くの場合、これは一部の (通常は低い) 値では機能しますが (期待しない場合でも)、他の値では機能しなくなります。これは、UIKit オブジェクトがオブジェクトをキャッシュし、異なるインスタンスであっても同じオブジェクト アドレスを返すことがよくあるためです。

tileClicked で次の行を変更する必要があります。

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

これに:

if (![(UIImage *)[imagesArray objectAtIndex:clickedTileIndex] isEqual:
     (UIImage *)[imagesArray objectAtIndex:openTileIndex]]) {
于 2012-05-05T06:55:03.100 に答える