2011-09-05 18 views
3

私は、新しい小さなPythonの筋肉を曲げるために、比較的小さなコマンドラインRPGを作成するという冒険を取り上げましたが、私はすでに難点にぶつかっています。私は)(getchは、この実装を使用しています:getch()を使用してさまざまな長さの入力を取得できますか?

def getch(): 
    fd = sys.stdin.fileno() 
    old_settings = termios.tcgetattr(fd) 
    tty.setraw(sys.stdin.fileno()) 
    key = sys.stdin.read(3) 
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 

私は矢印キーをキャプチャするために3つの文字で読むことkeyセットを持っています。例えば、アップはESC[Aと読み込まれます。この方法では、key[2]を使って、矢印キーが押されたかどうか、そしてどれが押されたのかを調べることができます。すべての井戸と良い、私はまた、他のすべての種類のキーをキャプチャしたいと思います。クエストログの場合はq、移動の場合はwasd(攻撃の方法になると様々な順序で矢印を押す)などがあります。問題は即座に明らかです。 getch()が1文字だけを返す場合、矢印機能は完全に失われます。

単純な解決策がない場合は、矢印システムを再考することを検討していますが、必ずあるはずです。確かに、私はttyの中で何が起こっているのか分かっていませんが、あなたが1文字だけを読むと、矢印プレスから余分な文字がバッファに残されているということをどこかで読んでいます。バッファにアクセスするにはどうすればいいですか?代わりに、stdinに可変長の入力を期待するように指示する巧妙な方法はありますか?

ご協力いただきありがとうございます。

答えて

5

3文字を読み取らないでください。読んでください。

あなたが今読み込んだ1文字がESCの場合は、それが矢印キーかどうかを確認するために別の1文字または2文字を読んでください。それがqだったら、そのことをしてからやり直してください。

+0

これは、ユーザーが矢印キーを2回押す必要があります。これはあまり面倒ではありません。 –

+0

それはありません。 'read(3)'を 'read(1)'に置き換え、次に '\ x1b'を探すif文と、どのキーが押されたのかを見る' read(2) 'があります。 – SingleNegationElimination

+0

ああ、そうです。完璧な意味合いを持つ。ありがとう、トークン。 –

0

フルゲームの開発を検討する場合は、PyGameも役立ちます(最終的にncurses)。

スニペットを矢印キーを読み上げるようにアップグレードすることはできますが、矢印キーの最初の文字とESCキーの違いを確認するにはどうすればよいですか?ユーザーがESCを押すと、説明された解決策はおそらく次のキーを押すのを待つでしょう。

この最後のケースを処理するための解決策は見つかりませんでした。

関連する問題