正解絞り込みクイズで、尋ねる必要がなくなった質問を非表示にしたい
興味があり、プログラミングの入門としてJavaScriptを勉強し始めた初心者です。
質問に回答するごとに、正解となる選択肢がどんどんと絞り込まれていく、**「アキネーター」**のようなプログラムを作成したいと野望を抱いています!
前回も同様の質問をさせていただき、偉大なる先輩方のアドバイスをいただいた結果、以下のような式にまでたどり着くことができました!
HTML
1<body> 2 3 <div id="Questions"><h1>質問</h1> 4 5 <div id="Q1"> 6 <p>Q. 動物ですか?</p> 7 <label><input type="radio" name="RadGrpA1" id="A1Yes">YES</label> 8 <label><input type="radio" name="RadGrpA1" id="A1No">No</label> 9 <label><input type="radio" name="RadGrpA1">わからない</label> 10 <label style="display: none;"><input type="radio" name="RadGrpA1" checked>未選択</label> 11 </div> 12 13 <div id="Q2"> 14 <p>Q. 首が長いですか?</p> 15 <label><input type="radio" name="RadGrpA2" id="A2Yes">YES</label> 16 <label><input type="radio" name="RadGrpA2" id="A2No">No</label> 17 <label><input type="radio" name="RadGrpA2">わからない</label> 18 <label style="display: none;"><input type="radio" name="RadGrpA2" checked>未選択</label> 19 </div> 20 21 <div id="Q3"> 22 <p>Q. 植物ですか?</p> 23 <label><input type="radio" name="RadGrpA3" id="A3Yes">YES</label> 24 <label><input type="radio" name="RadGrpA3" id="A3No">No</label> 25 <label><input type="radio" name="RadGrpA3">わからない</label> 26 <label style="display: none;"><input type="radio" name="RadGrpA3" checked>未選択</label> 27 </div> 28 29 <div id="Q4"> 30 <p>Q. トゲがありますか?</p> 31 <label><input type="radio" name="RadGrpA4" id="A4Yes">YES</label> 32 <label><input type="radio" name="RadGrpA4" id="A4No">No</label> 33 <label><input type="radio" name="RadGrpA4">わからない</label> 34 <label style="display: none;"><input type="radio" name="RadGrpA4" checked>未選択</label> 35 </div> 36 37 <div id="Q5"> 38 <p>Q. 人間ですか?</p> 39 <label><input type="radio" name="RadGrpA5" id="A5Yes">YES</label> 40 <label><input type="radio" name="RadGrpA5" id="A5No">No</label> 41 <label><input type="radio" name="RadGrpA5">わからない</label> 42 <label style="display: none;"><input type="radio" name="RadGrpA5" checked>未選択</label> 43 </div> 44 45 <div id="Q6"> 46 <p>Q. ミュージシャンですか?</p> 47 <label><input type="radio" name="RadGrpA6" id="A6Yes">YES</label> 48 <label><input type="radio" name="RadGrpA6" id="A6No">No</label> 49 <label><input type="radio" name="RadGrpA6">わからない</label> 50 <label style="display: none;"><input type="radio" name="RadGrpA6" checked>未選択</label> 51 </div> 52 53 </div> 54 55 <h1>可能性</h1> 56 <p id="Cabbage">キャベツ</p> 57 <p id="Cactus">サボテン</p> 58 <p id="Elephant">象</p> 59 <p id="Giraffe">キリン</p> 60 <p id="MichaelJackson">マイケルジャクソン</p> 61 <p id="NobunagaOda">織田信長</p> 62 63</body>
JavaScript
1document.getElementById("Questions").addEventListener("change", () => { 2 3 let Judge = {Cabbage:"", Cactus:"", Elephant:"", Giraffe:"", MichaelJackson:"", NobunagaOda:""}; 4 let JudgeArray = ["Cabbage", "Cactus", "Elephant", "Giraffe", "MichaelJackson", "NobunagaOda"]; 5 6 const ResponseAndProcess = [ 7 {Response:"A1Yes", omit:["Cabbage","Cactus"]}, 8 {Response:"A1No", omit:["Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 9 {Response:"A2Yes", omit:["Cabbage","Cactus","Elephant","MichaelJackson","NobunagaOda"]}, 10 {Response:"A2No", omit:["Giraffe"]}, 11 {Response:"A3Yes", omit:["Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 12 {Response:"A3No", omit:["Cabbage","Cactus"]}, 13 {Response:"A4Yes", omit:["Cabbage","Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 14 {Response:"A4No", omit:["Cactus"]}, 15 {Response:"A5Yes", omit:["Cabbage","Cactus","Elephant","Giraffe"]}, 16 {Response:"A5No", omit:["MichaelJackson","NobunagaOda"]}, 17 {Response:"A6Yes", omit:["Cabbage","Cactus","Elephant","Giraffe","NobunagaOda"]}, 18 {Response:"A6No", omit:["MichaelJackson"]}, 19 ]; 20 21 for (let i=0; i<ResponseAndProcess.length; i++) { 22 if (document.getElementById(ResponseAndProcess[i].Response).checked) { 23 for (let j=0; j<ResponseAndProcess[i].omit.length; j++) { 24 Judge[ResponseAndProcess[i].omit[j]] = "不正解"; 25 } 26 } 27 } 28 29 for (let i = 0; i < JudgeArray.length; i++) { 30 if (Judge[JudgeArray[i]] == "不正解") { 31 document.getElementById(JudgeArray[i]).classList.add("ZeroPossibility"); 32 } else { 33 document.getElementById(JudgeArray[i]).classList.remove("ZeroPossibility"); 34 } 35 } 36 37});
不正解となる回答に「ZeroPossibility」というクラスを付与し、CSS操作でグレーアウトさせる動きです。
ここまでは綺麗に動いてくれたので嬉しいのですが、欲を言うと、「尋ねる必要のなくなった質問」に更にクラス等を付与・非表示にして、回答する手数も最短で正解に辿り着けるような形に仕上げたいです。
例:「動物ですか?」が「はい」なら、「植物ですか?」と「トゲがありますか?」という質問を非表示にさせる。
どの質問から回答しても機能させたいのですが、なかなかスマートな方法を発想できずに難儀しているため、皆さまならどのように上記を実現させるのか、お知恵を拝借したく質問させていただきました。
他力本願で申し訳ございませんが、何卒あたたかくご回答いただけますと幸いですm(_ _)m
回答1件
あなたの回答
tips
プレビュー