2016-07-24 4 views
0

私はKik APIを使ってボットを作成しています。起こるはずのことは、私がタイプするときです!ハングマン、ゲームが初期化されます。 hangman booleanはこれを行い、その後は無効になります。それから、人々は!hangman LETTERを使って単語を推測することができます。十分に簡単です。しかし、不思議なバグがあります。はじめてハングマンが使用され、正しく動作します。しかし、2回目には、コードがクラッシュし、ステータスと間違ったものが定義されていないと主張します。どんな助けもありがとう!まず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文の後};を置く必要はありません。

2番目に定義されていない理由は、それらをローカルにするbot.onMessage関数の中に定義していて、関数が終了すると破棄されるためです。代わりに、あなたはこのような冒頭でグローバルにそれらを定義する必要があります。

あなたは変数を変更 var毎回を使用している、しかし、あなただけあなたがそれらを定義するときに、それを使用することになっているように見えます
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を使用する必要はありません:)

+0

ありがとう!これで問題は解決しましたが、ゲームが終了すると変数をリセットする方法が必要になります(再起動する)。関数内に変数を宣言できない場合、どうすればよいですか? – FStijn

+0

@ Stijncat単純に元の値に戻してください。たとえば、関数の中に 'bot.onTextMessage'の前にすべてを置いて再起動するときにその関数を呼び出すように、すべての変数を元の値に設定する' resetVars'関数を作成することができます:) – Tropic

+0

@Stijncatまた、解決策が働いている場合は、この回答に受け入れられているとマークする必要があります:) – Tropic