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

Java计时器故障排查:网络回合制游戏计数器卡在1

搞定回合计时器卡在1的问题

先明确你的核心需求,避免逻辑走偏:

  • 回合计时器从10开始倒计时,归0时自动切换到其他玩家回合
  • 玩家在计时结束前操作(触发BOX1/BOX2指令),计时器立刻重置为10重新开始

现在看你给出的代码片段,问题根源很清晰:

1. 计数器逻辑完全搞反了

你写的是counter++(每次定时任务执行就加1),但你需要的是倒计时(从10往下减到0),这直接导致逻辑方向错误。

2. 指令触发的重置逻辑写错了

当收到BOX1指令时,你写了counter=0; counter++;——这相当于直接把counter设成了1,完全没有重置回10,这就是计数器卡在1的直接原因!

修正后的完整代码示例

// 初始化计数器为10,对应初始的10秒倒计时
int counter = 10;
// 假设second是定时任务的间隔(比如1秒,即每秒执行一次)
int second = 1;

timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        // 核心改动:改成倒计时,每次执行减1
        counter--;
        
        // 检查是否倒计时结束
        if (counter == 0) {
            System.out.println("Times Up");
            TimeOut(); // 触发回合切换的逻辑
            // 切换回合后,重置计数器为10,准备下一轮计时
            counter = 10;
        }
        
        // 处理玩家操作:只要触发BOX1/BOX2,就把计时器重置为10
        if (command.startsWith("BOX1") || command.startsWith("BOX2")) {
            counter = 10;
            System.out.println("Timer reset to 10 - player took action");
        }
    }
}, 0, second * 1000); // 0延迟启动,每隔second秒执行一次任务

额外要注意的细节

  • 线程安全:如果command是由玩家输入线程更新的,一定要确保对它的访问是线程安全的——比如用volatile修饰command变量,或者加锁,避免定时任务读取到错误的指令内容。
  • Timer的可靠性:Java的Timer如果遇到未捕获的异常,会导致整个定时任务线程停止。如果你的游戏需要更稳定的定时逻辑,可以考虑用ScheduledExecutorService来替代Timer。
  • 边界控制:在TimeOut()方法里,记得要锁定当前玩家的操作权限,避免计时结束后玩家还能触发计时器重置,导致逻辑混乱。

内容的提问来源于stack exchange,提问作者Rommel Yohanes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:15:40