我做了一个测验,并希望能够将答案改组,使其更具挑战性。这意味着当应该有一个方法可以检查哪个按钮是答案。如果回答是按钮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];
}
}
答案 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(按钮)分开。目前你将所有这三件事混合在一起,这真的很混乱。
应存储您的数据,以便您拥有包含以下项目的列表:
当你洗牌时,只需更改可能答案的顺序(可能在源列表的可变副本中)。有很多用于混洗的算法,但是当你遍历列表时,你通常应该每次交换两个项目。
现在,根据您的洗牌答案,您可以设置每个按钮的值。这应该是微不足道的。不要考虑洗牌按钮......
按下按钮时,获取与之关联的答案并将其与正确答案进行比较。完成。
如果你想整体提问,那么在上述任何一个问题开始之前,这应该是一个阶段。