얀별
26
2021-10-21 17:43:58 작성 2021-10-21 17:44:53 수정됨
7
288

퀴즈를 랜덤으로 나타나게 하고 싶습니다


자바스크립트에서 퀴즈를 만들고 있습니다. 퀴즈타입별로 문제가 랜덤하게 나오는데 정답까지 랜덤으로 나와버려서 정답체크 오류가 있습니다. 도와주세요..

gameType1는 OX 퀴즈

gameType2은 객관식 

gameType3 주관식


let quiz_array = [

    [

        ["1.","q1","2","X","ans"],

        ["2.","q2","2","X","ans"],

        ["3.","q3","1","O","ans"],

        ["4.","q4","2","X","ans"],

        ["5.","q5","2","X","ans"],

    [

        ["1.","q1","4","4","ans","choice1","choice2","choice3","choice4"],

        ["2.","q2","2","2","ans","choice1","choice2","choice3","choice4"],

        ["3.","q3","2","2","ans","choice1","choice2","choice3","choice4"],

        ["4.","q4","1","1","ans","choice1","choice2","choice3","choice4"],

        ["5.","q5","3","3","ans","choice1","choice2","choice3","choice4"],

    ],

    [

        ["1.","q1","apple","apple","apple"],

        ["2.","q2","effect","effect","effect"],

        ["3.","q3","object","object","object"],

        ["4.","q4","glory","glory","glory"],

        ["5.","q5","art","art","art"],

    ]

];


function quizShuffle(){

    let rand, tmp;

    for(let i=0;i<3;i++){

        for(var j=quiz_array[i].length;j>0;j--){

            rand = Math.floor(Math.random() * j);

            tmp = quiz_array[i][j-1];

            quiz_array[i][j-1] = quiz_array[i][rand];

            quiz_array[i][rand] = tmp;

        }

    }

}

function quizCheck(val){

    if(!quizSubmit){

        let myans = val+1;

        let ans_arr = quiz_array[gameType-1][caseNum-1][2];

        let ansCheck = false;

        for(let i=0;i<ans_arr.length;i++){

            if(myans == parseInt(ans_arr[i])){

                ansCheck = true;

            }

        }

        if(gameType == 1){

            if(ansCheck){

                quizSubmit = true;

                qNextBtn(true);

                q_ans.show();

                q_desc.show();

                result_arr[caseNum-1+(gameType-1)*3] = 0;

            }

            else{

                count--;

                quizSubmit = true;

                qNextBtn(true);

                q_ans.show();

                q_desc.show();

            }

        }

        else if(gameType == 2){

            if(ansCheck){

                quizSubmit = true;

                qNextBtn(true);

                q_ans.show();

                result_arr[caseNum-1+(gameType-2)*3] = 0;

            }

            else{

                count--;

                quizSubmit = true;

                qNextBtn(true);

                q_ans.show();

            }

        }

    }

}

function quizSub(){

    if(!quizSubmit){

        let myans = "";

        let reans = "";

        let myansTmp = $("#setting_input").val().toString();

        let reansTmp = quiz_array[gameType-1][caseNum-1][2].toString();


        for(let i=0;i<myansTmp.length;i++){

            if(myansTmp[i] != " "){

                myans += myansTmp[i];

            }

        }

        for(let i=0;i<reansTmp.length;i++){

            if(reansTmp[i] != " "){

                reans += reansTmp[i];

            }

        }

        if(myans == reans){

            quizSubmit = true;

            qNextBtn(true);

            q_ans.show();

            result_arr[caseNum-1+(gameType-3)*3] = 0;

        }

        else{

            quizSubmit = true;

            qNextBtn(true);

            q_ans.show();

        }

    }

}

-2
0
  • 답변 7

  • 20170923
    2k
    2021-10-21 17:53:13

    통 코드라 코드는 안봤습니다.

    셔플 idx 기준으로 퀴즈 출제 후 idx를 따로 저장을 해주고 계신가요?

  • 얀별
    26
    2021-10-21 18:07:12
    아니요.. idx 값을 따로 주어야 하는건가요??
  • MKRO
    617
    2021-10-21 18:07:52
    코드는 안봤습니다. 당연히 문제랑 그에 상응하는 답을 하나의 객체로 묶거나, 문제의 id로 답을 찾을 수 있도록 만들어야겠
  • 얀별
    26
    2021-10-21 18:36:44
    죄송하지만 이해하기 조금 어렵습니다..
  • Unknown_
    496
    2021-10-21 18:47:32 작성 2021-10-21 18:50:41 수정됨

    얀별 위엣분들 말씀은요...


    랜덤으로 문제를 출제할 때, 문제와 이어져있는 답도 함께 변수로 묶어두라는 말입니다. 정답도 랜덤으로 확인해버리니까요. 랜덤변수로 인해 Q1에 대한 문제가 출제 되었을 때, Q1에 대한 답 A1을 별도의 변수로 지정해두던가 해서, 사용자가 정답을 맞출 때 해당 변수랑 대조하시면 됩니다.


    + 저도 눈 아파서 소스코드 전체를 보기는 조금 어렵지만, 상단 quiz_array 변수 선언하는 곳에, 전역변수로 쓸 수 있게끔 quiz_answer 라던가, 대충 하나 선언해두시고. 퀴즈 출력하면서 해당 퀴즈에 대한 답안을 상단의 전역변수(quiz_answer)에 대입해두시고 쓰시면 될 것 같은데요

  • TeraGo
    850
    2021-10-21 19:39:14
    퀴즈를 만들고 풀고 정답 체크하는걸 한 함수에서 처리하시면 되겠네요.

    let a = fun(n) {
       q = fun() {}
       …

    이런식으로.

    퀴즈 뽑아서 해당 최상위 함수 변수로 담아서 

    this.a 에 답을 담아놓는 식으로.

    굳이 함수를 다 분해해서 할 필요는 없죠..

    그리고 배열도 좀 너무 내용이 구분이 안가요..

    [{답:1, 문제: okky.kr}]

    이런식으로 좀 구분이 가도록 처리하세요.

    저렇게 만들면 다음날 다 잊어버려요.

    순서도 외우거나 어디에 기록해야하는 불편함을 감수하시는 이유가..

    전체적으로…
  • TeraGo
    850
    2021-10-21 19:40:55
    하나의 함수에서 문제도 만들고 퀴즈생성, 정답확인, 해설 등 한번에 처리하시고 중간중간 추가해야 하는 내용이 있다면 프로토타입으로 추가하심 됩니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.