我必须在控制台中用C编写游戏。例如,当我按下空格键时,我想加数。但是只有当我按下键时。当我再次释放键时,它应该停止计数,并在再次按下时重新开始。我希望它像蛇一样,我的意思是它不会因用户按下时得到输入而停止输入。
我尝试过kbhit,它可以计数,当我按某些东西时,即使再按一次键,它也永远不会打印任何东西。
while (1) {
h = kbhit();
fflush(stdin);
if (h) {
printf("%d\n", a);
a += 1;
} else {
printf("nothing\n");
}
}
我希望
没有
没有
没有
presses a key
0
没有
presses key again
1个
hold on key
2
3
4
谢谢
答案 0 :(得分:1)
在您的代码中,您没有将按下的键存储到变量中。 请尝试使用此方法。
前三行显示了如何将键盘命中变量存储到h中。 其余的将递增a值。
while (1) {
/* if keyboard hit, get char and store it to h */
if(kbhit()){
h = getch();
}
/***
If you would like to control different directions, there are two ways to do this.
You can do it with if or switch statement.
Both of the examples are written below.
***/
/* --- if statement version --- */
if(h == 0){
printf("%d\n", a);
a += 1;
}
else{
printf("nothing\n");
}
/* --- switch statement version --- */
switch(h)
{
case 0:
printf("%d\n", a);
a += 1;
break;
default: printf("nothing\n");
break;
}
}
答案 1 :(得分:1)
(使用<conio.h>
东西)的标准方法(和 正确 )是:
int c;
while (1)
{
或:
int c;
bool done = false;
while (!done)
{
具有循环主体,例如:
if (kbhit())
{
switch (c = getch())
{
case 0:
case 0xE0:
switch (c = getch())
{
/* process "extended" key codes */
}
break;
/* process "normal" key codes */
case ...:
...
}
}
/* add timer delay here! */
}
您应该在其中的某个位置从函数中设置delay = true
或return
,但是您希望设置循环终止。 (我通常建议您具有专门用于循环主体的功能。)
您应该可以使用称为“延迟”或“睡眠”的功能(Windows操作系统功能为sleep()
),该功能将允许您在循环之间延迟,大约50到100毫秒之间就足够了。
如果您想变得非常复杂,则可以跟踪自上次循环以来经过的时间并适当地延迟。但是对于Snake这样的游戏,只需使用固定的延迟值,您就可以轻松跳过所有内容。
现在,对于未问的问题:无论如何,您为什么要弄乱旧的<conio.h>
东西?为自己获取SDL2的副本,然后去市区。生活会更轻松,结果会更令人满意。