2016-11-27 19 views
-2

私たちは学校のプロジェクトを持ち、コンソールアプリケーションとしてバレーボールをマッチさせています。 私たちはチームや得点などに入出力を行い、キーをTeam1-score + 1、Team2-score-1などにバインドする必要があります。 getch()を使用してこれらのキーをバインドします。 私の問題:例えば、RとRをTeam1-score + 1にしてこのキーを押し続けると、スコア+1を続けるでしょう。それを止めて、別のものを追加したい場合はRをもう一度押す必要がありますポイント。 どこでもこのソリューションが見つかりませんでした。 誰でも例を挙げて修正する方法はありますか? 私はコーディングに新しいので、経験の浅いです。 助けをいただきありがとうございます! EDIT:あなたの場合は、ボタンのASCIIコードは、U rをされユーザー入力をC++でデバウンス

while (true) 
{ 
    _kbhit(); 
    char L = _getch(); 
    if (L == 114) 
    { 
     score1 = score1 + 1; 
    } 
    else if (L == 99) 
    { 
     score1 = score1 - 1; 
    } 
    else if (L == 117) 
    { 
     score2 = score2 + 1; 
    } 
    else if (L == 110) 
    { 
     score2 = score2 - 1; 
    } 
    else if (L == 113) 
    { 

L == "数" C、N、Q

+1

このような質問をするスマートな方法は、現在キーボード入力を処理するためのコードを含めることと、目的の動作をサポートするために変更する方法を尋ねることです。 [MCVE]も参照してください。 –

答えて

0

:私は、Windows 10、私のコードの重要な部分を使用していますコンソールを使用している場合、そのキーを再度登録する前に、キーを押した後、ほとんどのオペレーティングシステムが1秒間待機します。今すぐ試すことができます:キーボードのキーを押して、応答が何であるかを確認します。

誰かが誤ってキーを2回押していないことを確認することは、OSが処理する問題です。そうしないと、キーボード入力を行っているすべてのアプリケーションが問題を解決する必要があります。

OSよりもさらに進めたい場合は、プログラムでタイマーを使用して、クロノライブラリを使用してn秒待ってから再度入力を許可します。

+0

このタイマーを使用して、n秒後にユーザー入力を再度取得できるようにするにはどうすればよいですか?私のコードは次のようになります:while(true) \t { \t \t _kbhit(); \t \t char L = _getch(); \t \t IF(Lの== 114) \t \t { \t \t \t SCORE1 = SCORE1 + 1。 \t \t}など。 –

+0

まず 'L = 'r''を使います。これは' L = 114'よりも分かりやすく、 'L'よりも良い名前を選ぶかもしれません。次に、4秒待つために、 'std :: this_thread :: sleep_for(4s);'を実行します。また、 'score1 = score1 + 1'ではなく' score1 ++ 'または' score1 + = 1'と書くこともできます。 – Nonanon

+0

あなたの提案に感謝しますが、std :: this_thread :: sleep_for(4s); _getch()を停止し、別の指示を与えるのに4秒待たなければなりません。スコア+1または-1などを追加したい場合は問題ありません。押したキーをデバウンスしません。 –

2

getch()は、stdioで動作します。これは、実際にはOSから/へ行くバイトストリームです。それは "キープレス/リリース"の概念を持っていません。キーを押したままにすると、OSは押された文字の自動反復を開始します。ユースケースを悪化させるために、キーを押したままにしてから別のキーを押すと、最初のキーの繰り返しが中止されます。

ここでです。生のキーダウン/アップイベントを取得する方法ですが、これにはOS固有のプログラミングインターフェイスが関係します。あなたが使用しているOSを教えてくれなかったので、そこにはちょっとした推測があります。コンソールで何をしたいのかは多少可能ですが、使い方は厄介です。 Windowsの場合はC++ console keyboard events、Linuxの場合はReceiving key press and key release events in Linux terminal applications?

を参照してください。しかし、私は自分自身でインターフェイスするすべてのOSレベルのキーイベントを実装しようとは思わないし、正確に行うためのフレームワークを提供するクロスプラットフォームライブラリあなたはそこで何をしたいのですか?最近では最も広く使われているフレームワークの1つがSDL http://libsdl.org/です。これはあなたをコンソールから移動させます(ゲームに関してはルージュのようなゲームをしている場合を除いて良いリダンダンスです)。

関連する問題