6

Scalaでローグライクを書いています。たとえば、ユーザーがいつ矢印キーを押したかを確認できる必要があります。私が見つけたすべての解決策では、プレイヤーがエンターを押す必要があります。

C の getch() と同様の方法でコンソール アプリのキー押下を検出する方法はありますか?

4

5 に答える 5

6

問題Enterは、ターミナルが入力をバッファリングするため、それをrawモードにする必要があることです。これはプラットフォーム固有の問題であるため、あまり移植性がないことに注意してください。

この質問への回答を見てください: How to read a single char from the console in Java (as the user types it)?

UNIX システムの簡単な回答:

import sys.process._
(Seq("sh", "-c", "stty -icanon min 1 < /dev/tty") !)
(Seq("sh", "-c", "stty -echo < /dev/tty") !)

(1 to 20).foreach { _ =>
  val c = Console.in.read
  println("Got " + c)
}
于 2011-12-21T03:29:51.887 に答える
4

Scala はjlineREPL で使用するため、ディストリビューションに含まれています (パッケージがわずかに変更されています)。通常はロードされませんが、Scala lib ディレクトリの場所がわかっている場合は、それをクラスパスに追加できます。クラスパスに追加すると、次のようになります。

object Key extends App {
  val con = new tools.jline.console.ConsoleReader()
  println( con.readVirtualKey() )
}

(このメソッドは、標準のコントロール キーに合わせて、それぞれ上、下、左、右に ^P ^N ^B ^F を与えることに注意してください)。ただし、これは の標準動作もオーバーライドするSystem.in.read()ため、長さ 1 の配列を渡して次の待機バイトを取得できます (そして、待機バイトを でテストしますSystem.in.available。これは、矢印キーの場合は 1 より大きい必要があります)。

于 2011-12-20T22:24:36.403 に答える
3

私は何かが欠けているに違いない:

System.in.read

私のために働きます。

于 2011-12-21T02:33:50.227 に答える
1

Scala は JVM の上にあるため、Scala の答えは Java の答えとまったく同じです。

残念ながら、あなたはそれを気に入らないと思います-詳細については、この他の回答を参照してください。

于 2011-12-20T21:24:03.317 に答える