В ANSI C, как я могу сделать таймер?

Я делаю игру Boggle на C для проекта. Если вы не знакомы с Boggle, ничего страшного. Короче говоря, у каждого раунда есть ограничение по времени. Я ограничиваю время 1 минутой.

У меня есть цикл, который отображает игровое поле и просит пользователя ввести слово, затем вызывает функцию, которая проверяет, принято ли слово, а затем снова зацикливается.

    while (board == 1)
{

    if (board == 1)
    {
        printf(display gameboard here);
        printf("Points: %d                  Time left: \n", player1[Counter1].score);

        printf("Enter word: ");
        scanf("%15s", wordGuess);

        pts = checkWord(board, wordGuess);

while (board == 1) нужно изменить так, чтобы он зацикливался только на 1 минуту.

Я хочу, чтобы пользователь мог сделать это только в течение 1 минуты. Я также хотел бы, чтобы время отображалось там, где у меня есть Время осталось: в выражении printf. Как бы я этого добился? Я видел в Интернете несколько примеров других, использующих таймер в C, и единственный способ, которым я думаю, что это возможно, - это если я позволю пользователю превысить ограничение по времени, но когда пользователь попытается ввести слово после ограничения по времени, он уведомит их, что время истекло. Есть ли другой способ?

РЕДАКТИРОВАТЬ: я пишу это на ПК с Windows 10.


person brann22    schedule 27.04.2018    source источник
comment
API gettimer()/setitimer() может вам помочь.   -  person gzh    schedule 27.04.2018
comment
какую платформу вы используете?   -  person John Stone    schedule 27.04.2018
comment
В стандартном C нет хорошего способа сделать это; вы обязаны использовать код для конкретной платформы. Таким образом, определение платформы имеет решающее значение.   -  person Jonathan Leffler    schedule 27.04.2018
comment
Извини. Я забыл упомянуть, что я использую Windows 10.   -  person brann22    schedule 27.04.2018
comment
В ANSI C нет ничего о таймерах, вам нужно вызвать API. Есть несколько способов сделать это, вы можете настроить событие таймера, но это, вероятно, слишком много для новичка, и вы хотите показать оставшееся время, поэтому посмотрите msdn.microsoft.com/en-us/library/windows/desktop/   -  person cdarke    schedule 27.04.2018
comment
@brann22: Если вы хотите обновлять таймер одновременно с вводом текста пользователем и контролировать все содержимое окна терминала, вы можете использовать Проклятия. Для Windows 10 вы можете использовать либо ncurses через WSL, либо, например, PDCurses.   -  person Nominal Animal    schedule 28.04.2018


Ответы (1)


Используйте стандартный C time(), чтобы получить количество секунд (реальное -мировое время) с Epoch (1970-01-01 00:00:00 +0000 UTC) и difftime() для подсчета количества секунд между двумя значениями time_t.

Для количества секунд в игре используйте константу:

#define  MAX_SECONDS  60

Затем,

char    word[100];
time_t  started;
double  seconds;
int     conversions;

started = time(NULL);
while (1) {

    seconds = difftime(time(NULL), started);
    if (seconds >= MAX_SECONDS)
        break;

    /* Print the game board */

    printf("You have about %.0f seconds left. Word:", MAX_SECONDS - seconds);
    fflush(stdout);

    /* Scan one token, at most 99 characters long. */
    conversions = scanf("%99s", word);
    if (conversions == EOF)
        break;    /* End of input or read error. */
    if (conversions < 1)
        continue; /* No word scanned. */

    /* Check elapsed time */
    seconds = difftime(time(NULL), started);
    if (seconds >= MAX_SECONDS) {
        printf("Too late!\n");
        break;
    }

    /* Process the word */
}
person Nominal Animal    schedule 27.04.2018