当前位置: 首页 > 知识库问答 >
问题:

C输入getch(),当没有像Snake那样按下时跳过(游戏)

羊舌志
2023-03-14

我必须在控制台上用C语言编写一个游戏。例如,当我按下空格键时,我想数一数。但只有在我按下键的时候。当我再次松开钥匙时,它应该停止计数,并在我再次按下时重新开始。我想要它像蛇一样,我的意思是它不会因为输入而停止,当用户按下它时,它会得到输入。

我试过使用kbhit,它计数,当我按下某个键时,它永远不会打印任何内容,即使我再次按下某个键。

while (1) {
        h = kbhit();
        fflush(stdin);
        if (h) {

            printf("%d\n", a);
            a += 1;

        } else {
            printf("nothing\n");
        }

    }

我什么也不期待什么也不期待什么也不期待按下键0什么也不期待再次按下键1抓住键2 3 4

谢啦

共有2个答案

耿永寿
2023-03-14

使用

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这样的游戏,你可以很容易地跳过所有这些,只需使用固定的延迟值。


现在,我想问一个没有被问到的问题:你为什么要玩弄旧的

蒋烨然
2023-03-14

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

前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;
    }
}
 类似资料:
  • 我尝试使用getch()和kbsit()读取用户的输入,但它似乎无法识别按键被按下。 此代码打印“开始”,按下键时不打印任何内容。使用getch()读取和打印哪怕一个字符,而不使用循环,我都不走运。

  • 在试图使Do/While循环工作时,我很难找到正确的语法。我想用C语言编写一个计算器,让用户输入一个字符串,然后它做它的事情并打印结果,询问用户是否想再去一次。 到目前为止,我有一个简单的main函数,只是为了让Do/While循环正确,但是当我输入Y或Y时,程序只是问我是否想再次继续,它没有给我再次运行“计算器”部分的机会。我做错了什么?

  • 这是我的设备 这是我的消息正文作者 我的问题是: 为什么结果似乎不正确?我被放在@JsonRootName(“Facility”)上,并且还启用了包装根特性 我错过了什么

  • 我有一个线性布局(LinearLayout),其中有几个编辑文本(EditText),它们都是通过编程方式创建的(不是用XML布局),尤其是没有id。 当我在其中一个中键入,并且下一个(各自对焦)被禁用,并且我按下键盘上的Next IME按钮时,焦点前进到禁用的,但我不能在其中键入任何内容。 我所期望的是焦点前进到下一个启用的编辑文本。除了通过EditText禁用EditText之外,我还尝试了。

  • 我正在使用wedriveri o 4.5: 我需要等到某个元素存在,如果它不存在,处理这种情况。 例如: 但如果页面上不存在元素,webdriver会将我的测试标记为失败,并显示消息:“超时10000毫秒。”。尝试减少运行时间或增加测试规格的超时时间(http://webdriver.io/guide/testrunner/timeouts.html); 如果回复promise,确保其得到解决 >