0

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

2 回答 2

1

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

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

如何随机放置 UIButton 和值

我只使用了部分代码,因为我已经在 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];

}
于 2013-09-09T11:43:42.920 回答
0

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

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

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

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

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

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

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

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

于 2013-06-23T08:10:49.193 回答