0

我是 C# 的初学者。我正在开发一个控制台游戏,但我在 C# 中遇到了 Thread 的问题。

我的游戏将显示一个倒数计时器运行的顶部栏。我尝试使用线程,我使用 Console.Clear() 清除旧号码,然后在一行(59、58、57 ...)上替换为新号码。我的游戏向用户在中心屏幕或任何地方输入用户数据显示一条消息,...等。但是,当我开始线程倒计时时,它会清除控制台屏幕,并且会清除用户可以输入用户数据的消息。你能帮我解释一下如何启动2个线程,做更多不同的任务吗?

using System; using System.Threading;
namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
        Program m = new Program();
        Thread pCountDown = new Thread(new ThreadStart(
            m.DisplayCountDown   
        ));
        Thread pDisplayForm = new Thread(new ThreadStart(
            m.DisplayForm    
        ));
        pCountDown.Start();
        pDisplayForm.Start();
        Console.ReadKey();
    }

    private void DisplayCountDown() {
        for (int i = 60; i >= 0; --i) {
            Console.Write("Time: {0}",i);
            Thread.Sleep(1000);
            Console.Clear();
        }

    }

    private void DisplayForm() {
        while (true) {
            Console.Write("Enter your number: ");
            int a = Int32.Parse(Console.ReadLine());
            Console.WriteLine(a);
            Console.ReadLine();
        }
    }
 }
}

错误: 我的错误

我想要这样:

图片(对不起,我是新会员):像这样

4

3 回答 3

1

您不需要清除控制台。Console.Write()覆盖现有字符,因此只需使用Console.SetCursorPosition(x,y);更改光标位置

例如:

string mystring = "put what you want to right here";
Console.SetCursorPosition(0,0); //the position starts at 0 just make a note of it
Conolse.Write(mystring);

//now when you are ready to clear the text and print something over it again
//just add this

//now first erase the previous text
for(int i = 0; i< mystring.Length; i++)
{
    Console.SetCursorPosition(i,0);
    Console.Write(' ');
}

//now write your new text
mystring = "something else";
Console.SetCursorPosition(0,0);
Console.Write("mystring");
于 2015-02-07T12:17:44.150 回答
1

您不需要线程,也不需要清除控制台。只需按照此处的建议使用Console.SetCursorPosition()和,这样您就可以覆盖数字。Console.Write()

于 2012-07-04T08:14:45.370 回答
0

DisplayCountDown这是一个不会每秒清除整个屏幕的示例:

private void DisplayCountDown()
{
    for (int i = 20; i >= 0; --i)
    {
        int l = Console.CursorLeft;
        int t = Console.CursorTop;
        Console.CursorLeft = 0;
        Console.CursorTop = 0;
        Console.Write("Time: {0}    ", i);
        Console.CursorLeft = l;
        Console.CursorTop = t;
        Thread.Sleep(1000);
    }
}

然而,这仍然留下了一些问题。就我而言,我看到“输入您的号码”出现在顶行并被覆盖,因此必须添加该行

if (Console.CursorTop == 0) Console.CursorTop = 1;

while循环内。此外,如果用户输入了足够多的数字,倒计时将滚动到视图之外,如果您尝试向上滚动查看它,则设置光标位置会自动向后滚动。

我也遇到了int.Parse抛出异常的间歇性问题,这可能是由于倒计时在用户输入的某个关键点发生变化引起的。

于 2012-07-04T08:22:12.593 回答