基于while循环与条件判断的方向键输入迭代问题及代码修正需求
代码修复与功能实现
问题根源
- 仅响应首次按键:你在循环外只读取了一次按键到
input变量,循环内始终用这个初始值判断,根本没获取后续按键;而且while条件里的Console.ReadKey()会额外吃掉一次输入,导致逻辑混乱。 - 缺少坐标判断的循环控制:原代码没把
p1.X ==5 && p1.Y ==2作为循环终止条件。
修复后的代码
Point p1 = new Point(5, 2); ConsoleKeyInfo input; // 循环条件:未回到初始坐标(5,2) 且 未按下Esc键 while ((p1.X != 5 || p1.Y != 2) || input.Key != ConsoleKey.Escape) { input = Console.ReadKey(true); // true参数避免按键在控制台显示 if (input.Key == ConsoleKey.UpArrow) { p1.Y++; Console.WriteLine($"当前坐标:X={p1.X}, Y={p1.Y}"); } else if (input.Key == ConsoleKey.DownArrow) { p1.Y--; Console.WriteLine($"当前坐标:X={p1.X}, Y={p1.Y}"); } else if (input.Key == ConsoleKey.LeftArrow) { p1.X--; Console.WriteLine($"当前坐标:X={p1.X}, Y={p1.Y}"); } else if (input.Key == ConsoleKey.RightArrow) { p1.X++; Console.WriteLine($"当前坐标:X={p1.X}, Y={p1.Y}"); } // 按下Esc直接退出循环 else if (input.Key == ConsoleKey.Escape) { break; } } Console.WriteLine("循环结束:回到初始坐标或按下了Esc键");
关键修改点
- 实时获取按键:把
input = Console.ReadKey(true)移到循环内部,每次迭代都读取最新的按键输入,true参数可以避免按键字符直接显示在控制台,让输出更整洁。 - 循环控制逻辑:修改循环条件为
(p1.X != 5 || p1.Y != 2) || input.Key != ConsoleKey.Escape,同时支持两种终止方式:回到(5,2)坐标,或者主动按下Esc键。 - 优化输出:每次更新坐标后输出完整的X、Y值,方便直观查看当前位置。
内容的提问来源于stack exchange,提问作者Nick Gatsfield
相关产品推荐
相关产品推荐

