diff --git a/.DS_Store b/.DS_Store index 613a81f..b9c248e 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/src/.DS_Store b/src/.DS_Store index 5008ddf..66b715a 100644 Binary files a/src/.DS_Store and b/src/.DS_Store differ diff --git a/src/Generator.java b/src/Generator.java index 50b26bd..a786087 100644 --- a/src/Generator.java +++ b/src/Generator.java @@ -1,166 +1,195 @@ -import java.util.*; +import java.util.Random; +import java.util.Set; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; import java.util.stream.Collectors; +/** + * 工具类:负责生成不同难度的数学题目。 + */ public class Generator { - private static final Random rand = new Random(); - static class QuestionGenerator { - private final Login.Level level; - private final Set existing; + private static final Random RAND = new Random(); + private static final int MAX_ATTEMPTS = 2000; - QuestionGenerator(Login.Level level, List existingQuestions) { - this.level = level; - this.existing = existingQuestions.stream().map(String::trim).collect(Collectors.toSet()); - } + /** + * 内部类:按用户难度等级生成题目。 + */ + static class QuestionGenerator { - List generatePaper(int n) { - Set generated = new LinkedHashSet<>(); - // 防止死循环 - int attempts = 0; - int maxAttempts = 2000; - - while (generated.size() < n && attempts < maxAttempts) { - attempts++; - String q = generateOneQuestion(); - // 统一去掉题号与多余空白来比对 - String key = normalize(q); - //与文件内+本次前面生成的查重 - if (!existing.contains(key) && !generated.contains(key)) { - generated.add(q); - } - } - if (generated.size() < n) { - System.out.println("注意:无法生成足够的不重复题目,已生成 " + generated.size() + " 道题(请求 " + n + " 道)"); - } - return new ArrayList<>(generated); - } - //去空格 - private String normalize(String s) { - return s.replaceAll("\\s+","").toLowerCase(); - } + private final Login.Level level; + private final Set existing; - // 生成单题主逻辑 - private String generateOneQuestion() { - int operands = rand.nextInt(5) + 1; // 保证 2..5 个操作数 - return switch (level) { - case PRIMARY -> genPrimary(operands); - case MIDDLE -> genMiddle(operands); - case HIGH -> genHigh(operands); - }; - } - // 生成小学题(只有 + - * / 和括号) - private String genPrimary(int operands) { - if (operands == 1) { - return String.valueOf(randInt(1,100)); - } - List ops = Arrays.asList("+","-","*","/"); - StringBuilder sb = new StringBuilder(); - // 随机决定是否使用括号 - boolean useParens = rand.nextBoolean(); - if (useParens && operands >= 3 && rand.nextBoolean()) { - // 构造 (a op b) op c ... - sb.append("("); - sb.append(randInt(1,100)).append(" ").append(randomChoice(ops)).append(" ").append(randInt(1,100)); - sb.append(")"); - for (int i=2;i existingQuestions) { + this.level = level; + this.existing = existingQuestions.stream().map(String::trim).collect(Collectors.toSet()); + } - // 生成初中题:至少包含一个 ^2 或 sqrt() - private String genMiddle(int operands) { - // 基本表达式生成,后插入平方或开根号 - String expr = genPrimary(operands); // 基本算术 - // 2选1 - if (rand.nextBoolean()) { - // 找一个数字位置并替换为 (x)^2 - expr = applySquare(expr); - } else { - expr = applySqrt(expr); - } - return expr; - } + /** + * 生成一份试卷。 + * + * @param n 需要生成的题目数量 + * @return 生成的题目列表 + */ + List generatePaper(int n) { + Set generated = new LinkedHashSet<>(); + // 防止死循环 + int attempts = 0; - // 生成高中题:至少包含 sin/cos/tan - private String genHigh(int operands) { - String expr = genPrimary(operands); - expr = applyTrig(expr); - return expr; + while (generated.size() < n && attempts < MAX_ATTEMPTS) { + attempts++; + String q = generateOneQuestion(); + // 统一去掉题号与多余空白来比对 + String key = normalize(q); + //与文件内+本次前面生成的查重 + if (!existing.contains(key) && !generated.contains(key)) { + generated.add(q); } + } - // 把表达式中某个数字替换为 (x)^2 - private String applySquare(String expr) { - // 寻找所有数字的片段 - List spans = findNumberSpans(expr); - if (spans.isEmpty()) { - return expr + "^2"; - } - int[] s = spans.get(rand.nextInt(spans.size())); - String before = expr.substring(0, s[0]); - String num = expr.substring(s[0], s[1]); - String after = expr.substring(s[1]); - return before + "(" + num + ")^2" + after; - } + if (generated.size() < n) { + System.out.println( + "注意:无法生成足够的不重复题目,已生成 " + + generated.size() + " 道题(请求 " + n + " 道)"); + } + return new ArrayList<>(generated); + } - // 把表达式中某个数字替换为 sqrt(x) - private String applySqrt(String expr) { - List spans = findNumberSpans(expr); - if (spans.isEmpty()) { - return "sqrt(" + expr + ")"; - } - int[] s = spans.get(rand.nextInt(spans.size())); - String before = expr.substring(0, s[0]); - String num = expr.substring(s[0], s[1]); - String after = expr.substring(s[1]); - return before + "sqrt(" + num + ")" + after; - } + //去空格 + private String normalize(String s) { + return s.replaceAll("\\s+", "").toLowerCase(); + } - // 把某个数字或子表达式替换为 sin(x)/cos(x)/tan(x) - private String applyTrig(String expr) { - List spans = findNumberSpans(expr); - String func = randomChoice(Arrays.asList("sin","cos","tan")); - if (spans.isEmpty()) { - return func + "(" + expr + ")"; - } - int[] s = spans.get(rand.nextInt(spans.size())); - String before = expr.substring(0, s[0]); - String num = expr.substring(s[0], s[1]); - String after = expr.substring(s[1]); - return before + func + "(" + num + ")" + after; - } + // 生成单题主逻辑 + private String generateOneQuestion() { + int operands = RAND.nextInt(5) + 1; // 保证 2..5 个操作数 + return switch (level) { + case PRIMARY -> genPrimary(operands); + case MIDDLE -> genMiddle(operands); + case HIGH -> genHigh(operands); + }; + } - // 找出数字位置 - private List findNumberSpans(String expr) { - List spans = new ArrayList<>(); - char[] chs = expr.toCharArray(); - int i = 0, n = chs.length; - while (i < n) { - if (Character.isDigit(chs[i])) { - int j = i; - while (j < n && (Character.isDigit(chs[j]) )) j++; - spans.add(new int[]{i, j}); - i = j; - } else { - i++; - } - } - return spans; + // 生成小学题(只有 + - * / 和括号) + private String genPrimary(int operands) { + if (operands == 1) { + return String.valueOf(randInt(1, 100)); + } + List ops = Arrays.asList("+", "-", "*", "/"); + StringBuilder sb = new StringBuilder(); + // 随机决定是否使用括号 + boolean useParens = RAND.nextBoolean(); + if (useParens && operands >= 3 && RAND.nextBoolean()) { + // 构造 (a op b) op c ... + sb.append("("); + sb.append(randInt(1, 100)).append(" ").append(randomChoice(ops)).append(" ") + .append(randInt(1, 100)); + sb.append(")"); + for (int i = 2; i < operands; i++) { + sb.append(" ").append(randomChoice(ops)).append(" ").append(randInt(1, 100)); } - //a..b随机数 - private int randInt(int a, int b) { - return rand.nextInt(b - a + 1) + a; + } else { + // 直连 + sb.append(randInt(1, 100)); + for (int i = 1; i < operands; i++) { + sb.append(" ").append(randomChoice(ops)).append(" ").append(randInt(1, 100)); } - //抽签功能 - private T randomChoice(List list) { - return list.get(rand.nextInt(list.size())); + } + return sb.toString(); + } + + // 生成初中题:至少包含一个 ^2 或 sqrt() + private String genMiddle(int operands) { + // 基本表达式生成,后插入平方或开根号 + String expr = genPrimary(operands); // 基本算术 + // 2选1 + if (RAND.nextBoolean()) { + // 找一个数字位置并替换为 (x)^2 + expr = applySquare(expr); + } else { + expr = applySqrt(expr); + } + return expr; + } + + // 生成高中题:至少包含 sin/cos/tan + private String genHigh(int operands) { + String expr = genPrimary(operands); + expr = applyTrig(expr); + return expr; + } + + // 把表达式中某个数字替换为 (x)^2 + private String applySquare(String expr) { + // 寻找所有数字的片段 + List spans = findNumberSpans(expr); + if (spans.isEmpty()) { + return expr + "^2"; + } + int[] s = spans.get(RAND.nextInt(spans.size())); + String before = expr.substring(0, s[0]); + String num = expr.substring(s[0], s[1]); + String after = expr.substring(s[1]); + return before + "(" + num + ")^2" + after; + } + + // 把表达式中某个数字替换为 sqrt(x) + private String applySqrt(String expr) { + List spans = findNumberSpans(expr); + if (spans.isEmpty()) { + return "sqrt(" + expr + ")"; + } + int[] s = spans.get(RAND.nextInt(spans.size())); + String before = expr.substring(0, s[0]); + String num = expr.substring(s[0], s[1]); + String after = expr.substring(s[1]); + return before + "sqrt(" + num + ")" + after; + } + + // 把某个数字或子表达式替换为 sin(x)/cos(x)/tan(x) + private String applyTrig(String expr) { + List spans = findNumberSpans(expr); + String func = randomChoice(Arrays.asList("sin", "cos", "tan")); + if (spans.isEmpty()) { + return func + "(" + expr + ")"; + } + int[] s = spans.get(RAND.nextInt(spans.size())); + String before = expr.substring(0, s[0]); + String num = expr.substring(s[0], s[1]); + String after = expr.substring(s[1]); + return before + func + "(" + num + ")" + after; + } + + // 找出数字位置 + private List findNumberSpans(String expr) { + List spans = new ArrayList<>(); + char[] chs = expr.toCharArray(); + int i = 0, n = chs.length; + while (i < n) { + if (Character.isDigit(chs[i])) { + int j = i; + while (j < n && (Character.isDigit(chs[j]))) { + j++; + } + spans.add(new int[]{i, j}); + i = j; + } else { + i++; } + } + return spans; + } + + //a..b随机数 + private int randInt(int a, int b) { + return RAND.nextInt(b - a + 1) + a; + } + + //抽签功能 + private T randomChoice(List list) { + return list.get(RAND.nextInt(list.size())); } + } } diff --git a/src/Main.java b/src/Main.java index 3fdfa19..3071822 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,67 +1,77 @@ import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.List; +import java.util.Scanner; public class Main { - private static final Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8); - public static void main(String[] args) { - System.out.println("=== 中小学数学卷子自动生成程序 ==="); - while (true) { - Login.Account user = Login.LoginLoop(); - if (user == null) continue; - Login.Level currentLevel = user.level; - System.out.println("当前选择为 " + LanguageSwitch.levelToChinese(currentLevel) + "出题"); - boolean loggedIn = true; - while (loggedIn) { - System.out.print("系统提示“准备生成 " + LanguageSwitch.levelToChinese(currentLevel) + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”\n> "); - String line = scanner.nextLine().trim(); - if (line.equals("-1")) { - System.out.println("退出当前用户,返回登录界面。"); - loggedIn = false; - break; - } - if (line.startsWith("切换为")) { - String target = line.substring("切换为".length()).trim(); - if (target.isEmpty()) { - System.out.println("请输入小学、初中和高中三个选项中的一个"); - continue; - } - Login.Level newLevel = LanguageSwitch.chineseToLevel(target); - if (newLevel == null) { - System.out.println("请输入小学、初中和高中三个选项中的一个"); - } else { - currentLevel = newLevel; - System.out.println("切换成功。当前选择为 " + LanguageSwitch.levelToChinese(currentLevel) + "出题"); - } - continue; - } - int n; - try { - n = Integer.parseInt(line); - } catch (NumberFormatException e) { - System.out.println("请输入有效的整数(10-30,或-1退出)或 '切换为 XX'。"); - continue; - } - if (n == -1) { - System.out.println("退出当前用户,返回登录界面。"); - loggedIn = false; - break; - } - if (n < 10 || n > 30) { - System.out.println("题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录)。"); - continue; - } - // 生成题目 - List existing = LoadFile.loadExistingQuestions(user.username); - Generator.QuestionGenerator qg = new Generator.QuestionGenerator(currentLevel, existing); - List paper = qg.generatePaper(n); - if (paper.isEmpty()) { - System.out.println("未能生成题目(可能因去重约束导致)。"); - } else { - // 保存文件 - String savedPath = Save.savePaper(user.username, paper); - System.out.println("已生成 " + paper.size() + " 道题,保存为: " + savedPath); - } - } + + /** + * 主程序:中小学数学卷子自动生成器。 + */ + private static final Scanner SCANNER = new Scanner(System.in, StandardCharsets.UTF_8); + + public static void main(String[] args) { + System.out.println("=== 中小学数学卷子自动生成程序 ==="); + while (true) { + Login.Account user = Login.loginLoop(); + if (user == null) { + continue; + } + Login.Level currentLevel = user.level; + System.out.println("当前选择为 " + LanguageSwitch.levelToChinese(currentLevel) + "出题"); + boolean loggedIn = true; + while (loggedIn) { + System.out.print("系统提示“准备生成 " + LanguageSwitch.levelToChinese(currentLevel) + + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”\n> "); + String line = SCANNER.nextLine().trim(); + if (line.equals("-1")) { + System.out.println("退出当前用户,返回登录界面。"); + loggedIn = false; + break; + } + if (line.startsWith("切换为")) { + String target = line.substring("切换为".length()).trim(); + if (target.isEmpty()) { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + continue; + } + Login.Level newLevel = LanguageSwitch.chineseToLevel(target); + if (newLevel == null) { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } else { + currentLevel = newLevel; + System.out.println( + "切换成功。当前选择为 " + LanguageSwitch.levelToChinese(currentLevel) + "出题"); + } + continue; + } + int n; + try { + n = Integer.parseInt(line); + } catch (NumberFormatException e) { + System.out.println("请输入有效的整数(10-30,或-1退出)或 '切换为 XX'。"); + continue; + } + if (n == -1) { + System.out.println("退出当前用户,返回登录界面。"); + loggedIn = false; + break; + } + if (n < 10 || n > 30) { + System.out.println("题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录)。"); + continue; + } + // 生成题目 + List existing = LoadFile.loadExistingQuestions(user.username); + Generator.QuestionGenerator qg = new Generator.QuestionGenerator(currentLevel, existing); + List paper = qg.generatePaper(n); + if (paper.isEmpty()) { + System.out.println("未能生成题目(可能因去重约束导致)。"); + } else { + // 保存文件 + String savedPath = Save.savePaper(user.username, paper); + System.out.println("已生成 " + paper.size() + " 道题,保存为: " + savedPath); } + } } + } } \ No newline at end of file diff --git a/src/Save.java b/src/Save.java index d1d4c25..bc100a9 100644 --- a/src/Save.java +++ b/src/Save.java @@ -1,34 +1,53 @@ -import java.io.*; -import java.nio.file.*; -import java.util.*; +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.Files; +import java.util.List; +import java.util.Date; import java.text.SimpleDateFormat; import java.nio.charset.StandardCharsets; + +/** + * 工具类:负责保存生成的试卷到用户目录。 + */ + public class Save { - // 保存试卷,返回保存路径字符串 - public static String savePaper(String username, List paper) { - Path userDir = Paths.get("data", username); - //识别文件夹 - try { - if (!Files.exists(userDir)) Files.createDirectories(userDir); - } catch (IOException e) { - System.out.println("无法创建用户文件夹:" + e.getMessage()); - return "保存失败"; - } - String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()); - Path file = userDir.resolve(timestamp + ".txt"); - try (BufferedWriter bw = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) { - for (int i = 0; i < paper.size(); i++) { - bw.write((i+1) + ". " + paper.get(i)); - //换行 - bw.newLine(); - //空一行 - bw.newLine(); - } - } catch (IOException e) { - System.out.println("保存文件失败:" + e.getMessage()); - return "保存失败"; - } - //返回文件位置 - return file.toString(); + + /** + * 保存试卷,并返回保存的文件路径。 + * + * @param username 用户名 + * @param paper 试卷内容 + * @return 保存文件的路径字符串,若失败返回 "保存失败" + */ + // 保存试卷,返回保存路径字符串 + public static String savePaper(String username, List paper) { + Path userDir = Paths.get("data", username); + //识别文件夹 + try { + if (!Files.exists(userDir)) { + Files.createDirectories(userDir); + } + } catch (IOException e) { + System.err.println("无法创建用户文件夹:" + e.getMessage()); + return "保存失败"; } + String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()); + Path file = userDir.resolve(timestamp + ".txt"); + try (BufferedWriter bw = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) { + for (int i = 0; i < paper.size(); i++) { + bw.write((i + 1) + ". " + paper.get(i)); + //换行 + bw.newLine(); + //空一行 + bw.newLine(); + } + } catch (IOException e) { + System.err.println("保存文件失败:" + e.getMessage()); + return "保存失败"; + } + //返回文件位置 + return file.toString(); + } } diff --git a/src/languageSwitch.java b/src/languageSwitch.java index fcd84be..d793c4d 100644 --- a/src/languageSwitch.java +++ b/src/languageSwitch.java @@ -1,21 +1,23 @@ public class LanguageSwitch { - //等级转中文输出 - public static String levelToChinese(Login.Level l) { - return switch (l) { - case PRIMARY -> "小学"; - case MIDDLE -> "初中"; - case HIGH -> "高中"; - //default -> "未知"; - }; - } - //等级中文输入转level - public static Login.Level chineseToLevel(String s) { - s = s.trim();//去除前后空格 - return switch (s) { - case "小学" -> Login.Level.PRIMARY; - case "初中" -> Login.Level.MIDDLE; - case "高中" -> Login.Level.HIGH; - default -> null; - }; - } + + //等级转中文输出 + public static String levelToChinese(Login.Level l) { + return switch (l) { + case PRIMARY -> "小学"; + case MIDDLE -> "初中"; + case HIGH -> "高中"; + //default -> "未知"; + }; + } + + //等级中文输入转level + public static Login.Level chineseToLevel(String s) { + s = s.trim();//去除前后空格 + return switch (s) { + case "小学" -> Login.Level.PRIMARY; + case "初中" -> Login.Level.MIDDLE; + case "高中" -> Login.Level.HIGH; + default -> null; + }; + } } diff --git a/src/loadFile.java b/src/loadFile.java index 600245e..7e44bb3 100644 --- a/src/loadFile.java +++ b/src/loadFile.java @@ -1,49 +1,68 @@ import java.nio.charset.StandardCharsets; -import java.io.*; -import java.nio.file.*; -import java.util.*; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.Files; +import java.nio.file.DirectoryStream; +import java.util.List; +import java.util.ArrayList; import java.util.stream.Collectors; + public class LoadFile { - // 读取该用户文件夹下已有题目的所有题目文本 - public static List loadExistingQuestions(String username) { - List all = new ArrayList<>(); - Path userDir = Paths.get("data", username); - if (!Files.exists(userDir)) return all; - try { - DirectoryStream ds = Files.newDirectoryStream(userDir, "*.txt"); - for (Path p : ds) { - List lines = Files.readAllLines(p, StandardCharsets.UTF_8); - // 将文件中按题号拆分题目 - StringBuilder cur = new StringBuilder(); - for (String line : lines) { - //识别题号 - if (line.matches("^\\s*\\d+\\..*")) { - // 新题开始 保存旧题 - if (!cur.isEmpty()) { - all.add(cur.toString().trim()); - } - cur.setLength(0); - //去题号 - cur.append(line.replaceFirst("^\\s*\\d+\\.", "").trim()); - } else { - // 继续当前题(空行也可能出现) - if (line.trim().isEmpty()) { - if (!cur.isEmpty()) { - all.add(cur.toString().trim()); - cur.setLength(0); - } - } else { - if (!cur.isEmpty()) cur.append(" "); - cur.append(line.trim()); - } - } - } - if (!cur.isEmpty()) all.add(cur.toString().trim()); + + /** + * 读取该用户文件夹下已有题目的所有题目文本。 + * + * @param username 用户名 + * @return 已存在的所有题目列表 + */ + // 读取该用户文件夹下已有题目的所有题目文本 + public static List loadExistingQuestions(String username) { + List all = new ArrayList<>(); + Path userDir = Paths.get("data", username); + if (!Files.exists(userDir)) { + return all; + } + try { + DirectoryStream ds = Files.newDirectoryStream(userDir, "*.txt"); + for (Path p : ds) { + List lines = Files.readAllLines(p, StandardCharsets.UTF_8); + // 将文件中按题号拆分题目 + StringBuilder cur = new StringBuilder(); + for (String line : lines) { + //识别题号 + if (line.matches("^\\s*\\d+\\..*")) { + // 新题开始 保存旧题 + if (!cur.isEmpty()) { + all.add(cur.toString().trim()); } - } catch (IOException e) { - // ignore, return what we have + cur.setLength(0); + //去题号 + cur.append(line.replaceFirst("^\\s*\\d+\\.", "").trim()); + } else { + // 继续当前题(空行也可能出现) + if (line.trim().isEmpty()) { + if (!cur.isEmpty()) { + all.add(cur.toString().trim()); + cur.setLength(0); + } + } else { + if (!cur.isEmpty()) { + cur.append(" "); + } + cur.append(line.trim()); + } + } + } + if (!cur.isEmpty()) { + all.add(cur.toString().trim()); } - // 转链式 去空格 去空字符串 去重 转回list - return all.stream().map(String::trim).filter(s->!s.isEmpty()).distinct().collect(Collectors.toList()); - } + } + } catch (IOException e) { + System.err.println("读取题目文件失败:" + e.getMessage()); + } + // 转链式 去空格 去空字符串 去重 转回list + return all.stream().map(String::trim).filter(s -> !s.isEmpty()).distinct() + .collect(Collectors.toList()); + } } diff --git a/src/login.java b/src/login.java index e58b18f..78a20b4 100644 --- a/src/login.java +++ b/src/login.java @@ -4,56 +4,62 @@ import java.util.Map; import java.util.Scanner; public class Login { - public static class Account { - String username;//用户名 - String password;//密码 - Level level;//出题等级 - Account(String u, String p, Level l) { - username = u; - password = p; - level = l; - } - } - enum Level { PRIMARY, MIDDLE, HIGH } - - private static final Map accounts = new HashMap<>(); - private static final Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8); - - // 初始化预设账号 - // 初始Map索引 - static { - // 小学 张三1..3 - accounts.put("张三1", new Account("张三1","123", Level.PRIMARY)); - accounts.put("张三2", new Account("张三2","123", Level.PRIMARY)); - accounts.put("张三3", new Account("张三3","123", Level.PRIMARY)); - // 初中 李四1..3 - accounts.put("李四1", new Account("李四1","123", Level.MIDDLE)); - accounts.put("李四2", new Account("李四2","123", Level.MIDDLE)); - accounts.put("李四3", new Account("李四3","123", Level.MIDDLE)); - // 高中 王五1..3 - accounts.put("王五1", new Account("王五1","123", Level.HIGH)); - accounts.put("王五2", new Account("王五2","123", Level.HIGH)); - accounts.put("王五3", new Account("王五3","123", Level.HIGH)); + + public static class Account { + + String username;//用户名 + String password;//密码 + Level level;//出题等级 + + Account(String u, String p, Level l) { + username = u; + password = p; + level = l; } - public static Account LoginLoop() { - while (true) { - System.out.print("请输入用户名和密码,两者之间用空格隔开:\n> "); - String line = scanner.nextLine().trim();//行输入; - String[] parts = line.split("\\s+");//拆分输入的账号密码,拆分标志为空格; - //正常情况下parts.length=2; - if (parts.length != 2) { - System.out.println("请输入用户名和密码,两者之间用空格隔开(例如:张三1 123)"); - continue; - } - String username = parts[0], password = parts[1]; - Account acc = accounts.get(username); - - if (acc != null && acc.password.equals(password)) { - System.out.println("登录成功。当前选择为 " + LanguageSwitch.levelToChinese(acc.level) + "出题"); - return acc; - } else { - System.out.println("请输入正确的用户名、密码"); - } - } + } + + enum Level {PRIMARY, MIDDLE, HIGH} + + private static final Map accounts = new HashMap<>(); + private static final Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8); + + // 初始化预设账号 + // 初始Map索引 + static { + // 小学 张三1..3 + accounts.put("张三1", new Account("张三1", "123", Level.PRIMARY)); + accounts.put("张三2", new Account("张三2", "123", Level.PRIMARY)); + accounts.put("张三3", new Account("张三3", "123", Level.PRIMARY)); + // 初中 李四1..3 + accounts.put("李四1", new Account("李四1", "123", Level.MIDDLE)); + accounts.put("李四2", new Account("李四2", "123", Level.MIDDLE)); + accounts.put("李四3", new Account("李四3", "123", Level.MIDDLE)); + // 高中 王五1..3 + accounts.put("王五1", new Account("王五1", "123", Level.HIGH)); + accounts.put("王五2", new Account("王五2", "123", Level.HIGH)); + accounts.put("王五3", new Account("王五3", "123", Level.HIGH)); + } + + public static Account loginLoop() { + while (true) { + System.out.print("请输入用户名和密码,两者之间用空格隔开:\n> "); + String line = scanner.nextLine().trim();//行输入; + String[] parts = line.split("\\s+");//拆分输入的账号密码,拆分标志为空格; + //正常情况下parts.length=2; + if (parts.length != 2) { + System.out.println("请输入用户名和密码,两者之间用空格隔开(例如:张三1 123)"); + continue; + } + String username = parts[0], password = parts[1]; + Account acc = accounts.get(username); + + if (acc != null && acc.password.equals(password)) { + System.out.println( + "登录成功。当前选择为 " + LanguageSwitch.levelToChinese(acc.level) + "出题"); + return acc; + } else { + System.out.println("请输入正确的用户名、密码"); + } } + } }