我想在屏幕的中心写一个'*',而不是每100毫秒可以随机移动到左,上,下。如果'''在行的末尾,它必须在开始时该行,如果它在列的末尾,它必须在该列的开头(并且它们的反向scenerio是有效的。)我写了那个代码,但问题是我无法删除旧的运动(所以有'*'代表每一个动作)我解决了它将'_'放到它的旧动作上。还有其他任何解决办法在屏幕上只做一个'*'吗?如果'*'在行的末尾,我也无法删除旧的移动。这里是源代码:
private static void MovementOfStar()
{
int row = 40, col = 12;
Console.CursorVisible = false;
Console.SetCursorPosition(row, col);
int direction = 0;
Random r = new Random();
for (int i = 0; i < 1000; i++) // count of movement
{
Console.Write("*");
System.Threading.Thread.Sleep(100);
Console.Write('\b');
Console.Write("_");
direction = r.Next(5);
while (direction== 0)
direction = r.Next(5);
switch (direction)
{
case 1:
if (row + 1 >= 80)
row = 0;
Console.SetCursorPosition(row++, col);
break;
case 2:
if (row - 1 <= 0)
row=79;
Console.SetCursorPosition(row--, col);
break;
case 3:
if (col + 1 >= 25)
col = 0;
Console.SetCursorPosition(row, col++);
break;
case 4:
if (col - 1 <= 0)
col = 24;
Console.SetCursorPosition(row, col--);
break;
}
}
答案 0 :(得分:2)
不是使用退格和用_覆盖,为什么不重新定位光标:
Console.SetCursorPosition(col, row);
Console.Write("*");
Thread.Sleep(100);
// Wipe out the previous star
Console.SetCursorPosition(col, row);
Console.Write(" ");
(请注意,我在此处调换了col
和row
- 您的列和行似乎有错误的方式。)
我还建议您不要在方法调用中使用复合赋值运算符(row++
等) - 这样就很难弄清楚正在发生的事情。我会改变你的代码来使用像:
row--;
if (row < 0)
{
row = 24;
}
在您的案例陈述中 - 然后在打印*之前单调用Console.SetCursorPosition
。
答案 1 :(得分:2)
在更新row和col之前,将光标位置设置为旧行和col并写入空格。
顺便说一下,为什么不生成0到3之间的随机数,而不是从0到4生成一个0到4的随机数,而不是生成一个0到3的随机数?你可以说“case 0” - 零和1一样好。或者如果你真的沉迷于1到4,将随机数生成更改为“next(4)+1”。
答案 2 :(得分:1)
您可以调用Console.Clear()来清除(整个)控制台屏幕。
答案 3 :(得分:1)
而不是:
Console.Write('\b');
Console.Write("_");
为什么没有:
Console.SetCursorPosition(row, col);
Console.Write("_");
即。你已经知道如何直接将光标定位在想要写字符的位置。
答案 4 :(得分:0)
写一个空格 - “”而不是“_”