美国州府配对答题Java程序防作弊漏洞技术咨询
搞定美国州府匹配程序的漏洞+计时器优化方案
嘿,我看你正在开发这个州府匹配测试程序,遇到了重复刷分的漏洞,还要加计时器对吧?这就给你整理一套完整的解决方案:
核心问题拆解
你现在的漏洞根源是没跟踪用户已经答对的州府对——不管同一组输入多少次都算分,自然能刷到满分。另外还要补上计时器,同时规范用户的输入格式,避免乱七八糟的输入搞崩程序。
具体优化步骤&代码实现
1. 换用合适的数据结构防刷分
别用数组存了,改用HashMap来存州和首府的映射,再用一个HashSet记录已经答对的州,这样同一个州只能拿一次分,彻底堵死刷分漏洞。
2. 加上计时器功能
用System.currentTimeMillis()记录考试开始和结束的时间戳,最后换算成秒显示,简单直接。
3. 输入格式校验
强制要求用户按「州 - 首府」的格式输入,先检查输入里有没有分隔符,拆分后再验证正确性,避免格式错误导致的异常。
完整优化后的代码
import java.util.*; public class StateCapitalExam { // 用HashMap存州-首府的映射,查找效率更高 private static final Map<String, String> STATE_CAPITAL_MAP = new HashMap<>(); // 用HashSet记录已经答对的州,防止重复计分 private static final Set<String> COMPLETED_STATES = new HashSet<>(); private static final int TOTAL_STATES = 50; // 初始化州府数据,这里示例几个,剩下的你自己补全就行 static { STATE_CAPITAL_MAP.put("alabama", "montgomery"); STATE_CAPITAL_MAP.put("alaska", "juneau"); STATE_CAPITAL_MAP.put("arizona", "phoenix"); STATE_CAPITAL_MAP.put("arkansas", "little rock"); STATE_CAPITAL_MAP.put("california", "sacramento"); // ... 继续添加其他45个州的映射 } public void startExam() { Scanner scanner = new Scanner(System.in); long startTime = System.currentTimeMillis(); int score = 0; System.out.println("欢迎参加美国州府匹配测试!请按照「州 - 首府」的格式输入(比如:alabama - montgomery)"); System.out.println("输入'exit'可以提前结束测试哦"); while (score < TOTAL_STATES) { System.out.print("请输入:"); String input = scanner.nextLine().trim().toLowerCase(); // 处理退出指令 if (input.equals("exit")) { break; } // 校验输入格式 if (!input.contains(" - ")) { System.out.println("格式不对哦!必须是「州 - 首府」的形式,中间要有空格加横杠加空格"); continue; } // 拆分输入的州和首府 String[] parts = input.split(" - ", 2); String state = parts[0].trim(); String capital = parts[1].trim(); // 检查这个州是不是已经答对过了 if (COMPLETED_STATES.contains(state)) { System.out.println("这个州你已经答对啦,换个新的试试!"); continue; } // 验证州府是否匹配 if (STATE_CAPITAL_MAP.containsKey(state) && STATE_CAPITAL_MAP.get(state).equals(capital)) { score++; COMPLETED_STATES.add(state); System.out.println("答对啦!当前得分:" + score + "/" + TOTAL_STATES); } else { System.out.println("不对哦,再想想看!"); } } // 计算用时并输出结果 long endTime = System.currentTimeMillis(); long totalTimeSeconds = (endTime - startTime) / 1000; System.out.println("\n测试结束!"); System.out.println("最终得分:" + score + "/" + TOTAL_STATES); System.out.println("总共用时:" + totalTimeSeconds + "秒"); scanner.close(); } public static void main(String[] args) { new StateCapitalExam().startExam(); } }
关键优化点说明
- 防刷分:
COMPLETED_STATES集合会记住所有已经答对的州,重复输入同一州直接跳过,再也刷不了分。 - 计时器:通过首尾时间戳的差值计算总用时,转换成秒数显示,用户体验更友好。
- 输入容错:先检查格式再处理,避免用户输入奇怪内容导致程序崩溃,同时提示更清晰。
- 数据结构升级:
HashMap的查找效率是O(1),比数组遍历快多了,后续维护州府数据也更方便。
额外小建议
- 可以加个提示功能:比如用户连续错3次同一州,就给出首府的首字母提示,提升测试体验。
- 州府数据可以放到外部CSV文件里,不用硬编码在代码里,以后要修改或者更新数据直接改文件就行。
- 可以加个倒计时模式,比如限时10分钟完成,增加测试的挑战性。
内容的提问来源于stack exchange,提问作者digitox _
相关产品推荐
相关产品推荐

