2016-02-20 1 views
0

Я не совсем уверен, правильно ли я спрашиваю об этом, но, как не говорящий по-английски, легко заблудиться в мир программирования. Я ищу способ сделать программы, как описано в названии.Ищите советы для создания нелинейных программ с несколькими входами (C)

Чтобы проиллюстрировать: Я хочу сделать Кто хочет стать миллионером, который подскажет пользователю вопрос и 4 ответа.

0 Например:

Кто играет в Звездные войны? а, Марк Хэмилл б, Рэй Лиотта с, Морган Фримен d, Джеймс Дин

Если пользователь вводит правильный ответ ('а), то программа переходит к следующему вопросу. Мой вопрос: как сделать эту программу более читабельной и эффективной, чем просто положить тысячу ветвей 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

Почему вы выбрали C для выполнения этой задачи? Вам будет лучше с C++, и это стандартные библиотеки для работы со строками и контейнерами. – iksemyonov

+0

Я должен выполнить задание в C. Это один из них. –

+0

Являются ли данные вопроса хранятся в файле или вы его жестко кодируете? – iksemyonov

ответ

2

Вы находитесь на правильном пути относительно устранения кода. Когда есть такая повторяющаяся задача, пришло время отступить и немного подумать. Многие новички решают повторяющиеся проблемы с помощью жесткого кодирования длинного длинного switch или if. Теперь, если у вас нет ни (а) файлов, ни (б) контейнеров в вашем распоряжении, я бы предложил макет следующим образом.

Определить структуру для каждого вопроса, как так (простите мой ржавый 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 или выйти из игры и выйти из игры.

Смежные вопросы