cls
进行
keyed$=inkey$
循环直到键入$<>"
打印"你好世界"
结束
因此,在这个程序中,正如你所看到的,直到按下语句"keyed$=inkey$"中的一个键,程序才会显示hello世界。所以我想要这样一个语句或程序,它将在一定的时间内退出循环。因此程序将等待4秒,如果用户在此之前按下该键,程序将转到下一行,即使用户不按下任何键,程序也将在4秒内移动到下一行。请帮帮我!!!
您可以使用SLEEP
语句:
PRINT "Press a key within 4 seconds to win!"
' Wait 4 seconds or until a key is pressed.
SLEEP 4
' Collect the key pressed, if any.
keyed$ = INKEY$
IF keyed$ <> "" THEN
PRINT "You WON by typing: "; keyed$
ELSE
PRINT "You LOST!"
END IF
请注意,某些键(如箭头键)被视为"扩展"键。keyed$
的第一个字符将等于CHR$(0)
,告诉您检测到扩展密钥,第二个字符将允许您确定它是哪个密钥。如果你需要处理这些"双字节代码",你可以在QB64 wiki上找到更多关于它们的信息。对于这样的键,上面的代码不会很好地工作,如下所示,当我按下向上箭头键(CHR$(0) + CHR$(&H48)
)时:
Press a key within 4 seconds to win!
You WON by typing: H
^note the extra space for CHR$(0)
编辑
你可以使用这个而不是循环来做你想做的事情:
' Wait 4 seconds for a key to be pressed.
SLEEP 4
' If a key was not pressed in 4 seconds, keyed$ = "".
keyed$ = INKEY$
IF keyed$ = "" THEN PRINT "Timeout (no key pressed)"
PRINT "the hello world"
换句话说,如果使用SLEEP
语句并在之后立即使用INKEY$
函数,则不需要循环来检测是否按下了某个键。
如果您仍然喜欢带循环的基于计时器的解决方案,那么您可以使用一些额外的变量、一个额外的循环条件和TIMER
函数,该函数返回自午夜以来经过的秒数。下面的操作与上面的SLEEP
方法相同:
maxWait = 4
startTime = TIMER
DO
' Detect a key press.
keyed$ = INKEY$
' Fix the start time if the loop started before midnight
' and the current time is after midnight.
IF startTime > TIMER THEN startTime = startTime - 86400
' Loop until a key is pressed or maxWait seconds have elapsed.
LOOP UNTIL keyed$ <> "" OR startTime + maxWait < TIMER
' If a key was not pressed in 4 seconds, keyed$ = "".
IF keyed$ = "" THEN PRINT "Timeout (no key pressed)"
PRINT "the hello world"
这种更复杂的选项的优点是,在等待按键时,您可以在循环中做其他事情。当然,还有一个小问题。如果你做得太多,按键会被延迟检测到,因为按键时INKEY$
不会被正确调用。例如:
maxWait = 4
startTime = TIMER
DO
' Do some work.
x = 0
FOR i = 1 TO 1000000
x = x + 1
NEXT i
' Detect a key press and exit the loop if one is detected.
keyed$ = INKEY$
' Fix the start time if the loop started before midnight
' and the current time is after midnight.
IF startTime > TIMER THEN startTime = startTime - 86400
' Loop until a key is pressed or maxWait seconds have elapsed.
LOOP UNTIL keyed$ <> "" OR startTime + maxWait < TIMER
回避这个问题很难。一个选项是@MatthewWhited建议的ON TIMER(n)
,但您只能使用一个计时器事件。这意味着您需要它在maxWait
秒后退出循环,而不是检测到按键,即使有工作正在进行。同时,您的按键仍然会明显晚于预期时间被检测到。QB64允许使用多个定时器,允许您同时处理这两个定时器。它还允许您以毫秒精度指定n
,而QBasic则只允许最小1秒精度。有关QB64对ON TIMER(n)
的改进的更多信息,请参阅QB64 Wiki上的ON TIMER(n)
。
由于我不知道你的使用情况,我不能根据你提供的代码推荐一个或另一个解决方案。