gpt4 book ai didi

keyboard - common lisp,如何屏蔽键盘输入

转载 作者:行者123 更新时间:2023-12-02 20:05:32 27 4
gpt4 key购买 nike

这是 Common Lisp 中的一个控制台程序,用于 Hangman 类型的游戏。第一个玩家输入一个字符串,让第二个玩家猜测。我的输入函数如下 --- 不幸的是,第一个玩家输入的字符仍然可见。

使用 JavaScript 就很简单,只需使用密码文本输入框即可。对于 VB,使用相同类型的工具很简单。有没有办法使用本地 Common Lisp 函数来做到这一点?

谢谢,CC。

(defun get-answer ()
(format t "Enter the word or phrase to be guessed: ~%")
(coerce (string-upcase (read-line)) 'list))

(defun start-hangman ()
(setf tries 6)
(greeting)
(setf answer (get-answer))
(setf obscure (get-obscure answer))
(game-loop answer obscure))

最佳答案

每个实现对此的支持都不同。

您可能想使用辅助库,例如 iolib.termioscl-charms (libcurses 的接口(interface))如果您想要在不同实现之上有一个可移植层。

SBCL

我找到了discussion thread有关 SBCL 的信息,以下是该实现的代码,来自 Richard M. Kreuter:

(require :sb-posix)

(defun echo-off ()
(let ((tm (sb-posix:tcgetattr sb-sys:*tty*)))
(setf (sb-posix:termios-lflag tm)
(logandc2 (sb-posix:termios-lflag tm) sb-posix:echo))
(sb-posix:tcsetattr sb-sys:*tty* sb-posix:tcsanow tm)))

(defun echo-on ()
(let ((tm (sb-posix:tcgetattr sb-sys:*tty*)))
(setf (sb-posix:termios-lflag tm)
(logior (sb-posix:termios-lflag tm) sb-posix:echo))
(sb-posix:tcsetattr sb-sys:*tty* sb-posix:tcsanow tm)))

所以,终于有机会谈论 PROG2 :

(defun read-silently ()
(prog2
(echo-off)
(read-line sb-sys:*tty*)
(echo-on)))

但是,您可能希望确保在展开堆栈时始终重置回显,并在输入内容之前清除输入:

(defun read-silently ()
(echo-off)
(unwind-protect
(progn
(clear-input sb-sys:*tty*)
(read-line sb-sys:*tty*))
(echo-on)))

CL-CHARMS

这是使用 libcurse 的替代方案。以下内容足以进行简单的测试。

(defun read-silently ()
(let (input)
(charms:with-curses ()
(charms:disable-echoing)
(charms:enable-raw-input)
(clear-input *terminal-io*)
(setf input (read-line *terminal-io*))
(charms:disable-raw-input)
(charms:enable-echoing))
input))

此外,使用 libcurse 可能会帮助您实现一个漂亮的刽子手控制台游戏。

关于keyboard - common lisp,如何屏蔽键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39797560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com