2013-06-23 91 views
0

我已經做了一個測驗,並希望它能夠隨機應變,使其更具挑戰性。這意味着當應該有一種方法可以檢查哪個按鈕是答案。如果答案是按鈕1,則按鈕1包含正確的答案。如果答案是按鈕4,則按鈕4包含正確的答案等。Shuffle在iPhone應用程序測驗中的答案

現在,代碼每當我玩一款新遊戲時都洗牌答案,但它將所有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]; 
    } 
} 

回答

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]; 

} 
0

您似乎同時存在邏輯錯誤和複製/粘貼錯誤。

退一步,將邏輯(混洗)和UI(按鈕)的數據存儲(問題和答案)分開。目前,你將所有這3種東西混合在一起,而且非常混亂。

你的數據應該存儲,讓您有包含的項目清單:

  1. 問題
  2. 可能的答案
  3. 正確答案

當你洗牌,只是改變了訂單可能的答案(可能在源列表的可變副本中)。有許多算法用於混洗,但是當您遍歷列表時,通常應該每次交換兩個項目。

現在,把你洗牌的答案,你可以設置每個按鈕的值。這應該是微不足道的。不要考慮洗牌按鈕...

當按鈕被按下時,得到與它相關的答案,並將其與正確的答案進行比較。完成。

如果您想整體打亂問題,那麼應該在上述任何一項開始前以單個階段完成。

+0

謝謝Wain。我會試試看。 –

相關問題