寻找制作非线性,多输入程序的建议(C)

时间:2016-02-20 11:53:00

标签: c

我不完全确定我是否以正确的方式提出这个问题,但作为一名非英语人士,在编程领域很容易迷失方向。我正在寻找一种方法来制作标题中描述的程序。

为了说明:我想制作一个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!");

我的问题是,以同样的方式进入下一个问题的最佳方法是什么,就像我问第一个问题一样?很抱歉外行人的条款,但我真的不知道该去哪里看。

1 个答案:

答案 0 :(得分:2)

您在消除代码方面走在正确的轨道上。当有这样的重复性任务时,现在是时候退后一步思考了。许多初学者通过对长switchif语句进行硬编码来解决重复性问题。现在,如果您既没有(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或者失败并离开游戏。

相关问题