0

したがって、基本的に質問をし、句読点までの正しい答えを必要とする関数があります。私はこれをしたくありません。「これらの回答のいずれか」を許可する場所にコーディングする方法はありますか? 単に「はい」ではなく、「はい、もちろん、絶対に、当然、および/または地獄のように」のように?

私の機能:

function welcome() {
    var questions = [{
        question: 'Are you ready to play?',
        answer: 'yes',
        affirm: 'Yay! You will be presented with a series of questions. If you answer a questions incorrectly, you cannot advance to the next...',
        rebuttal: "No, you're definitely ready to play."
    }];

    for (var i = 0, l = questions.length; i < l; i++) {
        answer = prompt(questions[i].question);
        var correct = false;
        while (correct === false)
        if (answer !== questions[i].answer) {
            alert(questions[i].rebuttal);
            answer = prompt(questions[i].question);
        } else {
            alert(questions[i].affirm);
            correct = true;
        }
    }
}
4

4 に答える 4

1

正解の性質に応じて、いくつかの可能性があります。そのうちの 2 つを説明します。

1) 可能な答えの配列

考えられるすべての正解を含む配列を作成し、それに対してプロンプトの結果を確認します。

var correctAnswers = ['yeah', 'ok', 'sure'];

var answer = prompt('Do you...?');
for (var i = 0; i<correctAnswers.length; i++) {
  if (answer === correctAnswers[i])
    result = true;
}

if (result) {
  // acceptable answer code
} else {
  // unacceptable answer code
}

PS:indexOf値が配列内にあるかどうかを確認するために使用できますが、以下の 3) では機能しません。

2) 回答の正規表現

同じ回答のバリエーションをキャッチしたい場合、このソリューションは最初のソリューションよりもうまく機能します。

var correctAnswer = /[yY]es(s?)/; // catches yes, Yes, Yess, yess

var answer = prompt('Do you...?');
if (answer.match(correctAnswer)){
  // acceptable answer code
} else {
  // unacceptable answer code
}

3) 両方の組み合わせ

正規表現の配列を作成し、それらのそれぞれに対して単純に照合することを妨げるものは何もありません。

于 2013-10-15T15:25:17.743 に答える
0

使用する必要がある場合は、ばかばかしいほど長いリストであっても、すべての可能性をカバーするわけprompt()ではないため、エラー マージンを決定する必要があります。それ以外の場合は、これで元に戻るか、対処がはるかに簡単になるため、単に置き換えることができます。を使用することを強くお勧めしますが、必要な場合は以下のオプションがあります。prompt()confirm()truefalseconfirm()prompt()

特定のオプションの配列

組み合わせが非常に限られているため、あまり良くありません。より多くの可能性があると、はるかに大きな配列が作成されます。また、indexOf polyfill が必要になる場合があります (カスタム ループを追加しない限り)。

var questions = [{
    question: 'Are you ready to play?',
    answers: ['yep','yes','yea','yeah','hell yeah','hell yea','absolutely','duh','of course'],
    affirm: 'Yay! You will be presented with a series of questions. If you answer a questions incorrectly, you cannot advance to the next...',
    rebuttal: "No, you're definitely ready to play."
}];

if(questions[i].answers.indexOf(answer) > -1) //.indexOf may need polyfill depending on supported browsers

猛烈な正規表現

柔軟性が向上し、より多くのオプションのコードが短縮されますが、単純な文字列比較と比較してパフォーマンスの問題がわずかに発生する可能性があります

var questions = [{
    question: 'Are you ready to play?',
    answer: /((hell[sz]? )?ye[psa]h?|absolutely|duh|of course)!*/i, //matches "hell yea","hells yea","hellz yea","hell yeah","yep","yes","hellz yeah!","hell yesh" .... etc plus the full words at the end
    affirm: 'Yay! You will be presented with a series of questions. If you answer a questions incorrectly, you cannot advance to the next...',
    rebuttal: "No, you're definitely ready to play."
}];

if(questions[i].answer.test(answer))

正規表現の配列

最初の 2 つの問題を結合しますが、正規表現を管理しやすくします

var questions = [{
    question: 'Are you ready to play?',
    answers: [/ye[psa]!*/,/(hell )?yeah?!*/,/absolutely!*/,/duh!*/,/of course!*/,/yeehaw!*/]
    affirm: 'Yay! You will be presented with a series of questions. If you answer a questions incorrectly, you cannot advance to the next...',
    rebuttal: "No, you're definitely ready to play."
}];

var saidYes = false;
for(var j=0,c=questions[i].answers.length;j<c;j++)
{
    if(questions[i].answers[j].test(answer))
    {
        saidYes = true;
        break;
    }
}

confirm() を使用する - 個人的な推奨事項

さまざまな応答の可能性を排除することにより、プロセス全体を簡素化します

var answer = confirm(questions[i].question);
var correct = false;
while (correct === false)
{
    if(answer)
    {
        alert(questions[i].affirm);
        correct = true;
    }
    else
    {
        alert(questions[i].rebuttal);
        answer = confirm(questions[i].question);
    }
}
于 2013-10-15T15:38:49.727 に答える
0

受け入れ可能な回答のリストを作成し、それぞれに対して受け取った内容を確認できます。

さらに、比較の前にすべてを大文字または小文字に変換して、大文字と小文字の違いを排除したり、句読点を削除したり、 などの数字を変換one1たり、その他の必要な変換を行うことができます。

人間の言葉の口語表現や弁証法的バージョンの意味を理解できる関数を求めている場合は、コーディングに長い時間がかかる可能性があります。あなたの質問は、「はい」の 6 つの選択肢を提案しています。少し努力すれば、おそらくあと 6 つ得られますが、「いいえ」でも同じ問題が発生します。私は続けることができました...

于 2013-10-15T15:26:22.003 に答える