2009-07-27 6 views
0

У меня есть 52 записи в БД, получить их и сохранить в массиве. Теперь я хочу распределить их по четырем массивам, каждый массив будет иметь 7 записей, поэтому только 28 записей будут среди 4-х массивов, а оставшиеся будут в новом массиве temp. На самом деле это карточная игра с четырьмя игроками, карта будет распределяться следующим образом: начиная с первого игрока - первая карта для первого игрока, вторая для второго игрока, третья для третьего игрока и четвертая для четвертого игрока. Этот процесс будет повторяться, пока каждый игрок имеет 7 карт.iphone Случайное число выпуск

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

Спасибо,

Aaryan

ответ

1

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

Не забудьте рассчитать генератор случайных чисел при запуске с srand48().

// --- NSMutableArray+Random.h --- 
#import <Foundation/Foundation.h> 

@interface NSMutableArray (Random) 
    /// Shuffle a mutable array in place. Uses a Fisher-Yates shuffle as described 
    /// in http://en.wikipedia.org/wiki/Fisher-Yates_shuffle . 
    - (void)shuffle; 
@end 

// --- NSMutableArray+Random.m 
#import "NSMutableArray+Random.h" 

/// Return a pseudo-random unsigned integer in the range 
/// [0, exclusiveUpperBound) using the mrand48() function. 
/// Seed the random number state by calling srand48(). 
/// See http://developer.apple.com/iphone/library/documentation/System/Conceptual/ManPages_iPhoneOS/man3/rand48.3.html 
static NSUInteger randomUIntegerFromZeroUpTo(NSUInteger exclusiveUpperBound) { 
    NSUInteger const maxUInteger = 0xffffffff; 
    NSUInteger largestMultipleOfMaxUInteger 
     = maxUInteger - (maxUInteger % exclusiveUpperBound); 
    // discard random integers outside the range [0, largestMultipleOfMaxUnsignedInteger) 
    // to eliminate modulo bias 
    NSUInteger randomUInteger; 
    do { 
    randomUInteger = (NSUInteger) mrand48(); 
    } while (randomUInteger >= largestMultipleOfMaxUInteger); 
    return randomUInteger % exclusiveUpperBound; 
} 

@implementation NSMutableArray (Random) 
- (void)shuffle { 
    for (NSUInteger unshuffled = self.count; unshuffled > 1; --unshuffled) { 
    NSUInteger index1 = unshuffled - 1; 
    NSUInteger index2 = randomUIntegerFromZeroUpTo(unshuffled); 
    [self exchangeObjectAtIndex:index1 withObjectAtIndex:index2]; 
    } 
} 
@end 
0

Вы должны проверить this answer about Shuffle Bag.

Когда вы распространяете ваши карты, вы составьте список ваших 52 карт и сделать что-то вроде этого:

listOfCards = { /* init, order not important */ } 
cardsToDistribute = [] 

28.times do 
    nextCard = listOfCards[random(0, listOfCards.size)] 

    listOfCards.remove(nextCard) //side effect: decrement listOfCards.size by 1 

    cardsToDistribute << nextCard 
end 

7.times do 
    player1.cards << cardsToDistribute.removeFirst //side effect: decrement cardsToDistribute.size by 1 
    player2.cards << cardsToDistribute.removeFirst 
    player3.cards << cardsToDistribute.removeFirst 
    player4.cards << cardsToDistribute.removeFirst 
end 

(К сожалению, я не знаю, Objective-C очень хорошо, так что это Rubyist псевдо-код ;)

Смежные вопросы