【问题标题】:C Input getch(), skip when nothing pressed like Snake (game)C输入getch(),当没有像Snake(游戏)那样按下时跳过
【发布时间】:2019-10-07 03:51:07
【问题描述】:

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

谢谢

【问题讨论】:

  • 就在我的脑海中,我会分叉这个函数。一个是获取用户输入并将其放入全局变量中。另一个 fork 执行全局变量中的操作并将其清除。如果全局变量中没有任何内容,则它什么也不做。
  • 你能给我写个例子吗,我不太明白你的意思
  • 我不写代码,我修改它。所以先试一试。使用叉子。父 fork 在循环中运行 getch() 等待q 退出,否则它将输入放入子的全局变量中。如果全局变量为空(无输入),子叉子会正常运行游戏。如果全局变量有输入,往那个方向移动,清除变量,正常运行。

标签: c input header dev-c++


【解决方案1】:

从您的代码中,您没有将按下的键存储到变量中。 请试试这个方法。

前 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;
    }
}

【讨论】:

    【解决方案2】:

    执行此操作的标准(和正确)方法(使用<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 操作系统函数),它允许您在循环之间进行延迟,50 到 100 毫秒之间的某个时间就足够了。

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


    现在,对于没有被问到的问题:你为什么要搞乱旧的<conio.h> 东西呢?为自己获取一份 SDL2 并前往城镇。生活会更轻松,结果会很多更令人满意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2015-07-05
      • 2018-09-12
      • 1970-01-01
      相关资源
      最近更新 更多