设计一个用户登陆注册界面,要求用户信息用一个文本文件保存,当该文件不存在,则提示用户注册,将用户的信息写入文件,如果文件存在则进行密码核对,如果密码正确则进入系统,该系统使用随机函数生成四则运算的出题界面,用户可以对出题给出答案程序能够自动判断对错,先期设定运算题型,数据大小,题目数量,最后根据批改给出测试成绩,写出代码
时间: 2024-03-15 21:47:03 浏览: 18
以下是一个基本的Java代码实现:
```java
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class LoginRegisterPanel extends JPanel {
private JTextField usernameField;
private JPasswordField passwordField;
private JPasswordField confirmPasswordField;
private JButton loginButton;
private JButton registerButton;
private JLabel statusLabel;
private File usersFile;
private Map<String, String> users;
public LoginRegisterPanel(File usersFile) {
this.usersFile = usersFile;
users = new HashMap<>();
loadUsers();
setLayout(new BorderLayout());
JPanel inputPanel = new JPanel(new GridLayout(3, 2, 5, 5));
inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
inputPanel.add(new JLabel("Username:"));
inputPanel.add(usernameField = new JTextField());
inputPanel.add(new JLabel("Password:"));
inputPanel.add(passwordField = new JPasswordField());
inputPanel.add(new JLabel("Confirm Password:"));
inputPanel.add(confirmPasswordField = new JPasswordField());
add(inputPanel, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 5, 5));
buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
buttonPanel.add(loginButton = new JButton("Login"));
loginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (checkUser()) {
statusLabel.setText("Login success!");
} else {
statusLabel.setText("Invalid username or password!");
}
}
});
buttonPanel.add(registerButton = new JButton("Register"));
registerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (registerUser()) {
statusLabel.setText("Register success!");
} else {
statusLabel.setText("Username already exists!");
}
}
});
add(buttonPanel, BorderLayout.SOUTH);
add(statusLabel = new JLabel("Enter username and password to login or register."), BorderLayout.NORTH);
}
private void loadUsers() {
if (!usersFile.exists()) {
try {
usersFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
try (Scanner scanner = new Scanner(usersFile)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] fields = line.split(",");
if (fields.length == 2) {
users.put(fields[0], fields[1]);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private void saveUsers() {
try (PrintWriter writer = new PrintWriter(usersFile)) {
for (Map.Entry<String, String> entry : users.entrySet()) {
writer.println(entry.getKey() + "," + entry.getValue());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private boolean checkUser() {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
if (users.containsKey(username) && users.get(username).equals(password)) {
return true;
} else {
return false;
}
}
private boolean registerUser() {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
String confirmPassword = new String(confirmPasswordField.getPassword());
if (username.isEmpty() || password.isEmpty() || !password.equals(confirmPassword)) {
return false;
}
if (users.containsKey(username)) {
return false;
}
users.put(username, password);
saveUsers();
return true;
}
public static void main(String[] args) {
JFrame frame = new JFrame("Login/Register");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new LoginRegisterPanel(new File("users.txt")));
frame.pack();
frame.setVisible(true);
}
}
```
这是一个登陆注册界面的示例,用户信息保存在文件`users.txt`中,采用逗号分隔的用户名和密码格式。其中`loadUsers()`方法用于从文件中读取用户信息,`saveUsers()`方法用于将用户信息保存到文件中,`checkUser()`方法用于核对用户密码,`registerUser()`方法用于注册新用户。
接下来是四则运算的实现:
```java
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class MathQuizPanel extends JPanel {
private JLabel questionLabel;
private JTextField answerField;
private JButton submitButton;
private JLabel resultLabel;
private int num1;
private int num2;
private char operator;
private int answer;
private int correctCount;
private int questionCount;
public MathQuizPanel() {
setLayout(new BorderLayout());
JPanel inputPanel = new JPanel(new GridLayout(2, 2, 5, 5));
inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
inputPanel.add(new JLabel("Question:"));
inputPanel.add(questionLabel = new JLabel());
inputPanel.add(new JLabel("Answer:"));
inputPanel.add(answerField = new JTextField());
add(inputPanel, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 5, 5));
buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
buttonPanel.add(submitButton = new JButton("Submit"));
submitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
int userAnswer = Integer.parseInt(answerField.getText().trim());
if (userAnswer == answer) {
resultLabel.setText("Correct!");
correctCount++;
} else {
resultLabel.setText("Wrong! The answer is " + answer);
}
questionCount++;
generateQuestion();
} catch (NumberFormatException ex) {
resultLabel.setText("Please enter a number.");
}
}
});
buttonPanel.add(resultLabel = new JLabel(" "));
add(buttonPanel, BorderLayout.SOUTH);
generateQuestion();
}
private void generateQuestion() {
Random random = new Random();
num1 = random.nextInt(100);
num2 = random.nextInt(100);
operator = "+-*/".charAt(random.nextInt(4));
switch (operator) {
case '+':
answer = num1 + num2;
break;
case '-':
answer = num1 - num2;
break;
case '*':
answer = num1 * num2;
break;
case '/':
answer = num1 / num2;
break;
}
questionLabel.setText(String.format("%d %c %d = ", num1, operator, num2));
answerField.setText("");
resultLabel.setText(" ");
}
public void reset() {
correctCount = 0;
questionCount = 0;
generateQuestion();
}
public int getCorrectCount() {
return correctCount;
}
public int getQuestionCount() {
return questionCount;
}
public static void main(String[] args) {
JFrame frame = new JFrame("Math Quiz");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MathQuizPanel panel = new MathQuizPanel();
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
}
```
这是一个四则运算出题界面的示例,使用随机函数生成两个随机数和一个随机运算符,并计算出正确答案。用户输入答案后,程序自动判断对错,并计算答对的题目数量和总题数。`reset()`方法用于重新开始出题,`getCorrectCount()`和`getQuestionCount()`方法用于获取答对的题目数量和总题数。
最后是主程序的实现:
```java
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
public class MathQuizApp {
public static void main(String[] args) {
JFrame frame = new JFrame("Math Quiz");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
LoginRegisterPanel loginRegisterPanel = new LoginRegisterPanel(new File("users.txt"));
MathQuizPanel mathQuizPanel = new MathQuizPanel();
JButton startButton = new JButton("Start Quiz");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (loginRegisterPanel.checkUser()) {
loginRegisterPanel.setVisible(false);
mathQuizPanel.reset();
mathQuizPanel.setVisible(true);
} else {
JOptionPane.showMessageDialog(frame, "Invalid username or password!");
}
}
});
JButton backButton = new JButton("Back");
backButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
loginRegisterPanel.setVisible(true);
mathQuizPanel.setVisible(false);
}
});
JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 5, 5));
buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
buttonPanel.add(startButton);
buttonPanel.add(backButton);
JPanel contentPanel = new JPanel(new CardLayout());
contentPanel.add(loginRegisterPanel, "loginRegister");
contentPanel.add(mathQuizPanel, "mathQuiz");
frame.setContentPane(new JPanel(new BorderLayout()));
frame.getContentPane().add(contentPanel, BorderLayout.CENTER);
frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
}
```
这是一个整合登陆注册界面和四则运算出题界面的示例,使用`CardLayout`来切换不同的界面。用户登陆成功后进入四则运算出题界面,用户可以进行答题,答题完成后返回登陆注册界面。