1

私はそれらのスネークゲームの1つに取り組んでおり、キーを押してスネークをインクリメント/デクリメントする方向に動かすかどうかを示すswitchステートメントがありますが、それを保持している場合にのみそれを行います。ユーザーがそのキーを保持しなくても、ヘビの場所を増やし続ける方法を探しています。以下に1つのケースを置きます

if(_kbhit()) {
    switch(_getch()) {
        case 'a' : 
        dir = LEFT;
        x--;
4

3 に答える 3

0

ユーザーがそのキーを保持せずに ... インクリメントし続ける方法を探しています。」

私見、「select()」関数を検討する必要があります(OSで利用可能な場合)


ずっと前に、vxWorks で「select()」を使用しました。manページから、この機能はUbuntu Linuxでも利用できることがわかります。(おそらくあなたのシステムで利用可能ですか?)

select ステートメントを使用すると、スレッドまたはプログラムは「複数のファイル記述子を監視し、1 つまたは複数のファイル記述子が何らかのクラスの I/O 操作 (入力可能など) に対して「準備完了」になるまで待機することができます。対応する操作を実行することが可能です (たとえば、ブロックせずに read() を実行したり、十分に小さい write() を実行したりします)。(マニュアルページより)

実際には、私が取り組んだシステムでは、ユーザー インターフェイス スレッド (いくつかのうちの 1 つ) が読み取りを発行し、ユーザー入力の入力 fd を (select 経由で) 監視していました。私たちの選択では、1/2 秒のタイムアウトを使用しました (速度を選択します)。したがって、0.5 秒ごとに、そのポート (つまりデバイス) でユーザー入力が発生しなかった場合、タイムアウトによりプログラムが解放され、fd_sets 内のビットがチェックされます。

タイムアウト中にコードが追加のアクティビティを実行することを妨げるものは何もありません。

readfds でのみ作業する必要があり、他の fds は空のままにしておくことができると思います。

言い換えると、select を使用すると、コードはタイムアウトのあるユーザー入力を「監視」し、ユーザー入力 (キーストローク) またはタイムアウトのためにアクションを実行します。

これはあなたが探しているもののように聞こえます-キーを押さないアクション。

于 2017-01-08T02:41:23.347 に答える
0

あなたのコードは、キーを押したときにのみヘビを動かします。direction変数に基づいて一定の間隔でヘビを動かすある種のゲーム ループを実装する必要があります。次に、キーを押すコードをリファクタリングして、direction.

擬似コード:

while: # loop forever
    # below could be your switch statement
    if direction == 0: # north
        y--
    if direction == 1: # east
        x++
    if direction == 2: # south
        y++
    if direction == 4: # west
        x--

if _kbhit():
    if _getch() == 'a':
        direction == 4 # west
    # etc...
于 2017-01-08T03:41:34.887 に答える