如何使程序不等待输入

问题描述:

编辑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); 

我想它来检查进入而它打印“欢迎Guy的游戏!”所以无论何时按下输入键(只要它正在打印“欢迎来到Guy的游戏!”),我可以跳到代码的最后部分。 我无法弄清楚如何让这个工作。

UPDATE:

我有一个问题,我忘了问.. 如何解决“警告:函数‘睡眠’隐式声明,当我使用:

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

在for循环中

+0

Google for'while循环等待输入'也许指向您的目标解决方案。 – meAbab

+0

如果您使用的是Windows,请在每个'printf'之后使用'kbhit'来查看用户是否推送了一个密钥。 – user3386109

+0

@ user3386109是不是在包中? – Guy

所以..我终于解决了!我创建了一个新程序来尝试找出如何解决我目前正在处理的问题。

(代码在[...]的

#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; 

如果你喜欢,你可以在你的代码中使用它!祝你好运,并感谢你的答案!

*顺便说一句,我让它在循环中显示数字,以便它可以证明该程序的工作原理,但是可以将该部分取出,因为它不是必需的。

启动一个显示你的消息的线程同时读取键盘等待命中当用户点击输入时终止显示文本的线程并恢复正常流量跳到新屏幕。

+0

如何创建线程?对不起,我不知道我试图查找它,但我不明白。 – Guy

+1

那么你有线程库运行在Linux下,但不是windoze,以及那些运行在windoze下,但不是在Linux上。所以,如果你使用gcc的Windows 10,你有一个霍布森的选择。 –

你需要改变你的终端不做规范密钥处理。

所有的终端都会保留一段时间的信息,以允许用户点击退格键(并且程序没有获取擦除的字符)。这种按键缓冲不会发送到程序,直到按下特殊的“缓冲器冲洗”键,如Enter或Return。

在游戏中这是不受欢迎的,只要你能得到它们,你就想要钥匙。这意味着您的程序将需要termios数据结构,然后关闭(与终端通信)Canonical密钥处理。请注意,这意味着您必须在程序中处理退格删除(如果您希望在程序的其他部分使用退格删除,例如输入姓名以获得高分)。

// 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); 

请注意,这只会改善响应;但是,当终端与内核进行通信时,实际上您仍然有小的延迟,然后内核会与您的程序进行通信。

例如,内核实际上捕获按键/按键事件,并在短定时器周期内评估它们以确定按键是否需要“自动重复”。

我的建议是,如果你有兴趣让你的游戏快速出来,你就不要冒险去编写这段代码。相反,使用一个游戏编程库来适当地交互和配置你的环境,比如快板。但是,如果你对这个如何在封面下工作感兴趣,尽一切办法编写你的代码来处理它(因为它是一个相当迷人的话题,你真的会更好地理解终端/程序/内核通信! )。

+0

我试过使用编程库,但我似乎无法找到在哪里得到它们或如何使它们在我的代码中正确工作。我尝试了'#include '和'#include Guy

+0

这是在Windows上工作还是只是POSIX? –

+0

像allegro和其他游戏库这样的图书馆的代码是windows/linux敏感的,并且会根据安装的平台做正确的事情。它不会允许你按照你设想的方式在等待输入时进行显示,但它可以让你“检测关键点”和“检测关键点”,就像你可能对按键长度重要的游戏所做的那样,然后你做一个“获取输入”,“更新数据”,“绘制输出”循环来处理绘制到屏幕上。 –