0

を組み合わせて使用​​しkbhit()、コンソール ゲームを構築する方法を学んでいます。GetAsyncKeyState()getch()

Visual Studio 2010 Express を使用しています。c/c++ ヘッダーは問題ありません。

互換性の問題 (Windows プラットフォームでのみ実行) は問題ではありません。

次の簡単なコードを見てください。

#include<stdio.h>
#include<conio.h>
#include<Windows.h>

int main()
{
  printf("Welcome\n");
  while(true)
  {
    if(_kbhit())
    {
      if(GetAsyncKeyState(VK_UP))
        printf("UP\n");
      else if(GetAsyncKeyState(VK_DOWN))
        printf("DOWN\n");
      else if(GetAsyncKeyState(VK_LEFT))
        printf("LEFT\n");
      else if(GetAsyncKeyState(VK_RIGHT))
        printf("RIGHT\n");
      else 
        printf("NOT ARROW\n");
      getch();
    }
  }
  return 0;
}

問題は、仮想キー入力が 2 回表示され、他のキー入力が正常に実行されることです。

何が問題なのかわかりませんが、簡単な修正方法を見つけました。

#include<stdio.h>
#include<conio.h>
#include<Windows.h>

int main()
{
  printf("Welcome\n");
  while(1)
  {
    if(_kbhit())
    {
      if(GetAsyncKeyState(VK_UP))
      {
        printf("UP\n");
        _getch();
      }
      else if(GetAsyncKeyState(VK_DOWN))
      {
        printf("DOWN\n");
        _getch();
      }
      else if(GetAsyncKeyState(VK_LEFT))
      {
        printf("LEFT\n");
        _getch();
      }
      else if(GetAsyncKeyState(VK_RIGHT))
      {
        printf("RIGHT\n");
        _getch();
      }
      else 
      {
        printf("NOT ARROW\n");
      }
      _getch();
    }
  }
  return 0;
}

私の推測でGetAsyncKeyState()は、デフォルト値に適切にクリアされていません

説明はありますか?

また、_getch()for everykbhit()を追加するとGetAsyncKeyState()一種の冗長性があるため、可読性が低下します。代替手段はありますか?

4

1 に答える 1