【JavaScript】Switch文を使うシーン

## はじめに
[こちらの記事](https://qiita.com/Yuzaburo/items/d5fb2ed8ef0f9769df07)にもある通り、現在Vanilla JSで野球クイズアプリを開発しています。

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

## やりたいこと
* それぞれの問題に難易度を追加したい
* 難易度ごとに配点を変えたい

## 解決法
* まずはクイズデータの配列のそれぞれの要素に、「difficulty」プロパティを追加
* 1（最も簡単）〜5（最も難しい）の範囲で難易度を設定することにします

```javascript: 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内のロジックを修正します。

```javascript: 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文を使うことで、値によって処理を分岐することができます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/switch

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

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


## 動作例
![スクリーンショット 2024-02-15 10.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620668/5a51b475-0d4c-94fa-889b-69cec551e8b9.png)



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

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