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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:15:55