在Ubuntu系统中如何使用C#彻底清除控制台历史内容而非滚动刷新
问题原因
Console.Clear()默认仅清空控制台当前可视区域的内容,已经写入滚动缓冲区的历史内容不会被删除,用户滚动滚动条就能看到旧内容。你每次按键产生的输出如果超过窗口高度,就会自动写入缓冲区,触发滚动。
解决方案1:固定控制台大小,禁用滚动缓冲区(最适配你的场景)
你当前代码的坐标范围是x∈[0,19]、y∈[0,9],直接在Main方法最开头添加以下代码,将控制台窗口和缓冲区大小固定为刚好适配你的坐标范围,缓冲区不会有多余空间存储历史内容,自然就不会出现滚动残留的问题:
static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Red; // 新增以下两行固定窗口和缓冲区大小 Console.SetWindowSize(20, 10); Console.SetBufferSize(20, 10); Point position = new Point{x = 10, y = 5}; // 剩余原有逻辑保持不变 }
解决方案2:完全清空滚动缓冲区
如果你需要保留控制台大小调整能力,每次清屏时用以下代码替换原有的Console.Clear(),就能彻底删除所有缓冲区历史内容:
if(console_key.Key == ConsoleKey.Spacebar){ // 替换原有Console.Clear() Console.Clear(); // 用空格填充整个缓冲区覆盖所有旧内容 for (int i = 0; i < Console.BufferHeight; i++) { Console.WriteLine(new string(' ', Console.BufferWidth)); } Console.Clear(); Console.SetCursorPosition(position.x, position.y); Console.WriteLine("█"); }
额外优化建议
你当前的逻辑仅在按空格键时重绘标记,如果你需要实现方向键移动时标记实时跟随,不需要每次都调用清屏方法,只需要在修改坐标前擦除旧位置的标记即可,性能更好也不会产生多余滚动内容:
do { Console.SetCursorPosition(position.x, position.y); System.ConsoleKeyInfo console_key = Console.ReadKey(true); // 先擦除旧位置的标记 Console.SetCursorPosition(position.x, position.y); Console.Write(' '); // 原有坐标判断逻辑保持不变 if(console_key.Key == ConsoleKey.DownArrow && position.y >= 0 && position.y <= 9){ position.y += 1; } if(console_key.Key == ConsoleKey.UpArrow && position.y <= 10 && position.y >= 2){ position.y -= 1; } if(console_key.Key == ConsoleKey.LeftArrow && position.x <= 19 && position.x >= 1){ position.x -= 1; } if(console_key.Key == ConsoleKey.RightArrow && position.x >= 0 && position.x <= 18){ position.x += 1; } // 重绘新位置标记 Console.SetCursorPosition(position.x, position.y); Console.Write("█"); } while (true);
内容的提问来源于stack exchange,提问作者Thrackerzod
相关产品推荐
相关产品推荐

