0

我试图在游戏中为基于 lua 的计算机制作程序。虽然当它运行时它的行为很奇怪

--Tablet

    oldpullEvent = os.pullEvent
    os.pullEvent = os.pullEventRaw
    while true do
        term.clear()
        term.setTextColor( colors.white )
        term.setCursorPos(1, 1)
        print("Please Enter Password:")
        input = read("*")
        incorrect = 0
        while incorrect < 3 do
            if input == "qwerty" then
                print("Password Correct, Unlocking")

            else
                if incorrect < 3 then
                    incorrect = incorrect + 1
                    print("Password incorrect")
                    print(3 - incorrect, " tries remaining")
                else 
                    print(3 - incorrect, "tries remaining, locking phone for 1m")
                    local num = 0
                    while num < 60 do
                        if num < 60 then 
                            term.clear()
                            term.setTextColor( colors.red )
                            term.setCursorPos(1, 1)
                            num = num + 1
                            print(60 - num, "s remaining")
                            sleep(1)
                        else
                            incorrect = 0
                        end
                    end
                end
            end
        end 
    end
    os.pullEvent = oldpullEvent

当它运行时,它以“请输入密码:”开头,输入“qwerty”它想要的密码后,它会无限循环“密码正确,解锁”。当我输入不正确的密码时,它不会运行 else 语句中的任何代码,只是返回输入密码屏幕。没有错误代码或崩溃。任何了解 lua 的人都知道我是否编写了 while/if/elseif 函数错误或变通方法。

谢谢!

4

2 回答 2

1

当输入正确的密码时,不会告诉循环停止。输入正确的密码后,break应放在后面print("Password Correct, Unlocking")

这是因为在input循环之外,更好的方法是这样的:

local incorrect = 0
while true do
    term.clear()
    term.setTextColor( colors.white )
    term.setCursorPos(1, 1)
    print("Please Enter Password:")
    local input = read("*")

    if input == "qwerty" then
        print("Password Correct, Unlocking")
        break
    else
        if incorrect < 2 then
            incorrect = incorrect + 1
            print("Password incorrect")
            print(3 - incorrect, " tries remaining")
            sleep(1) -- let them read the print.
        else
            print("out of attempts, locking phone for 1m")
            for i = 10, 1, -1 do
                term.clear()
                term.setTextColor( colors.red )
                term.setCursorPos(1, 1)
                print(i, "s remaining")
                sleep(1)
            end
            incorrect = 0
        end
    end
end

上面的代码将允许用户 3 次尝试输入密码,如果全部使用,它们将被锁定 60 秒,然后再尝试 3 次。如此重复,直到输入正确的密码。

我已经删除了内部 while 循环,因为它不是必需的。已incorrect本地化并移出 while 循环,因此每次用户输入密码时都不会重置它。

read("*")被移动到 while 循环中,因此它每次都会提示用户输入密码,而不是询问一次然后无限循环。

该代码已经过测试,似乎可以正常工作,没有任何问题。

如果任何代码没有意义,请不要犹豫。

于 2016-01-10T06:44:21.457 回答
0

输入正确密码后,您不会重置incorrect值。您要么需要使用break来中止循环,要么设置incorrect为 3 或更大的值。

于 2015-12-12T23:12:46.840 回答