C输入getch(),在没有像Snake(游戏)一样按下任何按钮时跳过

时间:2019-05-20 18:54:13

标签: c input header dev-c++

我必须在控制台中用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

谢谢

2 个答案:

答案 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 = truereturn,但是您希望设置循环终止。 (我通常建议您具有专门用于循环主体的功能。)

您应该可以使用称为“延迟”或“睡眠”的功能(Windows操作系统功能为sleep()),该功能将允许您在循环之间延迟,大约50到100毫秒之间就足够了。

如果您想变得非常复杂,则可以跟踪自上次循环以来经过的时间并适当地延迟。但是对于Snake这样的游戏,只需使用固定的延迟值,您就可以轻松跳过所有内容。


现在,对于未问的问题:无论如何,您为什么要弄乱旧的<conio.h>东西?为自己获取SDL2的副本,然后去市区。生活会更轻松,结果会更令人满意。