2016-05-09 6 views
0

私の友人は、Pythonでシンプルな国を推測するゲームプログラムを作成し、JavaScriptでユーザーの入力を邪魔したことがないので、npmにpromptライブラリを使用して再作成しようとしました。一連のコンソールテキストベースの入力をJavaScriptで作成しますか?

私はそれになって、「約束の中の約束」の中でグーグルになってしまい、自分が何をしているのか分からないことに気付きました。

JavaScriptの非同期性のため、各国のヒントの数に基づいてx個の国を推測するようにコマンドラインゲームを作成するにはどうすればよいでしょうか。たとえば、最初のヒントで国を推測できない場合は国を選択し、最初のヒントを、それが2番目のヒントを表示するなどとします。

私の次のコードはうんざりしているだけですが、試してみるとわかります。

let createCountry = (name, hints) => { return { name, hints } } 

let countries = [ 
    createCountry("america", ["my home!"]), 
    createCountry("not america", ["not my home!"]) 
] 

for (let i = 0; i < countries.length; i++) { 
    new Promise(function(resolve, reject) { 

     let count = 0; 
     let country = countries[i] 
     console.log(country.name) 

     for (let h = 0, hint = country.hints[h]; h < country.hints.length; h++) { 

      let result = new Promise(function(resolve, reject) { 

       prompt.get(["country"], (err, result) => { 

        console.log(`Hint ${h + 1}/${country.hints.length}: ${hint}`) 

        if (result === country.name) { 
         console.log("You guessed correctly") 
         resolve(true) 
        } else { 
         console.log("You did not guess correctly") 
         reject(false) 
        } 
       }) 

      }) 

     } 

     console.log("\n") 

    }) 
} 
+0

JavaScriptは常に*同期*であり、非同期実行を必要としません。非同期動作なしで実装するにはかなり単純です。 https://teamtreehouse.com/library/javascript-basics/making-decisions-with-conditional-statements/build-a-random-number-guessing-game –

答えて

1

ためのjavascriptの同期性質上、forループの次の反復に制御が移るへと実行を完了するためのプロンプトを待ちません。

この問題を解決するにはさまざまな方法があります。 ES7の非同期/待機機能により、同期フローを反映した文体に近づけることができます。他のアプローチでは、 "forループ"イテレータから離れる必要があります。

async/awaitを使用するには、babelのようなコンパイラを使用するか、asyncawaitのようなライブラリを使用します。 asyncawaitライブラリを使用してプログラムを少し変更しました。

'use strict'; 

var prompt = require('prompt'); 
var async = require('asyncawait/async'); 
var await = require('asyncawait/await'); 

let countries = [ 
    createCountry("america", ["my home!","hint 2"]), 
    createCountry("not america", ["not my home!","hinnt 3"]) 
] 

prompt.start(); 

var asyncCountry = async(function guessCountry(countries) { 

    for (let i = 0; i < countries.length; i++) { 

     let count = 0; 
     let country = countries[i] 
     console.log('name:' + country.name); 

     for (let h = 0, hint = country.hints[h]; h < country.hints.length; h++) { 
      let result = await (checkCountry(country.name));    
     } 

     console.log("\n"); 

    } 

}); 

function checkCountry(name) { 

    return new Promise(function(resolve, reject) { 

     prompt.get(["country"], (err, result) => { 

      //console.log(`Hint ${h + 1}/${country.hints.length}: ${hint}`) 

      if (result === name) { 
       console.log("You guessed correctly");     
      } else { 
       console.log("You did not guess correctly"); 
      } 

      resolve(true); 
     }) 

    }) 
} 

asyncCountry(countries); 
+0

"javascriptの非同期性のために"を見てください。たぶん同期*です。 –

関連する問題