Scalaでローグライクを書いています。たとえば、ユーザーがいつ矢印キーを押したかを確認できる必要があります。私が見つけたすべての解決策では、プレイヤーがエンターを押す必要があります。
C の getch() と同様の方法でコンソール アプリのキー押下を検出する方法はありますか?
問題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)
}
Scala はjline
REPL で使用するため、ディストリビューションに含まれています (パッケージがわずかに変更されています)。通常はロードされませんが、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 より大きい必要があります)。
私は何かが欠けているに違いない:
System.in.read
私のために働きます。
Scala は JVM の上にあるため、Scala の答えは Java の答えとまったく同じです。
残念ながら、あなたはそれを気に入らないと思います-詳細については、この他の回答を参照してください。