Java贪吃蛇游戏如何为StdIn.readString()设置200ms输入超时
解决方案
你遇到的阻塞问题根源是StdIn.readString()为同步阻塞方法,调用后当前线程会暂停执行,直到接收到用户输入才会继续向下运行,因此单线程下无法直接实现超时跳过的逻辑。
推荐实现方案:多线程分离输入监听与游戏逻辑
把输入读取和游戏主逻辑拆到两个独立线程运行:
- 子线程全程后台监听用户输入,仅更新全局的方向变量,不参与游戏逻辑运行
- 主线程按固定200ms间隔执行移动逻辑,直接读取最新的方向变量即可,完全不会被输入阻塞
代码实现示例
首先定义全局共享的方向变量,程序启动时就启动输入监听线程:
// 全局共享的最新方向变量,必须加volatile保证线程可见性 private static volatile char currentDir = 'd'; // 初始默认向右移动 // 程序启动时执行一次即可,不要重复调用 public static void initInputListener() { new Thread(() -> { while (true) { if (StdIn.hasNextChar()) { char input = StdIn.readChar(); // 只更新合法输入 if (input == 'w' || input == 's' || input == 'a' || input == 'd') { currentDir = input; } else { System.out.println("invalid input"); } } } }).start(); }
修改你的play函数代码,删除原有阻塞读输入的逻辑,直接使用全局方向变量:
// 每次移动前等待200ms,控制游戏速度 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } // 直接用currentDir处理移动逻辑即可,无需等待输入 play(x, y, currentDir, snakeParts, food);
注意事项
- 输入监听线程仅需在程序启动时调用1次,不要在递归的
play函数中重复创建线程 - 递归实现游戏逻辑存在栈溢出风险:如果游戏运行时间过长,递归调用层级过深会触发栈内存溢出,建议改为while循环实现的主循环逻辑
内容的提问来源于stack exchange,提问作者Amit Danino
相关产品推荐
相关产品推荐

