0
1

【JavaScript】Switch文を使うシーン

Posted at

はじめに

こちらの記事にもある通り、現在Vanilla JSで野球クイズアプリを開発しています。

開発を進めている中で、問題の難易度ごとに配点を変えてみたいなと思ったので、その過程をメモします。

やりたいこと

  • それぞれの問題に難易度を追加したい
  • 難易度ごとに配点を変えたい

解決法

  • まずはクイズデータの配列のそれぞれの要素に、「difficulty」プロパティを追加
  • 1(最も簡単)〜5(最も難しい)の範囲で難易度を設定することにします
quizdata.js
const quizData = [
    {
      question: "日本はWBCで何回優勝している?",
      choices: ["1回", "2回", "3回", "4回"],
      answer: "3回",
      explanation: "日本は2006年、2009年、2023年にWBCで優勝しています。"
      difficulty: "3",
    },

    {
      question: "日本のプロ野球は何球団ある?",
      choices: ["10球団", "11球団", "12球団", "13球団"],
      answer: "12球団",
      explanation: "2023年4月時点で、日本のプロ野球は12球団です。"
      difficulty: "1",
    },

    {
      question: "日本のプロ野球は何リーグある?",
      choices: ["1リーグ", "2リーグ", "3リーグ", "4リーグ"],
      answer: "2リーグ",
      explanation: "2023年4月時点で、日本のプロ野球はセ・リーグとパ・リーグの2リーグ制です。"
      difficulty: "1",
    },

    // 以下略

];

export default quizData;

そして次に、quizController.js内のロジックを修正します。

quizController.js
import quizData  from "../data/quizdata.js";

let currentQuestionIndex = 0;
let score = 0;

function shuffle(array) {
    for (let i = (array.length - 1); i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [array[i], array[j]] = [array[j], array[i]];
    }
}

// クイズ開始時に選択肢をシャッフル
shuffle(quizData);

function displayQuestion() {
    const question = document.getElementById('question');
    const scoreDisplay = document.getElementById('score');
    
    // 現在の質問と選択肢を表示
    question.textContent = quizData[currentQuestionIndex].question;
    quizData[currentQuestionIndex].choices.forEach((choice, index) => {
        const button = document.getElementById(`btn${index}`);
        button.textContent = choice;
        button.onclick = () => checkAnswer(choice);
    });
    
    // スコアを更新
    scoreDisplay.textContent = `スコア: ${score}`;
}

function checkAnswer(choice) {
    if (choice === quizData[currentQuestionIndex].answer) {
        switch (quizData[currentQuestionIndex].difficulty) {
            case '1':
                score += 10;
                alert(`正解です。\n${quizData[currentQuestionIndex].explanation}`);
                break;
            case '2':
                score += 20;
                alert(`正解です。\n${quizData[currentQuestionIndex].explanation}`);
                break;
            case '3':
                score += 30;
                alert(`正解です。\n${quizData[currentQuestionIndex].explanation}`);
                break;
            case '4':
                score += 40;
                alert(`正解です。\n${quizData[currentQuestionIndex].explanation}`);
                break;
            case '5':
                score += 50;
                alert(`正解です。\n${quizData[currentQuestionIndex].explanation}`);
                break;
            default:
                break;
        }
    } else {
        alert(`不正解です。\n${quizData[currentQuestionIndex].explanation}`);
    }

    currentQuestionIndex++;
    if (currentQuestionIndex < quizData.length) {
        displayQuestion();
    } else {
        alert(`クイズ終了!あなたのスコアは ${score} 点です。`);
        resetQuiz();
    }
}

// もしクイズが終了したら、最初の質問を表示する
function resetQuiz() {
    currentQuestionIndex = 0;
    score = 0;
    shuffle(quizData);
    displayQuestion();
}

// クイズの初期表示
displayQuestion();

ポイントは中段のswitch文です。

switch文を使うことで、値によって処理を分岐することができます。

今回の場合、最も簡単な難易度1の問題に正解すれば10点を追加します。

対して最も難しい難易度5の問題に正解すれば50点を追加します。

動作例

スクリーンショット 2024-02-15 10.38.26.png

このように回答すると難易度に応じたスコアが加算され、次の問題が表示されます。

いくつかの値に応じて処理を分岐させる時に、switch文は便利ですね!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1