You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

美国州府配对答题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 _

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:06:54