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
相关产品推荐
相关产品推荐

