2014-02-16 40 views
1

我正在研究一个'不可能'的游戏,你基本上被问到一堆诡计问题。
我第一次运行脚本时,一切都很完美。如果用户通过键入'y'决定再次播放,它将重新运行mainScript函数。但是,脚本会在第二次完成后自动重新运行mainScript,而不需要用户输入。我可能会犯一个简单的错误,我不确定。下面是脚本:(对不起,我知道这是一种长)Lua - 重复函数出错?

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 
+0

'mainScript()'出现3次'checkWin()' –

+0

哦里面,我从来没有注意到....谢谢! – user3314993

回答

1

你应该分解出“startover”逻辑进入死循环,你会看到更好。然后,你发现怎么会有共同的代码都,如果你的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