c# - 使用断点时代码的行为不同

标签 c# visual-studio-2010 debugging

<分区>

Possible Duplicate:
Random number generator only generating one random number
Random not that random

这是我第一次尝试使用类和对象,我完全不知道如何处理我目前所处的情况。我正在创建一个需要在屏幕边缘生成敌人的游戏, 所以我创建了一个方法,它创建 10 个对象并随机选择一条边和一个合适的坐标来分配给它们。

    private void spawner()
    {
        if (enemies.Count < 10)
        {
            int a;
            a = 10 - enemies.Count;

            for (int i = 0; i < a; i++)
            {
                int x, y, c;
                Random random = new Random();
                c = random.Next(0, 4);

                if (c == 0)
                {
                    x = random.Next(0, 839);
                    y = 1;
                }
                else if (c == 1)
                {
                    y = random.Next(0, 647);
                    x = 1;
                }
                else if (c == 2)
                {
                    x = 839;
                    y = random.Next(0, 647);
                }
                else
                {
                    y = 647;
                    x = random.Next(0, 839);
                }

                enemies.Add(new Enemy(5, 25, 3, new Point(x, y)));
                enemies[enemies.Count - 1].adjustPosition(player1.centreX, player1.centreY);
            }
        }
    }

然后我调用 Enemy 类中的方法,使坐标更靠近 Player 控制对象的中心,并创建 3 个用于绘制敌人的新点:enemies[enemies.Count - 1] .adjustPosition(player1.centreX, player1.centreY);

    public class Enemy
    {
        public int enemyLife { get; set; }
        public Point enemyCentre { get; set; }
        public int enemyRadius { get; set; }
        public double enemySpeed { get; set; }
        public Point[] enemyVertices { get; private set; }

        public Enemy(int life, int radius, double speed, Point centre)
        {
            enemyLife = life;
            enemyCentre = centre;
            enemyRadius = radius;
            enemySpeed = speed;
        }

        public void adjustPosition(int centreX, int centreY)
        {
            double vx = 0;
            double vy = 0;
            double mag = 0;
            int x, y;

            if (enemyCentre.X != 0)
            {
                vx = centreX - enemyCentre.X;
                vy = centreY - enemyCentre.Y;
                mag = Math.Sqrt(vx * vx + vy * vy); // length

                vx /= mag;
                vy /= mag;

                x = (int)((double)enemyCentre.X + vx * enemySpeed);
                y = (int)((double)enemyCentre.Y + vy * enemySpeed);
                enemyCentre = new Point(x, y);

                int px, py, px2, py2, px3, py3;
                double angle;

                vx = centreX - x;
                vy = centreY - y;
                mag = Math.Sqrt(vx * vx + vy * vy); // length

                vx /= mag;
                vy /= mag;

                px = (int)((double)x + vx * 20);
                py = (int)((double)y + vy * 20);

                angle = Math.Atan2(centreY - y, centreX - x);

                px2 = (int)(px + (-30 * Math.Cos(0.785398163 + angle)));
                py2 = (int)(py + (-30 * Math.Sin(0.785398163 + angle)));

                px3 = (int)(px + (-30 * Math.Cos(-0.785398163 + angle)));
                py3 = (int)(py + (-30 * Math.Sin(-0.785398163 + angle)));

                Point[] points = new Point[3];
                points[0] = new Point(px, py);
                points[1] = new Point(px2, py2);
                points[2] = new Point(px3, py3);

                enemyVertices = points;
            }
        }
    }

问题是,当我尝试使用“开始调试”来执行程序时,每个创建的对象与最后添加到列表中的对象共享相同的中心坐标。然而,当我在将对象添加到列表并单步执行代码之前添加断点时,为对象分配了应有的随机值。此外,如果我在手动执行某些对象的代码后删除断点,则手动运行的对象将包含随机值,而其余对象将共享相同的值。有谁知道可能导致此问题的原因是什么?

最佳答案

你的问题是新的 Random() 因为它的调用非常快,所以它实际上不会是随机的,因为 .net 用于默认构造函数的随机种子不会改变(我认为他们使用滴答或从中生成的一些哈希)

只需确保以调用之间有一段时间的方式调用 new Random(),如果您需要“快速”随机数,则使用 next()

关于c# - 使用断点时代码的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14399438/

相关文章:

c# - 'int.Parse(string)' 的最佳重载方法匹配有一些无效参数

asp.net - VS2010不发布特定的文件夹/文件

c++ - 同时在 Visual Studio 和 AnkhSVN 中移动文件

调试由嵌入式单声道运行时启动的 C# 程序集?

c# - 遵循 ASP.NET 中的 DRY 原则

c# - PingException "No such host is known"的含义

c++ - 如何告诉 C++ 不要优化丢弃的表达式?

flutter - 如果应用程序仅在 Release模式下崩溃,如何调试问题所在

visual-studio - 从 VS 调试器切换到 WinDbg

c# - Visual Studio 无法识别 Form.Designer.cs 文件