いくつかの文字がコンソール上でランダムに動いていることを示すプログラムを実装したいと思います。C#でのマルチスレッドの使用に関する問題
コンソール上で1文字をランダムに移動する再帰的な方法を作成しました。私は2つの文字を移動する場合、同じメソッドを呼び出す2つのスレッドを使用します。
プログラムは最初の分が完璧に機能しますが、しばらくすると手紙はコンソールのどこにでも見え始めます!
私の再帰的メソッドは大丈夫です(私は再帰の代わりに(< 100000)を使用して、別のメソッドを作成しようとしています。誰かが私にこれを手伝ってもらえますか?
ありがとうございました。
編集:申し訳ありませんが、サンプルコードです(文字が同じ位置にある場合はどうなるか考えません)。文字は「スタジアム」上を移動し、x軸が20〜51、y軸が5〜26の間を移動します。
public void WriteAt(string s, int x, int y)
{
try
{
Console.SetCursorPosition(x, y);
Console.Write(s);
}
catch (ArgumentOutOfRangeException e)
{
Console.Clear();
Console.WriteLine(e.Message);
}
}
public void impresion()
{
int x = random.Next(20, 51);
int y = random.Next(5, 26);
WriteAt("A", x, y);
imprimir("A", x, y, 80);
}
public void impresion2()
{
int x = random.Next(20, 51);
int y = random.Next(5, 26);
WriteAt("E", x, y);
imprimir2("E", x, y, 20);
}
public void go()
{
Thread th1 = new Thread(impresion);
Thread th2 = new Thread(impresion2);
th1.Start(); //creates an 'A' that will move randomly on console
th2.Start(); //creates an 'E' that will move randomly on console
}
public void imprimir(string s, int x, int y, int sleep)
{
Thread.Sleep(sleep);
WriteAt(" ", x, y);
int n = random.Next(1, 5);
if (n == 1)
{
if ((x + 1) > 50)
{
WriteAt(s, x, y);
imprimir(s, x, y, sleep);
}
else
{
WriteAt(s, x + 1, y);
imprimir(s, x + 1, y, sleep);
}
}
else if (n == 2)
{
if ((y - 1) < 5)
{
WriteAt(s, x, y);
imprimir(s, x, y, sleep);
}
else
{
WriteAt(s, x, y - 1);
imprimir(s, x, y - 1, sleep);
}
}
else if (n == 3)
{
if ((x - 1) < 20)
{
WriteAt(s, x, y);
imprimir(s, x, y, sleep);
}
else
{
WriteAt(s, x - 1, y);
imprimir(s, x - 1, y, sleep);
}
}
else
{
if ((y + 1) > 25)
{
WriteAt(s, x, y);
imprimir(s, x, y, sleep);
}
else
{
WriteAt(s, x, y + 1);
imprimir(s, x, y + 1, sleep);
}
}
}
コードを含めるのを忘れた –
なぜ各文字に対して再帰的メソッドが必要なのか不明です。そのスタックはキャラクターが動くにつれて急速に成長します。 @ornが言ったように、いくつかのコードを投稿する –