如何让C#控制台程序持续响应按键直到按下Esc退出?
解决C#控制台菜单按键响应与退出问题
问题根源分析
- MenuOptions方法仅执行单次按键检测就结束,缺少循环维持运行逻辑,导致后续按键无响应
- Start方法未添加Esc键监听与退出条件,无法通过Esc返回菜单或退出程序
具体修改方案
1. 让MenuOptions持续响应按键直到Esc退出
给MenuOptions方法添加循环逻辑,每次处理完按键操作后回到菜单检测状态,直到按下Esc才终止程序。
2. 在Start方法中加入Esc退出逻辑
在游戏运行循环内加入按键检测,一旦捕获到Esc键,就跳出游戏循环返回菜单。
完整示例代码
using System; class Keyboard_Menu_Demo { static void Main(string[] args) { Menu.MenuOptions(); } } class Menu { public static void MenuOptions() { bool keepRunning = true; while (keepRunning) { Console.Clear(); Console.WriteLine("=== 井字棋菜单 ==="); Console.WriteLine("1. 开始游戏"); Console.WriteLine("2. 查看规则"); Console.WriteLine("Esc. 退出程序"); Console.WriteLine("\n请按对应按键选择"); ConsoleKeyInfo pressedKey = Console.ReadKey(true); switch (pressedKey.Key) { case ConsoleKey.D1: Game.Start(); break; case ConsoleKey.D2: ShowGameRules(); break; case ConsoleKey.Escape: keepRunning = false; Console.WriteLine("程序已退出"); break; default: Console.WriteLine("\n无效按键,请重新选择"); Console.ReadKey(true); break; } } } private static void ShowGameRules() { Console.Clear(); Console.WriteLine("=== 井字棋规则 ==="); Console.WriteLine("1. 两名玩家轮流在3x3棋盘放置X和O"); Console.WriteLine("2. 先连成一线(横、竖、斜)的玩家获胜"); Console.WriteLine("\n按任意键返回菜单"); Console.ReadKey(true); } } class Game { public static void Start() { bool isPlaying = true; while (isPlaying) { Console.Clear(); Console.WriteLine("=== 井字棋游戏中 ==="); Console.WriteLine("当前棋盘:"); Console.WriteLine(" | | "); Console.WriteLine("---+---+---"); Console.WriteLine(" | | "); Console.WriteLine("---+---+---"); Console.WriteLine(" | | "); Console.WriteLine("\n按Esc返回菜单,其他键模拟下棋"); ConsoleKeyInfo gameKey = Console.ReadKey(true); if (gameKey.Key == ConsoleKey.Escape) { isPlaying = false; } else { Console.WriteLine("\n已完成一步操作,按任意键继续..."); Console.ReadKey(true); } } } }
关键修改说明
- MenuOptions方法通过
while (keepRunning)循环持续运行,仅在按下Esc时终止循环退出程序 - Start方法用
while (isPlaying)维持游戏运行,检测到Esc键就终止循环返回菜单 - 使用
Console.ReadKey(true)避免按键字符显示在控制台,优化交互体验 - 无效按键后添加等待确认逻辑,避免菜单内容一闪而过
内容的提问来源于stack exchange,提问作者SuneaterCreature
相关产品推荐
相关产品推荐

