2016-11-27 64 views
-2

我们在学校有一个项目,编写排球比赛作为控制台应用程序。 我们应该为球队输入输出和得分等,并将关键字绑定到Team1-score + 1,Team2-score-1等等。这很好。我们使用getch()来绑定这些键。 我的问题:例如,如果您按R键,R是Team1-score + 1并按住此键,它将继续添加分数+1,我们应该停止该操作,因此如果您想添加另一个点。 我没有在任何地方找到这个解决方案! 任何人都可以举一个例子如何解决它? 我是新手,所以我没有经验。 感谢您的帮助! 编辑:我使用的是Windows 10,我的代码重要组成部分:在C++中去抖用户输入

while (true) 
{ 
    _kbhit(); 
    char L = _getch(); 
    if (L == 114) 
    { 
     score1 = score1 + 1; 
    } 
    else if (L == 99) 
    { 
     score1 = score1 - 1; 
    } 
    else if (L == 117) 
    { 
     score2 = score2 + 1; 
    } 
    else if (L == 110) 
    { 
     score2 = score2 - 1; 
    } 
    else if (L == 113) 
    { 

大号== “号” 是ASCII码的按钮R,U,C,N,Q

+1

聪明的方式来问一个问题像这样将包括您目前拥有的对键盘输入的密码,并询问应如何修改,以支持所需的行为。另请参阅[MCVE]。 –

回答

0

如果您正在使用控制台,那么大多数操作系统在按下一个按键之后会等待一秒钟,然后再次注册该按键。您现在可以尝试:按键盘上的按键,看看响应是什么。

确保有人不会意外按下按键两次是操作系统照顾的问题,因为否则每个采用键盘输入的应用程序都需要编写自己的问题解决方案。

如果你想进一步去比什么操作系统呢,你可以与计时库程序中使用定时器,并允许输入要重新注册之前等待N秒。

+0

如何使用此计时器以允许在n秒后再次获得用户输入?我的代码看起来是这样的:而(真) \t { \t \t _kbhit(); \t \t char L = _getch(); \t \t如果(L == 114) \t \t { \t \t \t score1 = score1 + 1; \t \t}等等。 –

+0

首先,使用'L ='r'',因为它比'L = 114'更容易理解,并且可能选择比'L'更好的名称。其次,等待4秒钟,你可以这样做:'std :: this_thread :: sleep_for(4s);'。你也可以写'score1 ++'或'score1 + = 1'而不是'score1 = score1 + 1' – Nonanon

+0

感谢你的建议,但std :: this_thread :: sleep_for(4s);停止整个_getch(),你必须等待4秒钟,以提供另一条指令,如果你想添加分数+ 1或-1等,并不会影响按键 –

2

getch()stdio上运行,它实际上只是来自/进入OS的字节流。它没有“按键/释放”的概念。当你按住一个键时,操作系统将开始自动重复按下的字符。为了让你的用例更糟糕,如果你按住一个键,然后按另一个键,第一个键的重复将停止。

现在有方式获得原始键向下/向上的事件,但这些涉及OS特定的编程接口;你没有告诉我们你正在使用哪个操作系统,所以这是一个猜测。在控制台中做你想做的事情有点可能,但是使用起来很尴尬。对于Windows看到C++ console keyboard events,对于Linux见Receiving key press and key release events in Linux terminal applications?

不过我强烈建议你甚至不试图实现所有操作系统级别的关键事件接口自己,而是充分利用,提供了一个框架,正好做一个跨平台库你想在那里做什么。这些日子里使用最广泛的框架之一是SDL http://libsdl.org/ - 它会将你移出控制台(当涉及到游戏时:除非你正在进行类似胭脂的游戏)。