我正在做一个愚蠢的终端游戏,它使用键盘输入来控制在棋盘上移动的角色.当用户按下某个键时,我的代码会正确响应getChar,但是用户按下的字符也会出现在终端中.有没有办法在终端应用程序中接收键盘输入,而不显示用户键入的内容?
编辑:我在Mac上,但在所有平台上都会很高兴.
Jak*_*kub 10
基本上,为了实现目标,您需要做两件事:
您必须禁用终端中的任何缓冲,以便您的程序立即获得按下的键(并且您不必使用ENTER确认).
hSetBuffering stdin NoBuffering
Run Code Online (Sandbox Code Playgroud)然后你必须确保角色不会回显到终端.
hSetEcho stdin False
Run Code Online (Sandbox Code Playgroud)请注意,在程序退出之前,它必须恢复以前的设置,以便进一步使用终端.
将所有内容放在一起代码将如下所示:
import System.IO
import Control.Exception (bracket)
withHiddenTerminalInput :: IO a -> IO a
withHiddenTerminalInput io = bracket
(do prevBuff <- hGetBuffering stdin
prevEcho <- hGetEcho stdin
hSetBuffering stdin NoBuffering
hSetEcho stdin False
return (prevBuff, prevEcho)
)
(\(prevBuff, prevEcho) -> do
hSetBuffering stdin prevBuff
hSetEcho stdin prevEcho
)
(const io)
Run Code Online (Sandbox Code Playgroud)