所有值都会更改,没有断点

本文关键字:断点 | 更新日期: 2023-09-27 17:56:11

我正在尝试在 wpf 中将简单的 Yatsy 游戏放在一起,但遇到了一个奇怪的问题。基本上,当在UI中单击按钮重卷时,将调用UpdateLogic()方法。该方法循环遍历骰子列表,并应随机和单独更新每个值和图像链接。

这是奇怪的部分。如果我像往常一样在调试模式下运行它,没有中断或发布的.exe文件,则所有值和图像链接始终获得相同的值。如果我在带有断点的调试模式下运行并逐步执行对新值的请求,它会按预期工作。

有人有什么建议吗?

命名空间 亚齐{
 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];
    }
}
 

}

所有值都会更改,没有断点

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

诀窍是为所有骰子创建一个随机实例一次,然后在此实例上调用 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));
    }
    ....
}