2017-11-01 48 views
0

小惑星の射手を作っているうちに、_kbhit()kbhit()を使って周りに来ました。 、kbhitと複数の関数呼び出しがあります

int run = 1; 

int main() { 
    while(run){ 
     if(GetUserInput() == 2) 
      printf("W"); 
     if(GetUserInput() == 1) 
      printf("S"); 
     Sleep(50); 
    } 
} 

int GetUserInput(){ 
    if(kbhit()){ 
     char c = _getch(); 
     if(c == 's') 
      return 2; 
     if(c == 'w') 
      return 1; 
    } 
    else 
     return 0;* 

} 

だから、私が起こっている何を考えて、それはGetUserInput()上の最初のチェックを行い、かつのでgetch()の性質:私は専門家だが、ここで私は私が持っていると思う問題がありますキーボードはバッファから読み込まれ、破棄されますか?とにかく、私はcに値を保存し、適切に返す必要があります。しかし、それは最初のチェックしか行いません。最初のチェック(main()関数内)後にバッファに入力がなくなるためですか? 、かどうかを確認

if(GetUserInput() == 2) 
    printf("W"); 
if(GetUserInput() == 1) 
    printf("S"); 

は、例えば、私はあなたが鍵を読み、「S」を押します。

+1

あなたは「最初のチェック」とはどういう意味ですか?ループ内で 'if(_kbhit())'/'_getch()'コンビネーションを使って複数の文字を読み込むことができます。 –

答えて

1

あなたの問題は、あなたがこのコードに興味のあるすべてのキーのために一度読みしようとしているということです戻り値は2であり、戻り値はありません。次に、別のキーを読み込もうとしますが、私はキーを押さなかったので、 'S'の2番目のチェックも失敗します。

GetUserInput()の値ですべてのテストを実行する必要があります。

int val = GetUserInput(); 
if(val == 2) 
    printf("W"); 
else if(val == 1) 
    printf("S"); 

次の場合は他の使用する必要はありませんが、あなたが試合を見つけたら、それはあなたのチェックのすべてが相互に排他的であるかどうかをチェックしておくのは意味がありません。ハードコードされたマジック値の代わりにswitch文とenumを使うこともできますし、キーが押された場合はキー値を直接返し、0のようなセンチネル値は興味のあるキーと一致しません。

ここ

は、私の作品の完全な例です:

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

int GetUserInput() 
{ 
    if (_kbhit()) 
    { 
     char c = _getch(); 
     switch (c) 
     { 
     case 's': 
     case 'S': 
      return 2; 

     case 'w': 
     case 'W': 
      return 1; 

     case 'x': 
     case 'X': 
      return -1; 
     } 
    } 
    return 0; 
} 

int main() 
{ 
    for (;;) 
    { 
     int c = GetUserInput(); 
     switch (c) 
     { 
     case 1: 
      printf("W"); 
      break; 
     case 2: 
      printf("S"); 
      break; 
     case -1: 
      return 0; 
     } 
    } 
    return 0; 
} 
+0

ええ、私はそれを考えましたが、同じことをして、SはW蟻を渡しません。 –

+0

私は正しく動作する完全な例を追加しました。これらのキーを押すとWまたはSが表示され、Xを押すと終了します。 –

関連する問題