Objective c 在iPhone应用程序中的测验中洗牌答案

Objective c 在iPhone应用程序中的测验中洗牌答案,objective-c,shuffle,Objective C,Shuffle,我做了一个小测验,想让它重新排列答案,让它更具挑战性。这意味着应该有一种方法可以检查哪个按钮是答案。如果答案是按钮1,则按钮1包含正确答案。如果答案是按钮4,则按钮4包含正确答案等 现在,每次我玩一个新游戏时,代码都会对答案进行洗牌,但它会将所有4个按钮的标题设置为相同的标题,正确的答案始终是按钮1 有什么想法吗 菲利浦 这就是我所拥有的 - (IBAction)PlayHistory_Easy:(id)sender { // The questions his

我做了一个小测验,想让它重新排列答案,让它更具挑战性。这意味着应该有一种方法可以检查哪个按钮是答案。如果答案是按钮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];
    }
}

您似乎同时存在逻辑错误和复制/粘贴错误

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

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

  • 问题:
  • 可能的答案
  • 正确答案
  • 洗牌时,只需更改可能答案的顺序(可能在源列表的可变副本中)。有许多洗牌算法,但是当您在列表上迭代时,通常每次应该交换两个项目

    现在,根据你的随机答案,你可以设置每个按钮的值。这应该是微不足道的。不要想洗牌按钮

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


    如果你想把这些问题作为一个整体来处理,那么在上述任何一个问题开始之前都应该作为一个单独的阶段来处理。

    对于所有对此感兴趣的人,我提供了我自己问题的答案

    在试图弄明白这一点时,我认为简单地随机重新定位每个问题的按钮会更容易。所以我在谷歌上搜索并找到了这个链接:

    我只使用了部分代码,因为我已经在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];
    
    }
    
    -(无效)随机位置应答按钮{
    //使用用于帧的矩形创建一个数组
    NSMutableArray*indexArray=[NSMutableArray arrayWithObjects:
    [NSValue VALUE WITHCGRECT:CGRectMake(28,230,260,42)],
    [NSValue valueWithCGRect:CGRectMake(28296260,42)],
    [NSValue valueWithCGRect:CGRectMake(2835926042)],
    [NSValue-valueWithCGRect:CGRectMake(2842226042)],nil];
    //将数组随机化
    NSU整数计数=[indexArray计数];
    对于(整数i=0;i
    谢谢你,韦恩。我会试试看。