0

分类

键控$=inkey$

循环直到键入$<>""

打印“你好世界”

结尾

所以在这个程序中,正如你所看到的,直到在语句“keyed$=inkey$”中按下一个键,程序才会显示你好世界。所以我想要这样一个语句或程序,它会在特定时间退出循环。因此程序将等待 4 秒,如果用户在此之前按下该键,它将转到下一行,即使用户不按任何键,程序也会在 4 秒内移动到下一行。请帮我!!!

4

1 回答 1

2

您可以使用以下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

避免这个问题很棘手。ON TIMER(n)@MatthewWhited 建议的一种选择是,除了您只能使用一个计时器事件。这意味着即使有工作发生,您也需要它在maxWait几秒钟后退出循环而不是检测按键。同时,您的按键仍然会被检测到明显晚于预期。QB64 允许使用多个计时器,让您可以同时处理这两个。它还允许您以n毫秒精度指定,这与 QBasic 至少只允许 1 秒精度不同。有关ON TIMER(n)QB64ON TIMER(n).

由于我不知道您的用例,因此我无法根据您提供的代码推荐一种或另一种解决方案。

于 2016-05-12T21:56:33.457 回答