JAVASCRIPT

퀴즈 이펙트 06번

ture403 2023. 3. 27. 20:06

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형

퀴즈이펙트 완성 화면 입니다.

html 코드입니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>퀴즈 이펙트06</title>
    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/quiz.css">
</head>
<body>
    <header id="header">
        <h1><a href="../javascript14.html">Quiz</a><em>객관식(슬라이드) 확인하기(여러문제) 유형 : 슬라이드 유형</em></h1>
        <ul>
            <li><a href="quizEffect01.html">1</a></li>
            <li><a href="quizEffect02.html">2</a></li>
            <li><a href="quizEffect03.html">3</a></li>
            <li><a href="quizEffect04.html">4</a></li>
            <li><a href="quizEffect05.html">5</a></li>
            <li class="active"><a href="quizEffect06.html">5</a></li>
        </ul>
    </header>
    <!-- //header -->
    
    <main id="main">
        <div class="quiz_wrap">
            <div class="quiz">
                <div class="quiz_header">
                    <h2 class="quiz_title"></h2>
                </div>
                <div class="quiz_main">
                    <div class="quiz_quection">
                    </div>
                    <div class="quiz_view">
                        <div class='dog_wrap'>
                            <p></p>
                            <span></span>
                            <div class="ture">정답입니다.</div>
                            <div class="false">틀렸습니다!</div>
                            <div class='card-container'>
                                <div class="dog">
                                    <div class="head">
                                        <div class="ears"></div>
                                        <div class="face"></div>
                                        <div class="eyes">
                                            <div class="teardrop"></div>
                                        </div>
                                        <div class="nose"></div>
                                        <div class="mouth">
                                            <div class="tongue"></div>
                                        </div>
                                        <div class="chin"></div>
                                    </div>
                                    <div class="body">
                                        <div class="tail"></div>
                                        <div class="legs"></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="quiz_choice">
                        <!-- <label for="choice1">
                            <input type="radio" id="choice1" value="1" name="choice">
                            <span></span>
                        </label>
                        <label for="choice2">
                            <input type="radio" id="choice2" value="2" name="choice">
                            <span></span>
                        </label>
                        <label for="choice3">
                            <input type="radio" id="choice3" value="3" name="choice">
                            <span></span>
                        </label>
                        <label for="choice4">
                            <input type="radio" id="choice4" value="4" name="choice">
                            <span></span>
                        </label>
                        -->
                    </div>
                    <div class="quiz_answer">
                        <button class="next">다음 문제</button>
                    </div>
                </div>
                <div class="quiz_desc"></div>
                <div class="quiz_info">??점</div>
            </div>
        </div>
    </main>
    <!-- //main -->
    
    <footer id="footer">
        <a href="mailto:ture403@gmail.com">ture403@gmail.com</a>
    </footer>
    <!-- //footer -->
 </body>
  • dog_wrap 안에있는 p 와 span 태그는 총 갯수와 맞힌 갯수를 표출해 줄려고 만들었습니다.
  • 기존 html이랑 별 다를게 없습니다.

JS 코드입니다.

const quizInfo = [
    {
        infoType : "정보처리 기능사",
        infoTime : "2011년도 5회",
        infoNumber : "20110501",
        infoQuection : "JK 플립플롭(Flip Flop)에서 보수가 출력되기 위한 J, K의 입력 상태는?",
        infoChoice : ["J=1, K=0","J=0, K=1","J=1, K=1","J=0, K=0"],
        infoAnswer :"J=1, K=1",
        infoDesc : "JK 플리플롭은 만능 플리플롭이라고 불리울 만큼 기능이 많으며 모든 플리플롭의 기능을 대체할수 있습니다.특히 J=1, K=1 일때 T 플립플롭 즉 보수, 반전 기능으로 작동 합니다."
    },{
        infoType : "정보처리 기능사",
        infoTime : "2011년도 5회",
        infoNumber : "20110502",
        infoQuection : "보기의 도형과 관련 있는 것은?",
        infoChoice : ["OR게이트","버퍼(buffer)","NAND게이트	", "인버터(Invert)"],
        infoAnswer :"인버터(Invert)",
        infoDesc : "인버터(Invert), NOT 게이트 입니다."
    },{
        infoType : "정보처리 기능사",
        infoTime : "2011년도 5회",
        infoNumber : "201105013",
        infoQuection : "중앙처리장치(CPU)에 해당하는 부분을 하나의 대규모 집적회로의 칩에 내장시켜 기능을 수행하게 하는 것은?",
        infoChoice : ["마이크로프로세서", "컴파일러", "소프트웨어", "레지스터"],
        infoAnswer :"마이크로프로세서",
        infoDesc : "마이크로프로세서란 하나의 칩안에 CPU의 각종 기능을 모두 내장한 형태를 말합니다."
    },{
        infoType : "정보처리 기능사",
        infoTime : "2011년도 5회",
        infoNumber : "201105014",
        infoQuection : "명령의 오퍼랜드 부분에 실제 데이터가 기록되어 있어 메모리 참조를 하지 않고 데이터를 처리하는 방식으로 수행 시간이 빠르지만 오퍼랜드 길이가 한정되어 실제 데이터의 길이에 제약을 받는 주소지정 방식은?",
        infoChoice : ["Direct Addressing", "Indirect Addressing", "Relative Addressing", "Immediate Addressing"],
        infoAnswer :"Immediate Addressing",
        infoDesc : "메모리를 참조 하지 않는다고 하였으므로 묵시적 또는 즉시주소 방식중 하나 입니다..이때 스택에 관한 언급이 없으므로 즉시주소방식(Immediate Addressing) 입니다."
    },{
        infoType : "정보처리 기능사",
        infoTime : "2011년도 5회",
        infoNumber : "20110505",
        infoQuection : "명령어의 주소(Address)부를 연산 주소(Address)로 이용하는 주소지정방식은?",
        infoChoice : ["상대 Addressing 방식", "절대 Addressing 방식", "간접 Addressing 방식", "직접 Addressing 방식"],
        infoAnswer :"직접 Addressing 방식",
        infoDesc : "레지스터에 저장된 값을 연산하는 것은 '연산 명령어' 입니다."
    },{
        infoType : "정보처리 기능사",
        infoTime : "2011년도 5회",
        infoNumber : "20110506",
        infoQuection : "연산자의 기능과 거리가 먼 것은?",
        infoChoice : ["주소지정 기능","제어 기능","함수연산 기능","입/출력 기능"],
        infoAnswer :"주소지정 기능",
        infoDesc : "명령어 = 명령어 코드부 + 명령어 주소부Instruction = Op_Code + Operand연산자의 기능과 거리가 먼것은이라고 하였으므로 주소와 관련된 이야기를 찾으시면 됩니다."
    }
];

//선택자 
const quizWrap = document.querySelector(".quiz_wrap");
const quizTitle = quizWrap.querySelector(".quiz_title");
const quizQuection = quizWrap.querySelector(".quiz_quection");
const quziChoice = quizWrap.querySelector(".quiz_choice");
const dogWrap = quizWrap.querySelector(".dog_wrap");
const quizNext = quizWrap.querySelector(".quiz_answer .next");
const quizAnswer = quizWrap.querySelector(".quiz_answer");
const quizDesc = quizWrap.querySelector(".quiz_desc");
const dowWrapP = quizWrap.querySelector(".dog_wrap p");
const dowWrapspan = quizWrap.querySelector(".dog_wrap span");
const quizReulstAnswer = quizWrap.querySelector(".quiz_info");

let quizCount = 0;
let quizScore = 0;
let z;

//  문제 출력
const updateQuiz = (index , number)=>{
    let typeTag = `
        <span>${quizInfo[index].infoType}</span>
        <em>${quizInfo[index].infoTime}</em>
    `;

    let qusectionTag = `
        <em>${index+1}</em>.
        <span>${quizInfo[index].infoQuection}</span>
    `;

    let choiceTag = `
        <label for="choice1">
            <input type="radio" id="choice1" value="1" name="choice">
            <span>${quizInfo[index].infoChoice[0]}</span>
        </label>
        <label for="choice2">
            <input type="radio" id="choice2" value="2" name="choice">
            <span>${quizInfo[index].infoChoice[1]}</span>
        </label>
        <label for="choice3">
            <input type="radio" id="choice3" value="3" name="choice">
            <span>${quizInfo[index].infoChoice[2]}</span>
        </label>
        <label for="choice4">
            <input type="radio" id="choice4" value="4" name="choice">
            <span>${quizInfo[index].infoChoice[3]}</span>
        </label>
    `;

    let descTag = `
        정답은 ${quizInfo[index].infoAnswer} 입니다.<br>
        ${quizInfo[index].infoDesc}
    `;

    quizTitle.innerHTML = typeTag;
    quizQuection.innerHTML = qusectionTag;
    quziChoice.innerHTML = choiceTag;
    quizDesc.innerHTML = descTag;

    // 갯수
    dowWrapP.textContent = `총갯수 :  ${quizCount+1}개 / ${quizInfo.length}개`;

    // 보기 선택자
    const quizChoiceSpan = quizWrap.querySelectorAll(".quiz_choice span");
    const quizChoiceInput = quizWrap.querySelectorAll(".quiz_choice input");

    // quizChoiceSpan.forEach((span,num)=> {
    //     span.setAttribute("onclick", "choiceSelected(this)");
    //     quizChoiceInput[num].disabled = "true";
    // });

    for(let i=0; i<quizChoiceSpan.length; i++){
        quizChoiceSpan[i].setAttribute("onclick", "choiceSelected(this)");
        // quizChoiceInput[i].disabled = "true";
    }

    // 다음버튼, 해설 숨기기
    quizAnswer.style.display ="none";
    quizDesc.style.display = "none";

    // 갯수 표시
};

updateQuiz(quizCount);

// 객관식 선택
function choiceSelected(answer){
        let userAnswer = answer.textContent; //사용자 정답
        let currentAnswer = quizInfo[quizCount].infoAnswer; //문제 정답
        if( userAnswer == currentAnswer){
            quizScore++
            dogWrap.classList.add("like");

        } else {
            dogWrap.classList.add("dislike");
        }
        dowWrapspan.textContent = `정답갯수 : ${quizScore}`;
        quizAnswer.style.display ="block";
        quizDesc.style.display = "block";
}
// 정답 확인
quizNext.addEventListener("click", () =>{

    if(quizCount == quizInfo.length-1){
        quizReulstAnswer.textContent= Math.ceil((quizScore / quizInfo.length) * 100) + "점";
    } else {
        quizCount++;
        updateQuiz(quizCount);
    }

    dogWrap.classList.remove("like","dislike");
    dowWrapP.textContent = `총갯수 :  ${quizCount+1}개 / ${quizInfo.length}개`;
})
  • quzinfo에 문제를 담았습니다. 
  • 변수 updateQuiz함수를 넣었습니다. 그안에 html안에 넣을 html 코드를 넣었습니다.
  • 갯수를 표현하기 위해서 총갯수 quizCount 값과 quizinfo에 갯수를 넣었습니다.
  • quizAnswer는 정답을 보여줄떄 표출할꺼여서 display ="none"으로 했습니다.
  • choiceSelected의 함수는 정답이 맞는지 확인하는 함수 입니다.
  • 사용자 정답과 문제 정답을 변수에 넣고 그 값들이 같으면 quizScore를 증가시켜 문제 정답 갯수를 만들었습니다.
  • quizNext 클릭할때 updateQuiz호출시키고 quizCount값을 증가시켰습니다.
  • if문을 써서 quizCount랑 quizinfo갯수-1 값이 같으면 문제 점수를 표출했습니다.

 

퀴즈 이펙트 5번입니다.

https://ture403.tistory.com/54

 

퀴즈 이펙트 5번 입니다.

퀴즈 이펙트 5번 입니다. 완성된 화면 입니다. html코드입니다. Quiz객관식 확인하기(여러문제) 유형 1 2 3 4 5 ture403@gmail.com 다중으로 문제를 만들때 일일이 HTML에 입력해서 표출하는건 너무 노다가

ture403.tistory.com

코드 풀 화면 입니다.

https://ture403.github.io/web2023/javascript/quiz/quizEffect06.html

 

퀴즈 이펙트06

정답입니다. 틀렸습니다! 다음 문제

ture403.github.io

 

작성 코드 입니다.

https://github.com/ture403/web2023/blob/main/javascript/quiz/quizEffect06.html