JavaScript CLI版四子棋输入字符重复问题求助
问题:CLI四子棋程序输入字符重复(按下一次按键显示两次)
我开发了一个四子棋(Connect Four)程序,通过CLI接收用户输入放置棋子,但按下任意按键时,输入的字符会重复显示(例如按下"a"会显示"aa")。
相关代码片段:
let current_player = 1 ; let chosen_column; const answer = await new Promise(resolve => { io.question(`Player ${current_player}, enter a column to place a piece in: `, resolve) }); chosen_column = answer;
问题表现:输入时每个按键对应两次字符输出,影响正常输入体验。
解决方案
这种输入重复的问题,在Node.js的readline模块场景下,最常见的原因是readline.Interface实例被重复创建,或者输入流(process.stdin)被多个监听器同时捕获,导致输入内容被两次回显。
1. 确保readline实例全局唯一
检查代码中是否每次调用提问逻辑时都重新创建了readline.Interface实例(比如const io = readline.createInterface(...)被多次执行)。正确做法是在程序初始化时只创建一次实例,全局复用:
const readline = require('readline'); // 全局唯一的readline实例 const io = readline.createInterface({ input: process.stdin, output: process.stdout }); // 后续所有提问都复用这个io实例 async function askPlayerForColumn(currentPlayer) { return new Promise(resolve => { io.question(`Player ${currentPlayer}, enter a column to place a piece in: `, resolve); }); } // 使用示例 let current_player = 1; let chosen_column = await askPlayerForColumn(current_player);
2. 移除重复的输入流监听
如果代码中还有其他地方直接监听了process.stdin的data事件(比如process.stdin.on('data', ...)),这会和readline的监听冲突,导致输入被两次处理。移除多余的data事件监听即可解决问题。
3. 强制禁用终端默认echo(极端情况)
如果上述方法无效,可以尝试手动禁用终端的echo,让readline单独处理回显:
const { stdin } = process; // 禁用终端默认echo stdin.setRawMode(true); stdin.resume(); stdin.setEncoding('utf8'); // 创建readline实例 const io = readline.createInterface({ input: stdin, output: process.stdout }); // 程序退出时恢复终端设置 process.on('exit', () => { stdin.setRawMode(false); stdin.pause(); });
内容的提问来源于stack exchange,提问作者Moeez Tanveer
相关产品推荐
相关产品推荐

