基于Node.js的TypeScript猜数字游戏交互问题排查
TypeScript终端猜数字游戏问题修复
问题根源
- 循环条件完全错误:初始
guessCount是10,while(guessCount > 10)永远不成立,循环根本没执行 - 错误关闭输入接口:每次猜不对就调用
readLineInterface.close(),直接终止了输入通道,自然没法继续接收下一次猜测 - 单次提问逻辑:只调用了一次
question方法,没实现重复提问的逻辑——readline是异步的,同步while循环根本等不到用户输入
修复后的代码
const readline = require('readline'); // 剩余尝试次数 let guessCount = 10; // 生成1-100的随机数 const randomNumber = Math.floor(Math.random() * 100) + 1; console.log(randomNumber); // 调试用,正式发布可删掉 console.log("Can you guess my number?"); const readLineInterface = readline.createInterface({ input: process.stdin, output: process.stdout }); // 递归实现重复提问 function askGuess() { // 次数用完直接结束游戏 if (guessCount <= 0) { console.log(`Game over! The number was ${randomNumber}`); readLineInterface.close(); return; } readLineInterface.question(`Between 1 - 100 (${guessCount} attempts left): `, (status: string) => { const guess = Number(status); // 校验输入合法性 if (isNaN(guess) || guess < 1 || guess > 100) { console.log("Please enter a valid number between 1 and 100!\n"); askGuess(); return; } if (guess === randomNumber) { console.log("You win!"); readLineInterface.close(); process.exit(0); } else if (guess < randomNumber) { guessCount -= 1; console.log("Too small! Try again.\n"); askGuess(); } else { guessCount -= 1; console.log("Too big! Try again.\n"); askGuess(); } }); } // 启动第一次提问 askGuess();
修复要点
- 用递归函数
askGuess()适配readline的异步特性,实现重复提问 - 修正结束条件:判断剩余次数是否大于0,次数耗尽直接结束游戏
- 移除错误的
close()调用,只在胜利或游戏结束时关闭输入接口 - 增加输入合法性校验,避免用户输入无效内容导致逻辑异常
内容的提问来源于stack exchange,提问作者RedHood
相关产品推荐
相关产品推荐

