10月8日记录

制作了一个验证码生成器;

点击查看代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class SimpleMathQuiz extends JFrame {
    private static final int NUM_QUESTIONS = 30; // 题目数量
    private static final int TIME_LIMIT = 60; // 60秒时间限制

    private JTextArea questionArea; // 显示题目的文本区域
    private JTextField answerField; // 用户输入答案的文本框
    private JButton submitButton; // 提交答案按钮
    private JLabel timerLabel; // 显示剩余时间的标签
    private JLabel scoreLabel; // 显示分数和错误数的标签

    private int currentQuestionIndex = 0; // 当前题目索引
    private int score = 0; // 得分
    private int wrongCount = 0; // 错误次数
    private Question[] questions; // 题目数组
    private Timer timer; // 用于计时

    public SimpleMathQuiz() {
        setTitle("简单数学测验");
        setSize(400, 350);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        questionArea = new JTextArea();
        questionArea.setEditable(false);
        questionArea.setLineWrap(true);
        questionArea.setWrapStyleWord(true);
        add(new JScrollPane(questionArea), BorderLayout.CENTER);

        JPanel inputPanel = new JPanel();
        answerField = new JTextField(10);
        submitButton = new JButton("提交答案");
        timerLabel = new JLabel("剩余时间: " + TIME_LIMIT);
        scoreLabel = new JLabel("得分: 0 | 错误数: 0");

        inputPanel.add(answerField);
        inputPanel.add(submitButton);
        inputPanel.add(timerLabel);
        inputPanel.add(scoreLabel);
        add(inputPanel, BorderLayout.SOUTH);

        submitButton.addActionListener(new SubmitAnswerListener());

        questions = QuestionGenerator.generateQuestions(NUM_QUESTIONS);
        displayNextQuestion();
        startTimer();

        setVisible(true);
    }

    private void displayNextQuestion() {
        if (currentQuestionIndex < NUM_QUESTIONS) {
            questionArea.setText(questions[currentQuestionIndex].getQuestion());
            answerField.setText("");
            answerField.requestFocus();
        } else {
            endQuiz();
        }
    }

    private void startTimer() {
        timer = new Timer(1000, new ActionListener() {
            private int timeLeft = TIME_LIMIT;

            @Override
            public void actionPerformed(ActionEvent e) {
                if (timeLeft > 0) {
                    timeLeft--;
                    timerLabel.setText("剩余时间: " + timeLeft);
                } else {
                    ((Timer) e.getSource()).stop();
                    endQuiz();
                }
            }
        });
        timer.start();
    }

    private void endQuiz() {
        timer.stop();
        double errorRate = (double) wrongCount / NUM_QUESTIONS * 100;
        JOptionPane.showMessageDialog(this, "测验结束!您的得分是: " + score + "/" + NUM_QUESTIONS + "\n错误率: " + String.format("%.2f", errorRate) + "%");
        System.exit(0);
    }

    private class SubmitAnswerListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                int answer = Integer.parseInt(answerField.getText());
                if (answer == questions[currentQuestionIndex].getAnswer()) {
                    score++;
                } else {
                    wrongCount++;
                }
                scoreLabel.setText("得分: " + score + " | 错误数: " + wrongCount);
                currentQuestionIndex++;
                displayNextQuestion();
            } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(SimpleMathQuiz.this, "请输入有效的数字!");
            }
        }
    }

    private static class Question {
        private final String question; // 题目字符串
        private final int answer; // 答案

        public Question(String question, int answer) {
            this.question = question;
            this.answer = answer;
        }

        public String getQuestion() {
            return question;
        }

        public int getAnswer() {
            return answer;
        }
    }

    private static class QuestionGenerator {
        public static Question[] generateQuestions(int numberOfQuestions) {
            Question[] questions = new Question[numberOfQuestions];
            Random random = new Random();

            for (int i = 0; i < numberOfQuestions; i++) {
                int a = random.nextInt(100); // 随机生成0到99的整数
                int b = random.nextInt(100); // 随机生成0到99的整数
                int operation = random.nextInt(4); // 随机选择运算符

                switch (operation) {
                    case 0: // 加法
                        questions[i] = new Question(a + " + " + b, a + b);
                        break;
                    case 1: // 减法
                        if (a >= b) {
                            questions[i] = new Question(a + " - " + b, a - b);
                        } else {
                            i--; // 重新生成题目
                        }
                        break;
                    case 2: // 乘法
                        if (a * b < 10000) {
                            questions[i] = new Question(a + " * " + b, a * b);
                        } else {
                            i--; // 重新生成题目
                        }
                        break;
                    case 3: // 除法
                        if (b != 0 && a % b == 0) {
                            questions[i] = new Question(a + " / " + b, a / b);
                        } else {
                            i--; // 重新生成题目
                        }
                        break;
                }
            }
            return questions;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(SimpleMathQuiz::new); // 启动GUI
    }
}
这个程序能够自动生成图片验证码与刷新并且输入账号密码;
posted @ 2024-10-08 20:47  一只虎鲸  阅读(10)  评论(0编辑  收藏  举报