54
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

エニプラAdvent Calendar 2024

Day 13

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

Last updated at Posted at 2024-12-12

1.はじめに

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

2.コードの流れ

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

3.全体コード

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

正解の場合

image.png

不正解の場合

image.png

6.コード説明

ここでは少しコード説明をしたいと思います。
問題データとして以下を設定しています

questions:問題文
private static final String[] questions = {};
answers:各問題の正解
private static final String[] answers = {};
expectedOutputs:出力結果
private static final String[] expectedOutputs = {}

今回はGUIのためSwingを使って構築しています。
以下説明になります。

JLabel: 問題文と出力結果、正誤のメッセージを表示。
JLabel questionLabel = new JLabel(questions[currentQuestion]);
JTextField: 回答を入力するためのテキスト入力欄。
JTextField answerField = new JTextField();
JButton: 回答送信や次の問題に進むためのボタン。
JButton submitButton = new JButton("回答する");
ユーザーが入力した回答を正解と比較し、結果を表示します。
if (userAnswer.equals(answers[currentQuestion])) {
    resultLabel.setText("正解です!");
    score++;
} else {
    resultLabel.setText("不正解です。正解は: " + answers[currentQuestion]);
}
「次の問題へ」ボタンを押して次の問題へ移行します。全問終了後はスコアをポップアップ表示し、アプリを終了します。
if (currentQuestion < questions.length) {
    // 次の問題を設定
} else {
    JOptionPane.showMessageDialog(frame, "全ての問題が終了しました!\n正解数: " + score + " / " + questions.length);
    frame.dispose();
}

おわりに

今回はJavaクイズアプリを作ってみました。スコアの記録、タイマー追加など、できることはまだまだがありそうなので暇なときにいじってみようと思います。( ᐛ👐)

54
3
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
54
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?