Случайное расположение объекта - PullRequest
2 голосов
/ 11 мая 2010

Я делаю небольшое приложение в стиле викторины, но у меня есть несколько проблем.

Я случайным образом задаю вопросы из NSMutableArray с помощью arc4random (), затем заполняю представление тремя кнопками, одна из которых содержит правильный ответ, а две другие включают два неправильных ответа

что мне нужно сделать, это рандомизировать координату X (положение) 3 кнопок в представлении. Это код, который я использую, но он доставляет мне проблемы, поскольку он не работает должным образом, и приложение часто вылетает при вызове действия:

NSBundle *bundle02 = [NSBundle mainBundle];
NSString *textFilePath02 = [bundle02 pathForResource:@"possiblePositions" ofType:@"txt"];   
NSString *fileContents02 = [NSString stringWithContentsOfFile:textFilePath02 encoding:NSUTF8StringEncoding error:nil];
arrayPossiblePositions = [[NSMutableArray alloc] initWithArray:[fileContents02 componentsSeparatedByString:@"\n"]];

int length02 = [arrayPossiblePositions count];
int chosen02 = arc4random() % length02;
[arrayPossiblePositions removeObjectAtIndex:chosen02];
int chosen04 = arc4random() % length02;
[arrayPossiblePositions removeObjectAtIndex:chosen04];
int chosen05 = arc4random() % length02;

if ([questionString isEqualToString:@"question1"]) {

    buttonCorrect = [UIButton buttonWithType:UIButtonTypeCustom];
    CGRect newSize = CGRectMake(chosen02, 80, 130, 130);
    buttonCorrect.frame = newSize;
    [buttonCorrect setImage:[UIImage imageNamed:@"kncpf.png"] forState:UIControlStateNormal];
    [buttonCorrect addTarget:self action:@selector(answerCorrect) forControlEvents:UIControlEventTouchUpInside];
    [main addSubview:buttonCorrect];

    buttonUncorrect01 = [UIButton buttonWithType:UIButtonTypeCustom];
    CGRect newSize02 = CGRectMake(chosen04, 80, 130, 130);
    buttonUncorrect01.frame = newSize02;
    [buttonUncorrect01 setImage:[UIImage imageNamed:@"kncpf02.png"] forState:UIControlStateNormal];
    [buttonUncorrect01 addTarget:self action:@selector(answerUncorrect) forControlEvents:UIControlEventTouchUpInside];
    [main addSubview:buttonUncorrect01];

    buttonUncorrect02 = [UIButton buttonWithType:UIButtonTypeCustom];
    CGRect newSize034578 = CGRectMake(chosen05, 80, 130, 130);
    buttonUncorrect02.frame = newSize034578;
    [buttonUncorrect02 setImage:[UIImage imageNamed:@"kncpf034578.png"] forState:UIControlStateNormal];
    [buttonUncorrect02 addTarget:self action:@selector(answerUncorrect) forControlEvents:UIControlEventTouchUpInside];
    [main addSubview:buttonUncorrect02];
}

Можете ли вы предложить мне сделать что-то другое, потому что я действительно схожу с ума?

Заранее спасибо за ответы, David

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Я думаю, что arc4random () нужны верхние границы. Не уверен, правильно ли здесь используется значение по модулю или, скорее, это семантическая ошибка, не уверен, как дуга реагирует, когда вы пытаетесь выполнить такую ​​операцию без предварительной установки ее верхних границ. Я не уверен, попробуйте ввести твердое значение вместо вашего length02 и посмотрите, получаете ли вы ожидаемое поведение, а затем работайте в обратном направлении.

1 голос
/ 11 мая 2010

Мне действительно нужно было сделать что-то похожее, но вместо того, чтобы перемещать изображения, я решил вместо этого сделать следующее:

  • Создайте три кнопки там, где вы хотите, чтобы они появлялись (заранее определенные местоположения).
  • Назначьте изображения для каждой кнопки случайным образом (путем рандомизации NSMutableArray с NSStrings имен изображений).
  • Вместо назначения @selector (answerCorrect) и @selector (answerUncorrect), присвойте @selector (checkIfCorrect:)
  • Определите checkIfCorrect так:

- (void) checkIfCorrect: (id) отправитель {UIImage * buttonImage = sender.image;

if (buttonImage == [UIImage imageNamed: @ "kncpf.png"]) {[self answerCorrect]; } else {[self answerIncorrect]; }

}

ИЗМЕНЕНО ДЛЯ ВКЛЮЧЕНИЯ КОДА, который Я РЕКОМЕНДУЮ:

Также вы звоните

int length02 = [arrayPossiblePositions count];
int chosen02 = arc4random() % length02;
[arrayPossiblePositions removeObjectAtIndex:chosen02];
int chosen04 = arc4random() % length02;
[arrayPossiblePositions removeObjectAtIndex:chosen04];
int chosen05 = arc4random() % length02;

Обратите внимание, что length02 остается прежним, а размер arrayPossiblePositions изменяется. Вероятно, это первая причина сбоя вашего кода: вы пытаетесь удалить индекс из массива, который находится за пределами подсчета массива!

Я не проверял, но должен работать: (не забудьте определить checkanswer (), как я упоминал выше)

NSMutableArray *imagesArray = [NSMutableArray arrayWithObjects:@"image1.png", @"image2.png", @"image3.png", nil];

int count1 = [imagesArray count];
int index1 = arc4random() % count1;

button1 = [UIButton buttonWithType:UIButtonTypeCustom];
    CGRect newSize = CGRectMake(30, 80, 130, 130);
    button1.frame = newSize;
    [button1 setImage:[UIImage imageNamed:[imagesArray objectAtIndex:index1]] forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(checkAnswer:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];

[imagesArray removeObjectAtIndex:index1];
int count2 = [imagesArray count];
int index2 = arc4random() % count2;

button2 = [UIButton buttonWithType:UIButtonTypeCustom];
    CGRect newSize = CGRectMake(160, 80, 130, 130);
    button2.frame = newSize;
    [button2 setImage:[UIImage imageNamed:[imagesArray objectAtIndex:index2]] forState:UIControlStateNormal];
    [button2 addTarget:self action:@selector(checkAnswer:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button2];

[imagesArray removeObjectAtIndex:index2];
int count3 = [imagesArray count];
int index3 = arc4random() % count3;

button3 = [UIButton buttonWithType:UIButtonTypeCustom];
    CGRect newSize = CGRectMake(290, 80, 130, 130);
    button3.frame = newSize;
    [button3 setImage:[UIImage imageNamed:[imagesArray objectAtIndex:index3]] forState:UIControlStateNormal];
    [button3 addTarget:self action:@selector(checkAnswer:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button3];
...