C# 星星在屏幕上的随机运动
我想在屏幕中央写一个“*”,然后它可以每100毫秒随机移动到右、左、上或下。如果“*”在行的末尾,它必须在该行的开头,如果它在列的末尾,它必须在该列的开头(而且它们的反向场景也是有效的).我写了这段代码,但问题是我不能删除旧的乐章(所以每个乐章都有“*”),我解决了它,把“u”放在它的旧乐章上。有没有其他解决方案在屏幕上只做一个“*”?如果“*”在行的末尾,我也不能删除旧的移动。下面是源代码:C# 星星在屏幕上的随机运动,c#,C#,我想在屏幕中央写一个“*”,然后它可以每100毫秒随机移动到右、左、上或下。如果“*”在行的末尾,它必须在该行的开头,如果它在列的末尾,它必须在该列的开头(而且它们的反向场景也是有效的).我写了这段代码,但问题是我不能删除旧的乐章(所以每个乐章都有“*”),我解决了它,把“u”放在它的旧乐章上。有没有其他解决方案在屏幕上只做一个“*”?如果“*”在行的末尾,我也不能删除旧的移动。下面是源代码: private static void MovementOfStar() {
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;
}
}
private static void MovementOfStar()
{
整行=40,列=12;
Console.CursorVisible=false;
控制台。设置光标位置(行、列);
int方向=0;
随机r=新随机();
对于(int i=0;i<1000;i++)//移动计数
{
控制台。写(“*”);
系统线程线程睡眠(100);
Console.Write('\b');
控制台。写(“”);
方向=右下(5);
而(方向==0)
方向=右下(5);
开关(方向)
{
案例1:
如果(第1行>=80)
行=0;
Console.SetCursorPosition(行++,列);
打破
案例2:
如果(第1行=25)
col=0;
Console.SetCursorPosition(行、列++);
打破
案例4:
如果(col-1您可以调用Console.Clear()来清除(整个)控制台屏幕。您可以调用Console.Clear()来清除(整个)控制台屏幕。与其使用退格键并用u覆盖,不如重新定位光标:
Console.SetCursorPosition(col, row);
Console.Write("*");
Thread.Sleep(100);
// Wipe out the previous star
Console.SetCursorPosition(col, row);
Console.Write(" ");
(请注意,我在这里转置了列
和行
——您的列和行似乎颠倒了方向。)
我还建议您不要在方法调用中使用复合赋值运算符(row++
等),这会使您更难确定发生了什么。我会更改您的代码,以使用以下内容:
row--;
if (row < 0)
{
row = 24;
}
行--;
如果(行<0)
{
行=24;
}
在您的case语句中-然后在打印*之前调用控制台.SetCursorPosition
,而不是使用退格符和用ux覆盖,为什么不重新定位光标:
Console.SetCursorPosition(col, row);
Console.Write("*");
Thread.Sleep(100);
// Wipe out the previous star
Console.SetCursorPosition(col, row);
Console.Write(" ");
(请注意,我在这里转置了列
和行
——您的列和行似乎颠倒了方向。)
我还建议您不要在方法调用中使用复合赋值运算符(row++
等),这会使您更难确定发生了什么。我会更改您的代码,以使用以下内容:
row--;
if (row < 0)
{
row = 24;
}
行--;
如果(行<0)
{
行=24;
}
在您的case语句中,然后在打印*之前对控制台.SetCursorPosition
的单个调用中,写一个空格-“”而不是“”写一个空格-“”而不是“”而不是:
Console.Write('\b');
Console.Write("_");
为何不:
Console.SetCursorPosition(row, col);
Console.Write("_");
也就是说,您已经知道如何将光标直接定位到要写入字符的位置。而不是:
Console.Write('\b');
Console.Write("_");
为何不:
Console.SetCursorPosition(row, col);
Console.Write("_");
也就是说,您已经知道如何将光标直接定位到要写入字符的位置。在更新行和列之前,请将光标位置设置为旧的行和列并写入空格
顺便说一句,与其从0到4生成一个随机数,然后在0上重试,为什么不从0到3生成一个随机数,并将这四个值作为您检查的值呢?您可以说“case 0”--零和1一样好。或者,如果您真的对1到4上瘾,请将随机数生成更改为“next(4)+1”.在更新行和列之前,将光标位置设置为旧的行和列并写入空格
顺便说一句,与其从0到4生成一个随机数,然后在0上重试,为什么不从0到3生成一个随机数,并将这四个值作为您检查的值呢?您可以说“case 0”--零和1一样好。或者,如果您真的对1到4上瘾,请将随机数生成更改为“next(4)+1”.在编写try Console.Clear()之前尝试Console.Clear();在编写try Console.Clear()之前尝试处理减量的好方法。是的,“做它,然后检查它是否有效”然后“检查我想做的事情是否有效,然后再做它”要干净得多。关于处理减量的好方法。是的,处理减量的好方法要干净得多,“做它,然后检查它是否有效”然后再去做“检查我想做的是否有效,然后再做”。当我使用它时,光标锁定在起始位置,我没有解算。当我使用它时,光标锁定在起始位置,我没有解算