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 = truereturn,但是您希望设置循环终止。 (我通常建议您有一个专门用于循环体的函数。)

您应该可以访问一个名为 "delay" 或 "sleep" 的函数(sleep() 是 Windows OS 函数),它允许您循环之间的延迟,介于 50 到 100 毫秒之间就足够了。

如果您希望真正复杂,您可以跟踪自上次循环以来经过的时间量并适当延迟。然而,对于贪吃蛇这样的游戏,您可以轻松跳过所有这些,只需使用固定的延迟值即可。


现在,对于未问的问题:你为什么要搞乱旧的 <conio.h> 东西?给自己一份 SDL2 的副本,然后去城里。生活会更轻松,结果 更令人满意。