在iPhone应用程序中的测验中随机播放答案

时间:2013-06-23 06:55:14

标签: objective-c shuffle

我做了一个测验,并希望能够将答案改组,使其更具挑战性。这意味着当应该有一个方法可以检查哪个按钮是答案。如果回答是按钮1,则按钮1包含正确答案。如果回答是按钮4,则按钮4包含正确答案等。

现在,每次我玩新游戏时,代码都会对答案进行洗牌,但它会将所有4个按钮的标题设置为相同的标题,正确的答案始终是按钮1。

有什么想法吗?

菲利普

这就是我所拥有的。

- (IBAction)PlayHistory_Easy:(id)sender {

    // The questions        
    history_Easy = [[NSMutableArray alloc] initWithObjects:kHisQ_E1, kHisQ_E2, kHisQ_E3, kHisQ_E4,nil];

    numberOfQuestions = [history_Easy count];
    index = arc4random() % numberOfQuestions--;
    NSString *dd = [history_Easy objectAtIndex:index];
    questionLabel.text = dd;

    // Setup code to shuffle answers
    NSMutableArray *randomizeAnswer = [[NSMutableArray alloc] initWithObjects:btnOne, btnTwo, btnThree, btnFour, nil];
    NSMutableArray *ranAns = [[NSMutableArray alloc] initWithObjects:@"Answer 1", @"Answer 2", @"Answer 3", @"Answer 4", nil];

    if ([questionLabel.text isEqualToString:kHisQ_E1]) { // Answer 1st button

        for (UIButton *btn in randomizeAnswer) {

            int i = arc4random() % ranAns.count;
            NSString *str = [ranAns objectAtIndex:i];
            [btnOne setTitle:[ranAns objectAtIndex:i] forState:UIControlStateNormal];
            [btnTwo setTitle:[ranAns objectAtIndex:i] forState:UIControlStateNormal];
            [btnThree setTitle:[ranAns objectAtIndex:i] forState:UIControlStateNormal];
            [btnFour setTitle:[ranAns objectAtIndex:i] forState:UIControlStateNormal];

       } 
}

检查答案。在这里检查答案是手动完成的,但为了改变答案,代码明显不同。

- (IBAction)button1:(id)sender {

    if ([questionLabel.text isEqualToString:kHisQ_E1]) {
        [self playRIGHTAnswer_EASY];
    }
}

- (IBAction)button2:(id)sender {

    if ([questionLabel.text isEqualToString:kHisQ_E1]) {
        [self playWRONGAnswer_EASY];
    }
}

- (IBAction)button3:(id)sender {

    if ([questionLabel.text isEqualToString:kHisQ_E1]) {
        [self playWRONGAnswer_EASY];
    }
}

- (IBAction)button4:(id)sender {

    if ([questionLabel.text isEqualToString:kHisQ_E1]) {
        [self playWRONGAnswer_EASY];
    }
}

2 个答案:

答案 0 :(得分:1)

对所有对此感兴趣的人,我都会回答我自己的问题。

在试图解决这个问题时,我认为用每个问题简单地随机重新定位按钮会更容易。所以我用谷歌搜索了这个链接:

how to random placement of UIButton and value

我只使用了部分代码,因为我已经在IB中创建了我的按钮(出口和动作正确连接),所以只需要下面的代码。无论何时调用此代码,它都会根据您放入可变数组中的整数值替换按钮。

- (void)randomlyPositionAnswerButtons {

    //Create an array with the rectangles used for the frames
    NSMutableArray *indexArray = [NSMutableArray arrayWithObjects:
                                  [NSValue valueWithCGRect:CGRectMake(28, 230, 260, 42)],
                                  [NSValue valueWithCGRect:CGRectMake(28, 296, 260, 42)],
                                  [NSValue valueWithCGRect:CGRectMake(28, 359, 260, 42)],
                                  [NSValue valueWithCGRect:CGRectMake(28, 422, 260, 42)], nil];

    //Randomize the array
    NSUInteger count = [indexArray count];
    for (NSUInteger i = 0; i < count; ++i) {
        int nElements = count - i;
        int n = (arc4random() % nElements) + i;
        [indexArray exchangeObjectAtIndex:i withObjectAtIndex:n];
    }

    //Assign the frames
    btnOne.frame = [((NSValue *)[indexArray objectAtIndex:0]) CGRectValue];
    btnTwo.frame = [((NSValue *)[indexArray objectAtIndex:1]) CGRectValue];
    btnThree.frame = [((NSValue *)[indexArray objectAtIndex:2]) CGRectValue];
    btnFour.frame = [((NSValue *)[indexArray objectAtIndex:3]) CGRectValue];

}

答案 1 :(得分:0)

您似乎有逻辑错误和复制/粘贴错误。

退后一步,将数据存储(问题和答案)与逻辑(混洗)和UI(按钮)分开。目前你将所有这三件事混合在一起,这真的很混乱。

应存储您的数据,以便您拥有包含以下项目的列表:

  1. 问题
  2. 可能的答案
  3. 正确答案
  4. 当你洗牌时,只需更改可能答案的顺序(可能在源列表的可变副本中)。有很多用于混洗的算法,但是当你遍历列表时,你通常应该每次交换两个项目。

    现在,根据您的洗牌答案,您可以设置每个按钮的值。这应该是微不足道的。不要考虑洗牌按钮......

    按下按钮时,获取与之关联的答案并将其与正确答案进行比较。完成。

    如果你想整体提问,那么在上述任何一个问题开始之前,这应该是一个阶段。