Вопрос:

Как заставить программу не ждать ввода

c

483 просмотра

3 ответа

31 Репутация автора

РЕДАКТИРОВАТЬ 1:

Я хотел бы иметь программу, которая проверяет нажатие клавиши ввода, а затем пропускает некоторый код после нее (вроде как в некоторых играх с пропускаемыми экранами при их запуске). Но я не хочу ждать ввода.

if(getchar()=='\n') 
{
goto skip;
}
ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);
ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);
ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);
ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);
ClearScreen();
//this is the where it should skip
skip:
printf("%s                                         Welcome to Guy's game!\n\n");
printf("Please enter your name: ");
gets(name);
Sleep(250);

Я хочу, чтобы он проверял вход, пока он печатает "Добро пожаловать в игру Гая!" так что, независимо от того, когда я нажимаю клавишу ввода (пока она печатает «Добро пожаловать в игру Гая!»), я могу перейти к последней части кода. Я не могу понять, как заставить это работать.

ОБНОВИТЬ:

У меня есть еще один вопрос, который я забыл задать .. Как я могу исправить «предупреждение: неявное объявление функции« Сон », когда я использую:

ClearScreen();
printf("%s                                         Welcome to Guy's game!\n\n");
Sleep(500);

внутри для цикла.

Автор: Guy Источник Размещён: 22.08.2016 09:34

Ответы (3)


0 плюса

81 Репутация автора

Начните тему, которая показывает ваше сообщение. Тем временем читайте клавиатуру в ожидании удара. Когда пользователь нажимает ввод, завершает поток, который показывает текст, и возобновляет нормальный поток, переходя на новый экран.

Автор: Valmir Cinquini Размещён: 22.08.2016 09:38

2 плюса

58744 Репутация автора

Вы должны изменить свой терминал, чтобы не выполнять каноническую обработку ключей.

Все терминалы хранят информацию на некоторое время, чтобы позволить пользователю, например, нажать клавишу Backspace (и программа не получает стертый символ). Эта буферизация нажатий клавиш не отправляется в программу до тех пор, пока не будет нажата специальная клавиша «очистки буфера», например, Enter или Return.

В игре это нежелательно, вам нужны ключи, как только вы можете их получить. Это означает, что вашей программе потребуется структура данных termios, а затем отключите (связываясь с терминалом) обработку канонического ключа. Обратите внимание, что это означает, что вам придется обрабатывать удаление пробелов в вашей программе (если вы захотите это в других частях вашей программы, например, вводить имена, чтобы получить высокий балл).

// define a terminal configuration data structure
struct termios term;

// copy the stdin terminal configuration into term
tcgetattr( fileno(stdin), &term );

// turn off Canonical processing in term
term.c_lflag &= ~ICANON;

// set the terminal configuration for stdin according to term, now
tcsetattr( fileno(stdin), TCSANOW, &term);

Обратите внимание, что это только улучшает ответ; но на самом деле у вас все еще есть небольшие задержки, поскольку терминал связывается с ядром, а затем ядро ​​связывается с вашей программой.

Например, ядро ​​фактически захватывает события нажатия клавиши / вверх и оценивает их в течение короткого периода времени, чтобы определить, нужно ли «автоповторить» клавишу.

Я рекомендую вам не рисковать писать этот код самостоятельно, если вы заинтересованы в быстром выпуске своей игры. Вместо этого используйте библиотеку игрового программирования, которая взаимодействует и настраивает вашу среду соответствующим образом, как allegro.

Однако, если вам интересно, как это работает под прикрытием, непременно напишите свой код для его обработки (поскольку это довольно увлекательная тема, и вы действительно поймете связь терминала / программы / ядра намного лучше!).

Автор: Edwin Buck Размещён: 22.08.2016 09:46

0 плюса

31 Репутация автора

Решение

Итак .. Я наконец-то решил это! Я создал новую программу, чтобы попытаться найти способ исправить ту, над которой я сейчас работаю.

(Код входит в [...] из

#include <stdio.h>
#include <conio.h>
#include <windows.h>

void ClearScreen(void)
{
  system("cmd /c cls");
}

int main(void)
{
  [...] //Everything is in here for next examples
}

для следующих примеров)

Для любого письма:

  int i=0;
  char name[20];

  while(1)
  {
    for(i=1; i>0&&i<5; i++)
    {
      //ClearScreen();
      printf("%i", i);
      printf("                                         Welcome to Guy's game!\n\n");
      Sleep(500);
      while (kbhit())
      { 
        getch();
        goto INPUT;
        i=0;
      }   
    }
  goto INPUT;
  }
  INPUT:
  ClearScreen();
  //this is the where it should skip
  printf("                                         Welcome to Guy's game!\n\n");
  printf("Please enter your name: ");
  gets(name);
  Sleep(250);
  printf("%s", name);
  return 0;

Только для одной буквы:

  int i=0;
  char name[20];

  while(1)
  {
    for(i=1; i>0&&i<5; i++)
    {
       //ClearScreen();
       printf("%i", i);
       printf("                                         Welcome to Guy's game!\n\n");
       Sleep(500);
       while (kbhit()&&getch()== 'p')
       {
         goto INPUT;
         i=0;
       }   
    }
    goto INPUT;
  }
  INPUT:
  ClearScreen();
  //this is the where it should skip
  printf("                                         Welcome to Guy's game!\n\n");
  printf("Please enter your name: ");
  gets(name);
  Sleep(250);
  printf("%s", name);
  return 0;

Вы можете использовать это в своем коде, если хотите! Удачи и спасибо за все ваши ответы!

* Кстати, я заставил его показывать числа в цикле, чтобы доказать, что программа работает, но вы можете убрать эту часть, потому что она не нужна.

Автор: Guy Размещён: 24.08.2016 02:08
Вопросы из категории :
32x32