2016-07-09 54 views
2

我想在wpf中简单的Yatsy游戏中放置,但遇到了一个奇怪的问题。基本上,单击UI中的按钮重新滚动时,会调用UpdateLogic()方法。该方法通过骰子列表循环,并且应该随机地单独更新每个值和图像链接。所有的值都没有变化

这里是奇怪的部分。如果我在调试模式下像平常一样运行它,而不使用breakboint或释放的.exe文件,则所有值和图像链接总是会获得相同的值。如果我在带有断点的调试模式下运行并逐步完成对新值的请求,它将按预期工作。

有没有人有任何建议?

 
namespace Yatzy 
{

public partial class MainWindow : Window { private DiceManager dm; private List<BitmapImage> sidesToDisplay = new List<BitmapImage>(); public MainWindow() { InitializeComponent(); CreateObjects(); for (int i = 0; i < 6; i++) { var side = new BitmapImage(); sidesToDisplay.Add(side); sidesToDisplay[i].BeginInit(); sidesToDisplay[i].UriSource = new Uri(@"Images/Side" + (i+1) +".png", UriKind.Relative); sidesToDisplay[i].EndInit(); } } private void CreateObjects() { dm = new DiceManager(); dm.GenerateDices(); } private void button_Click(object sender, RoutedEventArgs e) { UpdateLogic(); } private void UpdateLogic() { foreach (Dice dice in dm.AllDices) { dice.SetNewValue(sidesToDisplay); } Dice1.Source = dm.AllDices[0].sideToDisplay; Dice2.Source = dm.AllDices[1].sideToDisplay; Dice3.Source = dm.AllDices[2].sideToDisplay; Dice4.Source = dm.AllDices[3].sideToDisplay; Dice5.Source = dm.AllDices[4].sideToDisplay; } } public class DiceManager { public List<Dice> AllDices { get; set; } public DiceManager() { AllDices = new List<Dice>(); } public void GenerateDices() { for (int i = 0; i < 5; i++) { AllDices.Add(new Dice()); } } } public class Dice { public int Value { get; set; } public BitmapImage sideToDisplay { get; set; } public void SetNewValue(List<BitmapImage> imageList) { Value = new Random().Next(1, 7); sideToDisplay = imageList[Value - 1]; } }

}

+1

把一个循环内随机实例的创建是错误的 – Steve

回答

4

随机实例被初始化与从系统时钟截取的种子值。当您在紧密循环内创建新的Random实例时,这会产生问题。这些实例使用相同的时钟值生成,因此它们会返回相同的数字序列。

诀窍是为所有骰子创建一次Random实例,并在此实例上调用Next。

public class Dice 
{ 
    public int Value { get; set; } 
    public BitmapImage sideToDisplay { get; set; } 

    public void SetNewValue(List<BitmapImage> imageList, int diceValue) 
    { 
     Value = diceValue; 
     sideToDisplay = imageList[Value - 1]; 
    } 
} 

and in the UpdateLogic 

private void UpdateLogic() 
{ 
    Random rnd = new Random(); 
    foreach (Dice dice in dm.AllDices) 
    { 
     dice.SetNewValue(sidesToDisplay, rnd.Next(1,7)); 
    } 
    .... 
} 
+1

调试有放松紧张的循环,这样就可以在调试_sometime_如果停止足够长的时间让时钟的代码工作的影响时间用不同的种子初始化随机数。 – Steve

+0

非常感谢!造成了我很多困惑。 –