2016-07-24 2 views
0

Я создаю бота, используя API Kik. То, что должно случиться, это когда я набираю! Палач, игра инициализируется. Обходчик boolean делает это, а затем переходит в неактивное состояние. Тогда, люди могут использовать! ТЕМАТИЧЕСКИЙ ПИСЬМО, чтобы угадать слово. Достаточно просто. Тем не менее, есть странная ошибка. В первый раз используется палач, он работает правильно. Тем не менее, во второй раз код выходит из строя, утверждая, что статус и неверные данные не определены, хотя я и определил их. Любая помощь приветствуется!Javascript bot undefined variables

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

Во-первых, нет необходимости ставить ; после } после если заявления.

Во-вторых, причина, по которой они не определены во второй раз, заключается в том, что вы определили их внутри функции 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