我不完全确定我是否以正确的方式提出这个问题,但作为一名非英语人士,在编程领域很容易迷失方向。我正在寻找一种方法来制作标题中描述的程序。
为了说明:我想制作一个Who Wants to a Millionaire程序,提示用户提出问题,以及4个答案。
例如:
谁在星球大战中出演? a,Mark Hamill b,Ray Liotta c,摩根弗里曼,詹姆斯迪恩
如果用户输入正确答案('a),程序将继续进行下一个问题。我的问题是,如何使这个程序更容易阅读和有效,而不是简单地放一千个if-else分支?例如:
c=getchar();
if(c == 'a') printf("You got the right answer! Next question: ");
else printf("Sorry, wrong answer! Your game will end!");
我的问题是,以同样的方式进入下一个问题的最佳方法是什么,就像我问第一个问题一样?很抱歉外行人的条款,但我真的不知道该去哪里看。
答案 0 :(得分:2)
您在消除代码方面走在正确的轨道上。当有这样的重复性任务时,现在是时候退后一步思考了。许多初学者通过对长switch
或if
语句进行硬编码来解决重复性问题。现在,如果您既没有(a)文件也没有(b)容器,我建议如下布局。
为每个问题定义一个结构(原谅我生锈的C,希望我做对了):
typedef struct _Question {
char *question;
char *answers[4];
char correctAnswer;
} Question;
然后,创建一个数组,无论是动态(Question* questions = (Question*)malloc(n*sizeof(Question))
)还是静态(Question questions[n]
,但是你需要先知道你有多少问题)(因为你有一个硬编码的数量)问题,它可以是静态的,但从长远来看,它最好是一个动态数组)。在游戏之前创建一个用实际数据填充数组的函数。然后,转动你提到的部分,要求输入并将输入与正确答案进行比较,进入循环,例如:
int current = 0; char c; int fail = 0;
do {
/*print the question contained in questions[current].question*/
c = getchar();
if (c == 'q')
break;
if (c == questions[current].correctAnswer) {
/*print a "good" statement*/
++current;
} else {
/*print a "fail" statement */
fail = 1;
}
} while (current < num_of_questions && fail != 1);
当然,这是一种非常粗暴的做法。理想情况下,您希望从文件中读取问题数据以使代码更灵活(硬编码数据通常是一个坏主意,尽管此规则有例外。但这种数据肯定属于文件) 。我没有触及可以放入游戏中的得分,等级等。
编辑:值得注意的是,这个游戏可能是线性的,因为你只能从问题i
转到问题i+1
或者失败并离开游戏。