【问题标题】:Shuffle Answers in Quiz in iPhone App在 iPhone 应用程序的测验中随机播放答案
【发布时间】:2026-01-24 15:50:01
【问题描述】:

我做了一个测验,并希望它能够随机排列答案,使其更具挑战性。这意味着什么时候应该有一种方法可以检查哪个按钮是答案。如果答案是按钮 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];
    }
}

【问题讨论】:

    标签: objective-c shuffle


    【解决方案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];
    
    }
    

    【讨论】:

      【解决方案2】:

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

      退后一步,将数据存储(问题和答案)与逻辑(洗牌)和 UI(按钮)分开。目前你把这三样东西混在一起,真的很乱。

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

      1. 问题
      2. 可能的答案
      3. 正确答案

      当您随机播放时,只需更改可能答案的顺序(可能在源列表的可变副本中)。洗牌的算法有很多,但是当您遍历列表时,您通常应该每次交换两个项目。

      现在,您可以根据随机排列的答案设置每个按钮的值。这应该是微不足道的。不要考虑随机播放按钮...

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

      如果您想将问题作为一个整体进行洗牌,则应在上述任何一项开始之前作为一个阶段完成。

      【讨论】:

      • 谢谢韦恩。我会试试看的。