2016-07-24 116 views
0

我正在使用Kik API創建一個bot。應該發生什麼,當我輸入!hangman時,遊戲初始化。 hang子手boolean會這樣做,然後變得無效。然後,人們可以使用!hang子手信來猜測這個詞。夠簡單。但是,有一個奇怪的錯誤。第一次使用hangman,它可以正常工作。然而,第二次,代碼崩潰,聲稱狀態和錯誤信息未定義,儘管我確實定義了它們。任何幫助表示讚賞!Javascript bot未定義變量

var hangmanIsActive = false; 
var hangmanBootup = true; 

bot.onTextMessage((message) => { 
    if (message.body.startsWith("!help")) { 
     message.reply("I know the following commands:\n- !Hangman"); 
    } 

    if (message.body.startsWith("!hangman")) { 
     if (hangmanBootup == true){ 
      hangmanBootup = false; 
      message.reply("Welcome to hangman!"); 

      var triesleft = "Tries left: " 
      var inttriesleft = 10 

      var alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", 
          "t", "u", "v", "w", "x", "y", "z"]; 

      var stage0 = triesleft + inttriesleft; 

      var stage1 = "\n" 
         "\n" 
         "\n" 
         "    " + triesleft + {} + "\n" 
         "\n" 
         "\n" 
         "\n" 
         "_|___ \n"; 

      var stage2 = "\n" 
         " |\n" 
         " |\n" 
         " |   " + triesleft + {} + "\n" 
         " |\n" 
         " | \n" 
         " |\n" 
         "_|___ \n"; 

      var stage3 = " _______\n" 
         " |/\n" 
         " |\n" 
         " |   " + triesleft + {} + "\n" 
         " |\n" 
         " |\n" 
         " |\n" 
         "_|___ \n"; 

      var stage4 = " _______\n" 
         " |/ |\n" 
         " |\n" 
         " |   " + triesleft + {} + "\n" 
         " |\n" 
         " | \n" 
         " |\n" 
         "_|___ \n"; 

      var stage5 = " _______\n" 
         " |/ |\n" 
         " | (_)\n" 
         " |   " + triesleft + {} + "\n" 
         " |\n" 
         " |\n" 
         " |\n" 
         "_|___ \n"; 

      var stage6 = " _______\n" 
         " |/ |\n" 
         " | (_)\n" 
         " |  |  " + triesleft + {} + "\n" 
         " |  | \n" 
         " |\n" 
         " |\n" 
         "_|___ \n"; 

      var stage7 = " _______\n" 
         " |/ |\n" 
         " | (_)\n" 
         " | \|  " + triesleft + {} + "\n" 
         " |  | \n" 
         " |\n" 
         " |\n" 
         "_|___ \n"; 

      var stage8 = " _______\n" 
         " |/ |\n" 
         " | (_)\n" 
         " | \|/  " + triesleft + {} + "\n" 
         " |  | \n" 
         " |\n" 
         " |\n" 
         "_|___ \n"; 

      var stage9 = " _______\n" 
         " |/ |\n" 
         " | (_)\n" 
         " | \|/  " + triesleft + {} + "\n" 
         " |  | \n" 
         " | /\n" 
         " |\n" 
         "_|___ \n"; 

      var stage10 = " _______\n" 
         " |/ |\n" 
         " | (_)\n" 
         " | \|/  " + triesleft + {} + "\n" 
         " |  | \n" 
         " | /\ \n" 
         " |\n" 
         "_|___ \n"; 


      var words = ["testword"]; 

      var keyword = "testword"; 

      var currentstage = stage0; 

      var status = keyword.replace(/a/g, "-").replace(/b/g, "-").replace(/c/g, "-").replace(/d/g, "-").replace(/e/g, "-") 
       .replace(/f/g, "-").replace(/g/g, "-").replace(/h/g, "-").replace(/i/g, "-").replace(/j/g, "-") 
       .replace(/k/g, "-").replace(/l/g, "-").replace(/m/g, "-").replace(/n/g, "-").replace(/o/g, "-") 
       .replace(/p/g, "-").replace(/q/g, "-").replace(/r/g, "-").replace(/s/g, "-").replace(/t/g, "-") 
       .replace(/u/g, "-").replace(/v/g, "-").replace(/w/g, "-").replace(/x/g, "-").replace(/y/g, "-").replace(/z/g, "-"); 

      var inttriesleft = 10 

      var incorrectletters = [] 
     }; 

     message.reply("Word: " + status + "\nIncorrect letters: " + incorrectletters); 
     message.reply(currentstage); 

     if (message.body.split(" ").length != 2){ 
      message.reply("To suggest a letter, use \"!hangman a\" for example."); 
      return; 
     } 

     var theinput = message.body.split(" ")[1]; 

     if (theinput.length > 1 || theinput.length == 0){ 
      message.reply("To suggest a letter, use \"!hangman a\" for example."); 
      return; 
     } 

     if (alphabet.indexOf(theinput) > -1 == false){ // if the input is NOT in the array 
      console.log("Not a letter of the alphabet: " + theinput); 
      message.reply("You're supposed to use a letter of the alphabet!"); 
      return; 
     } 

     if (status.indexOf(theinput) > -1 || incorrectletters.indexOf(theinput) > -1){ // if input is already used, either correct or incorrectly 
      console.log(status) 
      console.log(incorrectletters) 
      message.reply("You already used this letter!"); 
      return; 
     } 

     if (keyword.includes(theinput)){ 
      var statuslist = status.split(""); 
      for (var l in keyword){ 
       if (keyword[l] == theinput){ 
        statuslist[l] = theinput; 
        } 
       } 
      status = statuslist.join().replace(",", ""); 

      if (status.indexOf("-") > -1 == false){ 
       message.reply("You won!"); 
       } 
      return; 
     } 

     if (keyword.includes(theinput) == false){ 
      var inttriesleft = inttriesleft - 1; 
      incorrectletters.push(theinput); 

      if (inttriesleft == 9){ 
       var currentstage = stage1.format(inttriesleft); 
       return;} 

      if (inttriesleft == 8){ 
       var currentstage = stage2.format(inttriesleft); 
       return;} 

      if (inttriesleft == 7){ 
       var currentstage = stage3.format(inttriesleft); 
       return;} 

      if (inttriesleft == 6){ 
       var currentstage = stage4.format(inttriesleft); 
       return;} 

      if (inttriesleft == 5){ 
       var currentstage = stage5.format(inttriesleft); 
       return;} 

      if (inttriesleft == 4){ 
       var currentstage = stage6.format(inttriesleft); 
       return;} 

      if (inttriesleft == 3){ 
       var currentstage = stage7.format(inttriesleft); 
       return;} 

      if (inttriesleft == 2){ 
       var currentstage = stage8.format(inttriesleft); 
       return;} 

      if (inttriesleft == 1){ 
       var currentstage = stage9.format(inttriesleft); 
       return;} 

      if (inttriesleft == 0){ 
       var currentstage = stage10.format(inttriesleft) 
       message.reply(currentstage); 
       message.reply("You lost! Thanks for playing."); 
       message.reply("The word was: " + keyword); 
       } 
     } 

    }; 
}); 
+0

它是否給你任何代碼崩潰的行號? –

回答

0

首先,沒有必要把;之後} if語句之後。

其次,他們沒有第二次定義的原因是因爲你在bot.onMessage函數中定義了它們,這使得它們成爲本地函數,因此當函數完成時它們被破壞。相反,你應該像這樣開頭全局定義他們:

var hangmanIsActive = false; 
var hangmanBootup = true; 
// Define them up here instead 
var triesleft = "Tries left: " 
var inttriesleft = 10 
var alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", 
        "t", "u", "v", "w", "x", "y", "z"]; 

var stage0 = triesleft + inttriesleft; 

var stage1 = "\n" 
       "\n" 
       "\n" 
       "    " + triesleft + {} + "\n" 
       "\n" 
       "\n" 
       "\n" 
       "_|___ \n"; 

var stage2 = "\n" 
       " |\n" 
       " |\n" 
       " |   " + triesleft + {} + "\n" 
       " |\n" 
       " | \n" 
       " |\n" 
       "_|___ \n"; 

var stage3 = " _______\n" 
       " |/\n" 
       " |\n" 
       " |   " + triesleft + {} + "\n" 
       " |\n" 
       " |\n" 
       " |\n" 
       "_|___ \n"; 

var stage4 = " _______\n" 
       " |/ |\n" 
       " |\n" 
       " |   " + triesleft + {} + "\n" 
       " |\n" 
       " | \n" 
       " |\n" 
       "_|___ \n"; 

var stage5 = " _______\n" 
       " |/ |\n" 
       " | (_)\n" 
       " |   " + triesleft + {} + "\n" 
       " |\n" 
       " |\n" 
       " |\n" 
       "_|___ \n"; 

var stage6 = " _______\n" 
       " |/ |\n" 
       " | (_)\n" 
       " |  |  " + triesleft + {} + "\n" 
       " |  | \n" 
       " |\n" 
       " |\n" 
       "_|___ \n"; 

var stage7 = " _______\n" 
       " |/ |\n" 
       " | (_)\n" 
       " | \|  " + triesleft + {} + "\n" 
       " |  | \n" 
       " |\n" 
       " |\n" 
       "_|___ \n"; 

var stage8 = " _______\n" 
       " |/ |\n" 
       " | (_)\n" 
       " | \|/  " + triesleft + {} + "\n" 
       " |  | \n" 
       " |\n" 
       " |\n" 
       "_|___ \n"; 

var stage9 = " _______\n" 
       " |/ |\n" 
       " | (_)\n" 
       " | \|/  " + triesleft + {} + "\n" 
       " |  | \n" 
       " | /\n" 
       " |\n" 
       "_|___ \n"; 

var stage10 = " _______\n" 
       " |/ |\n" 
       " | (_)\n" 
       " | \|/  " + triesleft + {} + "\n" 
       " |  | \n" 
       " | /\ \n" 
       " |\n" 
       "_|___ \n"; 


var words = ["testword"]; 

var keyword = "testword"; 

var currentstage = stage0; 

var status = keyword.replace(/a/g, "-").replace(/b/g, "-").replace(/c/g, "-").replace(/d/g, "-").replace(/e/g, "-") 
     .replace(/f/g, "-").replace(/g/g, "-").replace(/h/g, "-").replace(/i/g, "-").replace(/j/g, "-") 
     .replace(/k/g, "-").replace(/l/g, "-").replace(/m/g, "-").replace(/n/g, "-").replace(/o/g, "-") 
     .replace(/p/g, "-").replace(/q/g, "-").replace(/r/g, "-").replace(/s/g, "-").replace(/t/g, "-") 
     .replace(/u/g, "-").replace(/v/g, "-").replace(/w/g, "-").replace(/x/g, "-").replace(/y/g, "-").replace(/z/g, "-"); 

var inttriesleft = 10 

var incorrectletters = [] 

bot.onTextMessage((message) => { 
    if (message.body.startsWith("!help")) { 
     message.reply("I know the following commands:\n- !Hangman"); 
    } 

    if (message.body.startsWith("!hangman")) { 
     if (hangmanBootup == true){ 
      hangmanBootup = false; 
      message.reply("Welcome to hangman!"); 
     } 

     message.reply("Word: " + status + "\nIncorrect letters: " + incorrectletters); 
     message.reply(currentstage); 

     if (message.body.split(" ").length != 2){ 
      message.reply("To suggest a letter, use \"!hangman a\" for example."); 
      return; 
     } 

     var theinput = message.body.split(" ")[1]; 

     if (theinput.length > 1 || theinput.length == 0){ 
      message.reply("To suggest a letter, use \"!hangman a\" for example."); 
      return; 
     } 

     if (alphabet.indexOf(theinput) > -1 == false){ // if the input is NOT in the array 
      console.log("Not a letter of the alphabet: " + theinput); 
      message.reply("You're supposed to use a letter of the alphabet!"); 
      return; 
     } 

     if (status.indexOf(theinput) > -1 || incorrectletters.indexOf(theinput) > -1){ // if input is already used, either correct or incorrectly 
      console.log(status) 
      console.log(incorrectletters) 
      message.reply("You already used this letter!"); 
      return; 
     } 

     if (keyword.includes(theinput)){ 
      var statuslist = status.split(""); 
      for (var l in keyword){ 
       if (keyword[l] == theinput){ 
        statuslist[l] = theinput; 
       } 
      } 
      status = statuslist.join().replace(",", ""); 

      if (status.indexOf("-") > -1 == false){ 
       message.reply("You won!"); 
      } 
      return; 
     } 

     if (keyword.includes(theinput) == false){ 
      inttriesleft = inttriesleft - 1; 
      incorrectletters.push(theinput); 

      if (inttriesleft == 9){ 
       currentstage = stage1.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 8){ 
       currentstage = stage2.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 7){ 
       currentstage = stage3.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 6){ 
       currentstage = stage4.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 5){ 
       currentstage = stage5.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 4){ 
       currentstage = stage6.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 3){ 
       currentstage = stage7.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 2){ 
       currentstage = stage8.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 1){ 
       currentstage = stage9.format(inttriesleft); 
       return; 
      } 

      if (inttriesleft == 0){ 
       currentstage = stage10.format(inttriesleft) 
       message.reply(currentstage); 
       message.reply("You lost! Thanks for playing."); 
       message.reply("The word was: " + keyword); 
      } 
     } 

    } 
}); 

它看起來像你使用var每次你改變一個變量,但你只應該在定義他們使用它。不需要始終使用var :)

+0

非常感謝!儘管這解決了問題,但我仍然需要一種方法在遊戲結束後重置變量(並因此重新啓動)。如果我不能在函數內聲明變量,我該如何去解決這個問題? – FStijn

+0

@Stijncat只需重新設置它們的原始值;例如,您可以創建一個'resetVars'函數,將所有變量設置爲其原始值,就像您可以將'bot.onTextMessage'之前的所有內容放入函數中,然後在重新啓動時調用該函數:) – Tropic

+0

@Stijncat此外,如果解決方案的作品,你應該標記這個答案接受:) – Tropic