2013-02-01 6 views
0

В представлении моего приложения отображается сетка из 16 цифр. Каждый раз, когда нажимается кнопка, я хочу, чтобы расположение номеров изменялось и было случайным каждый раз. Приложение работает с 16 маленькими UIImageViews, каждое из которых связано с изображением (числом). В настоящий момент я «рандомизирую» схему, создавая случайное число и имея это число, соответствует конкретной компоновке. Например:Случайные числа в сетке

int number = rand() % 7; 

if (number == 1) { 
    space1.image = three; 
    space2.image = ten; 
    space3.image = one; 
    space4.image = eight; 
    space5.image = two; 
    space6.image = five; 
    space7.image = thirteen; 
    space8.image = six; 
    space9.image = four; 
    space10.image = fifteen; 
    space11.image = sixteen; 
    space12.image = nine; 
    space13.image = fourteen; 
    space14.image = eleven; 
    space15.image = twelve; 
    space16.image = seven; 
} 
else if (number == 2) { 
    space1.image = ten; 
    ................ 
    .............etc 

Очевидно, что есть миллионы возможных аранжировок, и я только улавливаю 7 из них здесь. Может ли кто-нибудь предложить способ по-настоящему рандомизировать организацию?

Надеюсь, я был достаточно ясен. Заранее благодарю за любую помощь.

Джордж

ответ

0

Подсказка в C, потому что это на самом деле не специфичны для Obj-C или IDE вы используете.

Image images[n]; 
numbers = {0, 1, 2, /* ... n - 1 */ }; 

shuffle(numbers); 
Images pmut[n]; 
for (int i = 0; i < n; ++i) { 
    pmut[i] = images[numbers[i]]; 
} 
1

Вы можете просто реализовать алгоритм Fisher-Yates shuffle.

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

Вы могли бы реализовать это следующим образом, например:

NSMutableArray * space; // Array containing your UIImageViews 
// Initial combination 
[(UIImageView *)space[0] setImage:one]; 
[(UIImageView *)space[1] setImage:two]; 
... 
[(UIImageView *)space[14] setImage:fifteen]; 
[(UIImageView *)space[15] setImage:sixteen]; 

[self fisherYatesShuffle:space]; 

Реализация FisherYates в случайном порядке будет:

- (void)fisherYatesShuffle:(NSArray *) array { 
    for(int i = array.count - 1; i >= 0; i++) { 
     int j = arc4random() % i; 
     [space exchangeObjectAtIndex:i withObjectAtIndex:j]; 
    } 
} 
+1

Как изменить определенный элемент не изменяемого массива? Кроме того, почему вы изобретаете колесо и не используете 'exchangeObjectAtIndex: withObjectAtIndex:'? –

+0

Вы совершенно правы, я просто перепутал вещи, выполнив половину функции в C. Сейчас я отредактирую. – tokou

+0

Спасибо, теперь это прекрасно. –

1

Вместо создания 16 идентичного переменного экземпляра, сохраните UIImageView объект в массиве, объекты UIImage в изменяемой матрице и рандомизировать элементы массива изображений:

NSMutableArray *imageViews, *images; 

imageViews = [[NSMutableArray alloc] init]; 
images = [[NSMutableArray alloc] init]; 

for (int i = 0; i < 16; i++) { 
    UImageView *imageView = [[UIImageView alloc] initWithFrame:someFrame]; 
    [imageViews addObject:imageView]; 
    [imageView release]; 

    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"image_%d"], i]; 
    [images addObject:image];   
} 

- (void)randomize 
{ 
    for (int i = 0; i < 100; i++) { 
     int idx1 = arc4random() % images.count; 
     int idx2 = arc4random() % images.count; 
     [images exchangeObjectAtIndex:idx1 withObjectAtIndex:idx2]; 
    } 

    for (int i = 0; i < imagesViews.count) { 
     [[imageViews objectAtIndex:i] setImage:[images objectAtIndex:i]]; 
    } 
} 
Смежные вопросы