Lua - 重复功能时出错?

时间:2014-02-16 16:38:27

标签: function lua

我正在制作一个“不可能”的游戏,你基本上会被问到一堆技巧问题 我第一次运行脚本时,一切都很完美。如果用户通过输入'y'决定再次播放,它将重新运行mainScript函数。但是,脚本在第二次完成后会自动重新运行mainScript,而无需用户输入。我可能犯了一个简单的错误,我不确定。这是剧本:(抱歉,我知道它有点长)

    math.randomseed(os.time())
local lives = 3
local points = 0

Questions = {
    {"What is the magic word?", "A) Please", "B) Abra-Cadabra", "C) Lotion", "D) Cheese", "c"},
    {"Does anyone love you?", "A) Yes", "B) No", "C) Everyone loves me!", "D) My mother does", "b"},
    {"How many fingers do you have?", "A) None", "B) Eight", "C) Seventeen", "D) Ten", "d"},
    {"What is 1 + 1?", "A) Window", "B) Door", "C) Two", "D) That's a stupid question", "a"}
}

savedQuestions = {}                     --Load the Questions table into savedQuestions
for i, v in pairs(Questions) do
    table.insert(savedQuestions, v)
end

function loadTable()                    --Load the savedQuestions into Questions
    for i = 1, #savedQuestions do
        table.insert(Questions, savedQuestions[i])
    end
end

function waitForStart()
    local chk = io.read() tostring(chk)
    if (chk:sub(1, 5)):lower() == "start" then
        return true
    end
    waitForStart()
end

function lookForAnswer(ans)
    table.remove(Questions, number)
    local input = io.read() tostring(input)
    if input:lower() == ans then
        points = points + 1
        return true
    end
    lives = lives - 1
    return false
end

function mainScript()
    lives = 3
    points = 0
    print("Welcome to the Impossible quiz!")
    print("Type 'start' when you are ready to begin\n")
    waitForStart() io.write("\n")

    for i = 1, #Questions do
        number = math.random(1, #Questions)
        local prob = Questions[number]
        local q = prob[1]
        local a = prob[6]
        print(q)
        print(prob[2] .. "\n" .. prob[3] .. "\n" .. prob[4] .. "\n" .. prob[5] .. "\n")
        if lookForAnswer(a) then
            print("Correct! Points: " .. points .. " Lives: " .. lives .. "\n\n")
        else
            print("WRONG!  Points: " .. points .. " Lives: " .. lives .. "\n\n")
            if lives <= 0 then
                return false
            end
        end
    end
    return true
end

function checkForReplay()
    print("Would you like to play again? (Y / N)")
    local chk = io.read() tostring(chk)
    if (chk:sub(1, 1)):lower() == "y" then
        return true
    end
    return false
end

function checkWin()
    if mainScript() then
        print("You won!")
        print("Points: " .. points .. "\n")
        if checkForReplay() then
            Questions = {}
            loadTable()
            mainScript()
        else
            exit()
        end
    else
        print("You lose!")
        print("Points: " .. points .. "\n")
        if checkForReplay() then
            Questions = {}
            loadTable()
            mainScript()
        else
            exit()
        end
    end
end

while true do
    checkWin()
end

1 个答案:

答案 0 :(得分:1)

你应该将“开始”逻辑分解到循环中,你会看到更好。然后你会注意到如果你的checkWin的块有两个共同的代码,那也是因为:

function checkWin()
    if mainScript() then
        print("You won!")
    else
        print("You lose!")
    end
    print("Points: " .. points .. "\n")
    if not checkForReplay() then
        exit()
    end
end

while true do
    checkWin()

    -- if you get here you have not exited so start over: 
    Questions = {}
    loadTable()
    mainScript() -- oops! what's that doing here? 
end

另请注意,让脚本返回比调用os.exit()更好(假设代码中有exit() - 请参阅示例How to terminate Lua script?):

function checkWin()
    if mainScript() then
        print("You won!")
    else
        print("You lose!")
    end

    print("Points: " .. points .. "\n")

    return checkForReplay()
end

local playAgain = checkWin()
while playAgain do
    Questions = {}
    loadTable()
    playAgain = checkWin()
end