2016-07-24 104 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