質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

381閲覧

Javascript選択肢クイズ クイズと選択肢 整合性

Asylum35aO2

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/04/19 14:41

JSを駆使してクイズサイトを作っています。
選択肢と問題をランダムに出題したいと思っているのですが、以下のコードでは2つうまくいきません。
1つ目は、問題と解答がバラバラになってしまいます。考えてみたら、問題と質問が別々にシャッフルされた後にそれぞれ配置されてるのが理由かな、と思うのですが、どのように訂正できるでしょうか?
2つ目は、質問が被らないようにしたい(全て用意していた質問が終わったら、return或いはalertで「終わりました」と出したい)のですが、それもアドバイスをいただければと思います。

Javascriptのコード

'use strict'; const question = document.getElementById('question'); const btn = document.getElementById('btn'); const choices = document.getElementById('choices'); const result = document.getElementById('result'); const timer = document.getElementById('timer'); const scoreLabel = document.querySelector('#result > p'); const test = document.getElementById('test'); let scoreShow = document.getElementById('scoreShow'); let isAnswered = false; let countdown = false; let seconds = 200; let timerId; let isPlaying; let intervalid; const interval = 100; const quizSet = [ {q: 'Aは何?', c:['A', 'B', 'C', 'D']}, {q: '1は何?', c:['1', '2', '3', '4']}, {q: 'あは何?', c:['あ', 'い', 'う', 'え']} ]; let currentNum = 0; let score = 3; let id; //初期化処理 function init(){ alert('これはライフポイント制のクイズです。3ポイントから始まり、0ポイントになったら失格です。頑張ってください。'); isPlaying = false; btn.classList.add('startgreen'); btn.classList.remove('disabled'); btn.textContent = 'Quiz Start'; } init(); //答えがあっているかを確認する関数 function checkAnswer(li) { if (li.textContent === quizSet[currentNum].c[0]){ li.classList.add('correct'); } else { li.classList.add('wrong'); score--; } btn.classList.remove('disabled'); scoreShow.textContent = score; if(score === 0){ alert('Game Over'); clearTimeout(timerId); } } const shuffledChoices = shuffle([...quizSet[currentNum].c]); //問題や選択肢をシャッフルしてもらう function shuffle(arr){ let i = arr.length - 1; for(i = arr.length -1; i > 0; i--){ const j = Math.floor(Math.random() * (i + 1)); [arr[j], arr[i]] = [arr[i], arr[j]]; } return arr; } //タイプライター的に問題を出題してもらうところ function typing(str = ""){ let tmp = question.innerHTML; let writed = buf.length; let write = ""; if(writed < str.length){ write = str.charAt(writed); } question.innerHTML = tmp + write; } var timerArray = new Array(); //クイズをセットする全般関数 function setQuiz(){ isAnswered = false; while (timerArray.length > 0) { clearInterval(timerArray.shift()); } let temporary = shuffle(quizSet); let str = temporary[currentNum].q; question.innerHTML = ""; let typeid = setInterval(function(){ typing(str); }, 150); timerArray.push(typeid); while(choices.firstChild){ choices.removeChild(choices.firstChild); } shuffledChoices.forEach(choice => { const li = document.createElement('li'); li.textContent = choice; li.addEventListener('click', () => { if(!isPlaying){ return; } if(isAnswered){ return; } checkAnswer(li); isAnswered = true; }); choices.appendChild(li); }); if(currentNum === quizSet.length -1) { btn.textContent = 'Check Result!'; } } //カウントダウンを始めるところ function cDownStart(){ countdown = true; timer.innerHTML = seconds; timerId = setTimeout(cDown, 1000); } //カウントダウンを続ける処理 function cDown(){ seconds--; timer.innerHTML = seconds; if(seconds <= 0){ clearTimeout(); countdown = false; alert(`時間切れです。あなたのスコアは${score}点です。`);//日本語だけ } else { timerId = setTimeout(cDown, 1000); } } //次へのボタンを押したら次に行く処理 btn.addEventListener('click', () => { if(!isPlaying){ cDownStart(); setQuiz(); btn.textContent = 'Next'; btn.classList.remove('startgreen'); btn.classList.add('disabled'); isPlaying = true; return; } if(btn.classList.contains('disabled')) { return; } btn.classList.add('disabled'); if(currentNum === quizSet.length -1){ scoreLabel.textContent = `あなたのスコアは${score}点です。`; result.classList.add('show'); } else { currentNum++; setQuiz(); } });

HTMLのコード

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Quiz</title> <link rel="stylesheet" href="css/styles2_rev.css"> </head> <body> <div class="container"> <p id="timer" class="margin"></p> <p id="scoreShow" class="margin"></p> <br> <p id="question"></p> <ul id="choices"> </ul> <div id="btn" class="disabled">Next</div> <dev id="test"></dev> <section id="result"> <p></p> <a href="">REPLAY?</a> </select> </div> <script src="js/main_rev.js"></script> </body> </html>

CSのコード

body { background: #efdec1; font-size: 14px; font-family: Verdana, sans-serif; } .container { width: 400px; margin: 8px auto; background: #fff; border-radius: 4px; padding: 16px; position: relative; } #question { margin-bottom: 16px; font-weight: bold; } #choices { list-style: none; padding: 0; margin-bottom: 16px; } #choices > li { border: 1px solid #ccc; border-radius: 4px; padding: 10px; margin-bottom: 10px; cursor: pointer; } #choices > li:hover{ background: #f8f8f8; } #btn { background: #3498db; padding: 10px; border-radius: 4px; cursor: pointer; color: #fff; text-align: center; box-shadow: 0 4px 0 #2880b9; } #btn.disabled { background: #ccc; box-shadow: 0 4px 0 #bbb; opacity: 0.7; } #choices > li.correct { background: #d4edda; border-color: #c3e6cb; color: #155724; font-weight: bold; } #choices > li.correct::after { content: "....Correct!"; } #choices > li.wrong { background: #f8d8da; border-color: #f5c6cb; color: #721c24; font-weight: bold; } #choices > li.wrong::after { content: "....Wrong!"; } #result { position: absolute; width: 300px; background: #fff; padding: 30px; box-shadow: 0 0 2px rgba(0, 0, 0, 0.5); top: -500px; left: 0; right: 0; margin: 0 auto; border-radius: 3px; text-align: center; transition: 0.4s ease-out; } #result > p { font-size: 14px; } #result > a { background: #3498db; padding: 10px; border-radius: 4px; cursor: pointer; color: #fff; text-align: center; box-shadow: 0 4px 0 #2880b9; display: block; text-decoration: none; } #result.show { top: 50px; } #btn.startgreen{ background: lightgreen; box-shadow: 0 4px 0 green; } #scoreShow { float: right; color: purple; } .margin { margin-bottom: 10px; } #timer.danger { color: red; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/04/19 15:32

そもそも問題文が表示されないなどのバグがあるみたいですが…。
Asylum35aO2

2019/04/19 22:47

なるほど、そこも訂正しないといけないみたいですね。ご指摘ありがとうございます
guest

回答1

0

ベストアンサー

1つ目は、問題と解答がバラバラになってしまいます。

問題をシャッフルしてから、shuffledChoicesを取り出せばいいかと思います。

2つ目は、質問が被らないようにしたい

setQuiz()が呼ばれるたびにシャッフルせずに、一度だけシャッフルすればいいかと思います。

投稿2019/04/20 00:53

Lhankor_Mhy

総合スコア36074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Asylum35aO2

2019/04/21 17:34

アドバイスいただきましてありがとうございました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問