Я тестирую ИИ для карточной игры, и у меня возникли проблемы, когда я заметил, что метод count объекта NSMutableArray никогда не увеличивался после использования его addObjectsFromArray метод. Я не только использую addObjectsFromArray в тесте, но и в методе для ИИ для добавления NSArray (или NSMutableArray ), и в обоих случаях ничего добавляется. В тесте я создаю полную колоду из 52 карт в случайном порядке, затем раздаю карты 3 ИИ и дополнительному NSMutableArray . Затем я вижу, какие карты уже есть у ИИ, затем вижу, что каждый ИИ будет разыгрывать в свой ход за значение, затем добавляю карты, которые он сыграл, в свою руку, прежде чем перейти к следующему ИИ.
Вот код:
for(int k = 1; k < 14; k++)
{
NSLog(@"-|-|-|-|-|- Current Value: %i", k);
NSLog(@"----- Easy");
[discard addObjectsFromArray:(NSArray*)[easy playHand:(NSUInteger)k]];
NSLog(@"Discard's Count: %i", [discard count]);
for(Card* cd in discard)
{
NSLog(@"card displayed = true");
[cd displayCard];
NSLog(@"card displayed = true");
}
//[discard makeObjectsPerformSelector:@selector(displayCard)];
[easy addCards:discard];
[discard removeAllObjects];
NSLog(@"------ Medium");
blah = (NSArray*) [Medium playHand:k];
[discard addObjectsFromArray:blah];
NSLog(@"Discard's Count: %i", [discard count]);
//[discard addObjectsFromArray:[Medium playHand:(NSUInteger)k]];
for(Card* cd in discard)
{
[cd displayCard];
}
//[discard makeObjectsPerformSelector:@selector(displayCard)];
[Medium addCards:discard];
[discard removeAllObjects];
NSLog(@"------ Hard");
[discard addObjectsFromArray:[HARD playHand:(NSUInteger)k]];
for(Card* cd in discard)
{
[cd displayCard];
}
//[discard makeObjectsPerformSelector:@selector(displayCard)];
[HARD addCards:discard];
[discard removeAllObjects];
NSLog(@" ");
NSLog(@" ");
}
Отсюда, сбрасывать должны ловить карты, сыгранные playHand, который возвращает NSMutableArray , а addObjectsFromArray принимает NSArray (все указатели, курс). Разве я не должен передавать их напрямую, используя строку ниже?
[discard addObjectsFromArray:[easy playHand:k]];
Быстрые обходные пути также не работают, с использованием отдельного указателя:
NSArray* blah = nil;
blah = [easy playHand];
[discard addObjectsFromArray:blah];
... или приведение типа с указателем (я проверял это, и оно не работало):
NSArray* blahblah = nil;
blahblah = (NSArray*)[easy playHand:k];
[discard addObjectsFromArray:blahblah];
Что я делаю не так? Разве это не автоматическое приведение типов или мне нужно использовать другую форму? Или я что-то пропускаю? Я постараюсь, чтобы он возвращал NSArray вместо этого, но контейнером в классе AI является NSMutableArray , поэтому я могу легко добавлять в него карты, не создавая копии массивов каждый раз, когда объект (ы) карты добавлены / удалены. (PS: Да, все правильно создано заранее, я просто оторвал эту часть, потому что это сделало фрагмент кода довольно длинным. И дополнительный NSMutableArray , содержащий оставшиеся 13 карт, имеет count return 13 с использованием addObject , но счет сброса никогда не меняется с 0.)