質問: wrongAnswers) { prompt ('Ops! Maybe, another try?'); } else { prompt ('Please guess 1 to 5!') } } ``` いつもはメンターの方がいらっしゃるのですがその方がホリデーでいらっしゃらず、どなたかお力貸していただけると幸いです。よろしくお願いします。
回答: まず、プログラミングのためにやることをきちんと箇条書きするのは良いことなのですが、いくつか気をつけたほうが良いでしょう。 * 繰り返す範囲は明示する * 「主語」を省略しない あなたの現在のコードにあうように詳細化するとこうなります。 ``` <1>alertで1から5までの数値を当てるよう指示する(答えは2) <2>okを押すとpromptで1から5までのどれかを入力するよう出てくる 【繰り返しの範囲開始】 <3><2>で入力した値が外れだと、間違っているので再度答えを入力するようにというpromptが出てくる <4><2>で入力した値が当たりだと、alertで「おめでとう!」などのメッセージが現れゲームが終了する 【繰り返しの範囲終了】 ``` あなたのコードでは変数`result`の値が<2>の後、2度と書き換えられませんから、常に<2>の`prompt`で入力した値が正解かどうか判定しようとしています。 ``` <1>alertで1から5までの数値を当てるよう指示する(答えは2) <2>okを押すとpromptで1から5までのどれかを入力するよう出てくる 【繰り返しの範囲開始】 <3>最後に入力した値が外れだと、間違っているので再度答えを入力するようにというpromptが出てくる <4>最後に入力した値が当たりだと、alertで「おめでとう!」などのメッセージが現れゲームが終了する 【繰り返しの範囲終了】 ``` `prompt`を呼び出すたびにその値で`result`を置き換えれば、`result`が「最後に入力した値」として使えるはずです。(なかなか微妙な変数名ですが、話が長くなりすぎるので、そこは置いておきます。) さらにJavaScriptでの基本テクニックとしていくつかの問題点があります。 * 文字列(`prompt`の戻り値)と数値(`2`)とを`===`(型変換のない厳密比較)で比較している (結果は常に`false`になる。) * 配列のどれかに一致するかの判定に`===`を用いている (これまた常に`false`です。日本語の「〜が〜である」的な文がいつでも`===`で表現できるわけではありません。) 「配列の中のどれかに一致」には、`indexOf`がよく使われます。使い方はコード参照。 `==`比較(文字列と数値の比較の時、自動的に数値型に変換してくれる)とか、文字列を数値型に変換する方法なんかも覚えておくと良いのですが、ここでは元の答えを全部文字列型で用意しておく、という形にしてみました。 ``` // alertで'You got 5 guesses. Guess 1 to 5'と言うメッセージを表示させ、1から5までの数値を当てるよう指示する。 alert ('You got 5 guesses. Guess 1 to 5'); // 答えの数値を2で用意 //### `prompt`の結果は文字列なので答えも文字列で用意しておく。 let correctAnswer = '2'; let wrongAnswers = ['1', '3', '4', '5']; // promptで'What do you guess?'と言うメッセージとともに、記入欄を表示させる let result = prompt('What do you guess?'); console.log(result); // forループで1から5までの数値で、答えの2が当たるまで推測を促すpromptを表示させる。 // ヒント1:if文とも組み合わせて、推測が当たった場合はalertで'Good job! See what happens next :)'を表示。当たったらゲーム終了にする。 // ヒント2:外れたらpromptで'Ops! Maybe, another try?'のメッセージとともに記入欄を表示。 for (;;) { if( result === correctAnswer ) { alert('Good job! See what happens next :)'); break; } else if( wrongAnswers.indexOf(result) >= 0 ) { //###`result`が常に「最後に入力した値」になるよう更新する result = prompt('Ops! Maybe, another try?'); } else { //###`result`が常に「最後に入力した値」になるよう更新する result = prompt('Please guess 1 to 5!'); } } ``` なんでこれが`for`文の課題なのかとか、コメント中の「forループで1から5までの数値で、...」については、出題者の意図が全然理解できないので、出題者の思っている通りの回答になっているかどうかは全然自信がないのですが、あなたの現在の意図に沿った動きにはなっているのではないかと思います。