Java学習ツールを作ってみる

# １.はじめに
初めまして、今回は資格勉強中の気分転換も兼ねてJavaのクイズアプリを作ってみました。

# 2.コードの流れ
このコードはJavaの基礎を学ぶために作成したクイズです。形式はコード内の[？]にあてはまる内容を回答します。
問題数は10問あり、全問回答後スコアが表示されます。

# 3.全体コード
```java
import javax.swing.*;
import java.awt.*;

public class JavaQuizApp {

    // 問題文、正解、期待される出力を定義
    private static final String[] questions = {
        "<html><pre>public class HelloWorld {\n    public static void main(String[] args) {\n        System.out.[?](\"hello world\");\n    }\n}</pre></html>",
        "<html><pre>if ([?] > 0) {\n    System.out.println(\"正の数です\");\n}</pre></html>",
        "<html><pre>for (int i = 0; i [?] 5; i++) {\n    System.out.println(i);\n}</pre></html>",
        "<html><pre>int x = 5; x = x [?] 2;</pre></html>",
        "<html><pre>String name = [?](\"Alice\");</pre></html>",
        "<html><pre>public [?] MyClass {\n    // クラス定義\n}</pre></html>",
        "<html><pre>boolean flag = [?];</pre></html>",
        "<html><pre>int[] arr = [?] int[5];</pre></html>",
        "<html><pre>switch (x) {\n    [?] 1:\n        System.out.println(\"ケース1\");\n}</pre></html>",
        "<html><pre>Math.[?](2.5); // 四捨五入</pre></html>"
    };

    private static final String[] answers = {
        "println", "number", "<", "+", "new", "class", "true", "new", "case", "round"
    };

    private static final String[] expectedOutputs = {
        "hello world",
        "正の数です",
        "0\n1\n2\n3\n4",
        "7",
        "Alice",
        "MyClass",
        "true",
        "int[5]",
        "ケース1",
        "3"
    };

    private static int currentQuestion = 0;
    private static int score = 0;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Java Quiz - Step by Step");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 400);

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        JLabel questionLabel = new JLabel(questions[currentQuestion]);
        questionLabel.setFont(new Font("Monospaced", Font.PLAIN, 16));

        JLabel outputLabel = new JLabel("出力結果: " + expectedOutputs[currentQuestion]);
        outputLabel.setFont(new Font("Yu Gothic", Font.PLAIN, 12));
        outputLabel.setForeground(Color.DARK_GRAY);

        JTextField answerField = new JTextField();
        answerField.setMaximumSize(new Dimension(400, 30));

        JButton submitButton = new JButton("回答する");
        JLabel resultLabel = new JLabel(" ");
        resultLabel.setFont(new Font("Yu Gothic", Font.BOLD, 14));

        JButton nextButton = new JButton("次の問題へ");
        nextButton.setEnabled(false);

        // 回答ボタンの動作
        submitButton.addActionListener(e -> {
            String userAnswer = answerField.getText().trim();
            if (userAnswer.equals(answers[currentQuestion])) {
                resultLabel.setText("正解です！");
                resultLabel.setForeground(Color.GREEN);
                score++;
            } else {
                resultLabel.setText("不正解です。正解は: " + answers[currentQuestion]);
                resultLabel.setForeground(Color.RED);
            }
            submitButton.setEnabled(false);
            nextButton.setEnabled(true);
        });

        // 次の問題ボタンの動作
        nextButton.addActionListener(e -> {
            currentQuestion++;
            if (currentQuestion < questions.length) {
                questionLabel.setText(questions[currentQuestion]);
                outputLabel.setText("出力結果: " + expectedOutputs[currentQuestion]);
                answerField.setText("");
                resultLabel.setText(" ");
                submitButton.setEnabled(true);
                nextButton.setEnabled(false);
            } else {
                JOptionPane.showMessageDialog(frame, "全ての問題が終了しました！\n正解数: " + score + " / " + questions.length);
                frame.dispose();
            }
        });

        panel.add(Box.createVerticalStrut(20));
        panel.add(questionLabel);
        panel.add(Box.createVerticalStrut(10));
        panel.add(new JLabel("回答を入力してください:"));
        panel.add(answerField);
        panel.add(Box.createVerticalStrut(10));
        panel.add(outputLabel);
        panel.add(Box.createVerticalStrut(10));
        panel.add(submitButton);
        panel.add(Box.createVerticalStrut(10));
        panel.add(resultLabel);
        panel.add(Box.createVerticalStrut(10));
        panel.add(nextButton);

        frame.add(panel);
        frame.setVisible(true);
    }
}
```
# 5.出力結果例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329736/5424dcc3-ccd1-97c6-0b6a-24fadbcb6cd3.png)

#### 正解の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329736/0fa3ec09-de92-040f-5b5a-e5fe61720cf8.png)
#### 不正解の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329736/ec6d1ce0-a64b-097f-58ff-a3226a52afad.png)

# 6.コード説明
ここでは少しコード説明をしたいと思います。
問題データとして以下を設定しています
##### questions：問題文
```java
private static final String[] questions = {};
```
##### answers：各問題の正解
```java
private static final String[] answers = {};
```
##### expectedOutputs：出力結果
```java
private static final String[] expectedOutputs = {}
```
今回はGUIのためSwingを使って構築しています。
以下説明になります。
##### JLabel: 問題文と出力結果、正誤のメッセージを表示。
```java
JLabel questionLabel = new JLabel(questions[currentQuestion]);
```
##### JTextField: 回答を入力するためのテキスト入力欄。
```java
JTextField answerField = new JTextField();
```
##### JButton: 回答送信や次の問題に進むためのボタン。
```java
JButton submitButton = new JButton("回答する");
```
##### ユーザーが入力した回答を正解と比較し、結果を表示します。
```java
if (userAnswer.equals(answers[currentQuestion])) {
    resultLabel.setText("正解です！");
    score++;
} else {
    resultLabel.setText("不正解です。正解は: " + answers[currentQuestion]);
}
```
##### 「次の問題へ」ボタンを押して次の問題へ移行します。全問終了後はスコアをポップアップ表示し、アプリを終了します。
```java
if (currentQuestion < questions.length) {
    // 次の問題を設定
} else {
    JOptionPane.showMessageDialog(frame, "全ての問題が終了しました！\n正解数: " + score + " / " + questions.length);
    frame.dispose();
}
```
# おわりに
今回はJavaクイズアプリを作ってみました。スコアの記録、タイマー追加など、できることはまだまだがありそうなので暇なときにいじってみようと思います。( ᐛ👐)