0

私はC#の初心者です。コンソール ゲームを開発していますが、C# のスレッドに問題があります。

私のゲームでは、カウント ダウン タイマーが実行されるトップ バーが表示されます。私はスレッドを試してみます.Console.Clear()を使用して古い番号をクリアし、1行で新しい番号に置き換えます(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.SetCursorPosition()、を使用するだけで、番号を上書きできます。Console.Write()

于 2012-07-04T08:14:45.370 に答える
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 に答える
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 に答える