C 输入getch(),像贪吃蛇(游戏)一样什么都不按就跳过
C Input getch(), skip when nothing pressed like Snake (game)
我必须在控制台中用 C 编写游戏。例如,我想在按下 space 键时进行计数。但只有当我按下键时。当我再次释放按键时,它应该停止计数并在我再次按下时重新开始。我想要它像蛇一样,我的意思是它不会因为输入而停止,当用户按下它时它会获得输入。
我试过 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
谢谢
根据您的代码,您没有将按下的键存储到变量中。
请试试这个方法。
前 3 行显示了如何将键盘命中变量存储到 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;
}
}
标准(和正确)方法(使用<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
,但是您希望设置循环终止。 (我通常建议您有一个专门用于循环体的函数。)
您应该可以访问一个名为 "delay" 或 "sleep" 的函数(sleep()
是 Windows OS 函数),它允许您循环之间的延迟,介于 50 到 100 毫秒之间就足够了。
如果您希望真正复杂,您可以跟踪自上次循环以来经过的时间量并适当延迟。然而,对于贪吃蛇这样的游戏,您可以轻松跳过所有这些,只需使用固定的延迟值即可。
现在,对于未问的问题:你为什么要搞乱旧的 <conio.h>
东西?给自己一份 SDL2 的副本,然后去城里。生活会更轻松,结果 更 更令人满意。
我必须在控制台中用 C 编写游戏。例如,我想在按下 space 键时进行计数。但只有当我按下键时。当我再次释放按键时,它应该停止计数并在我再次按下时重新开始。我想要它像蛇一样,我的意思是它不会因为输入而停止,当用户按下它时它会获得输入。
我试过 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
谢谢
根据您的代码,您没有将按下的键存储到变量中。 请试试这个方法。
前 3 行显示了如何将键盘命中变量存储到 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;
}
}
标准(和正确)方法(使用<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
,但是您希望设置循环终止。 (我通常建议您有一个专门用于循环体的函数。)
您应该可以访问一个名为 "delay" 或 "sleep" 的函数(sleep()
是 Windows OS 函数),它允许您循环之间的延迟,介于 50 到 100 毫秒之间就足够了。
如果您希望真正复杂,您可以跟踪自上次循环以来经过的时间量并适当延迟。然而,对于贪吃蛇这样的游戏,您可以轻松跳过所有这些,只需使用固定的延迟值即可。
现在,对于未问的问题:你为什么要搞乱旧的 <conio.h>
东西?给自己一份 SDL2 的副本,然后去城里。生活会更轻松,结果 更 更令人满意。