私はC#で新しく、レーストラックシミュレータを作成していますが、私は現在コードを実行するときにいくつかの問題に遭遇しています。私は4つのグレイハウンドオブジェクトの配列を持っています。私がform1.csでGreyhound.Runを呼び出すと、Runメソッドに "MessageBox.Show(" Distance "+ distance)各グレイハウンドが移動するはずですが、グレイハウンドのすべてが同じ距離を移動してしまいます。これはあなたがnew Random()
Run()
方法はelse
ブロックを打つたびに呼び出しているためですC#newb質問から "ヘッドスタートC#グレイハウンドラボ"
namespace Race
{
class Greyhound
{
public int StartingPosition;
public int RacetrackLength;
public PictureBox MyPictureBox = null;
public int Location = 0;
public Random Randomizer;
public bool Run()
{
Point p = MyPictureBox.Location;
if (p.X + MyPictureBox.Width >= RacetrackLength)
{
//TakeStartingPostion();
return true;
}
else
{
Randomizer = new Random();
int distance = Randomizer.Next(100);
MessageBox.Show("Distance is " + distance);
p.X += distance;
MyPictureBox.Location = p;
return false;
}
}
public void TakeStartingPostion()
{
Point P = MyPictureBox.Location;
P.X = StartingPosition;
MyPictureBox.Location = P;
}
}
}
namespace Race
{
public partial class Form1 : Form
{
Guy[] guys = new Guy[3];
Greyhound[] hounds = new Greyhound[4];
public Form1()
{
InitializeComponent();
hounds[0] = new Greyhound()
{
StartingPosition = 12,
MyPictureBox = GreyHound1,
RacetrackLength = 636
};
hounds[1] = new Greyhound()
{
StartingPosition = 12,
MyPictureBox = GreyHound2,
RacetrackLength = 636
};
hounds[2] = new Greyhound()
{
StartingPosition = 12,
MyPictureBox = GreyHound3,
RacetrackLength = 636
};
hounds[3] = new Greyhound()
{
StartingPosition = 12,
MyPictureBox = GreyHound4,
RacetrackLength = 636
};
}
private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < hounds.Length; i++)
{
hounds[i].Run();
}
}
}
}
ありがとうございます。そのトリックをした。 – Afonso
@Alfonso、@dlev:この例は[スレッドセーフではありません](http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx)です。 'Next'メソッドの呼び出しのたびにロックするべきです。そのため、独自のロックを行う独自の静的なRandomクラスを作成する方が簡単です。 – Groo
@Grooは、私は承知しているが、それはそれはスレッドセーフではないことは無関係だ:OPは(単一スレッドのみを使用している最初のコードスニペットは、forループからそれらすべてを実行し、現在のスニペットは、ボタンのクリックに基づいてそれらを実行し、そのため、すべてUIスレッドから実行されます)。もちろん、一般的に正しいです。この問題について言及するためにアップデートを追加します。 – dlev