qbasic如何在指定时间后退出循环?

时间:2016-05-12 12:40:07

标签: loops qbasic

CLS

DO

键控$ = INKEY $

循环直到键入$<>""

打印" hello world"

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

1 个答案:

答案 0 :(得分: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),告诉您已检测到扩展密钥,第二个字符将允许您确定它是哪个密钥。如果需要处理它们,可以find more information on the 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) as suggested by @MatthewWhited,但您只能使用一个计时器事件。这意味着你需要它在maxWait秒之后退出循环而不是检测按键,即使有工作正在进行。与此同时,您的按键仍然会比预期的要晚得多。 QB64允许使用多个计时器,允许您同时处理这两个计时器。它还允许您指定具有毫秒精度的n,这与QBasic不同,QBasic仅允许最小1秒的精度。有关QB64对ON TIMER(n)的改进的详细信息,请参阅ON TIMER(n) on the QB64 Wiki

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