Java | 論理演算子を使った「採点付きミニ演習プログラム」

APP Java
スポンサーリンク

では、論理演算子の練習を採点付きで行える「豪華版 GUI アプリ(Swing + プログレスバー付き)」を作りましょう。
ユーザーが問題に答えると得点が加算され、平均点がプログレスバーで視覚的に伸びていく
仕様です。


機能概要

  • Java Swing を使用した GUI アプリ。
  • 複数の論理演算子クイズを出題。
  • 各問題にラジオボタンで回答。
  • 採点ボタンを押すと結果表示+平均スコア更新。
  • 平均スコアを JProgressBar でビジュアル表示。

💻 コード全体(豪華版)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class LogicQuizGUI extends JFrame implements ActionListener {
    // 質問・選択肢・正解データ
    private String[] questions = {
        "問1: true && false の結果は?",
        "問2: true || false の結果は?",
        "問3: !(true && true) の結果は?",
        "問4: false || (true && false) の結果は?"
    };
    private String[][] options = {
        {"true", "false"},
        {"true", "false"},
        {"true", "false"},
        {"true", "false"}
    };
    private int[] answers = {1, 0, 1, 1}; // 正解インデックス

    // GUI部品
    private ButtonGroup[] groups;
    private JRadioButton[][] radios;
    private JButton submitButton;
    private JLabel resultLabel;
    private JProgressBar progressBar;
    private JLabel avgLabel;

    // 採点管理
    private int totalScore = 0;
    private int attempts = 0;

    public LogicQuizGUI() {
        setTitle("論理演算子クイズ - 豪華版");
        setSize(480, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout());

        // メインパネル
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(questions.length + 2, 1));
        groups = new ButtonGroup[questions.length];
        radios = new JRadioButton[questions.length][2];

        // 質問と選択肢を配置
        for (int i = 0; i < questions.length; i++) {
            JPanel qPanel = new JPanel();
            qPanel.setLayout(new GridLayout(3, 1));
            qPanel.setBorder(BorderFactory.createTitledBorder(questions[i]));

            groups[i] = new ButtonGroup();
            for (int j = 0; j < 2; j++) {
                radios[i][j] = new JRadioButton(options[i][j]);
                groups[i].add(radios[i][j]);
                qPanel.add(radios[i][j]);
            }
            mainPanel.add(qPanel);
        }

        // 採点ボタン
        submitButton = new JButton("採点する");
        submitButton.addActionListener(this);
        mainPanel.add(submitButton);

        // 結果表示
        resultLabel = new JLabel("ここに結果が表示されます", SwingConstants.CENTER);
        avgLabel = new JLabel("平均点: 0%", SwingConstants.CENTER);
        progressBar = new JProgressBar(0, 100);
        progressBar.setValue(0);
        progressBar.setStringPainted(true);
        progressBar.setForeground(new Color(100, 180, 255));

        JPanel resultPanel = new JPanel(new GridLayout(3, 1));
        resultPanel.add(resultLabel);
        resultPanel.add(avgLabel);
        resultPanel.add(progressBar);

        add(mainPanel, BorderLayout.CENTER);
        add(resultPanel, BorderLayout.SOUTH);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int score = 0;
        for (int i = 0; i < questions.length; i++) {
            for (int j = 0; j < 2; j++) {
                if (radios[i][j].isSelected() && j == answers[i]) {
                    score++;
                }
            }
        }

        int percent = (int) ((score / (double) questions.length) * 100);
        resultLabel.setText("今回の得点: " + percent + " 点 (" + score + "/" + questions.length + ")");
        
        // 平均スコア更新
        attempts++;
        totalScore += percent;
        int avg = totalScore / attempts;

        avgLabel.setText("平均点: " + avg + "%");
        progressBar.setValue(avg);

        // 少し演出(プログレスバーが伸びるアニメ風)
        new Thread(() -> {
            int current = progressBar.getValue();
            for (int i = current; i <= avg; i++) {
                progressBar.setValue(i);
                try {
                    Thread.sleep(15);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        }).start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new LogicQuizGUI().setVisible(true);
        });
    }
}
Java

ポイント解説

機能説明
JRadioButton複数選択肢から1つを選ぶボタン
ButtonGroup同じ質問内で1つしか選べないようにする
JProgressBar平均スコアをバーで表示(0〜100%)
Thread.sleep()バーがスムーズに伸びる演出
GridLayout縦に整列してきれいに配置
タイトルとURLをコピーしました