尽管单个实例

时间:2015-08-18 06:05:16

标签: c# random

我正在使用Visual C#(Winforms Application)开发一款游戏,该游戏具有来自面板四面的导弹,具有随机速度,损伤和轴值的位置。初始化变量时使用的所有随机Next()函数都使用另一个类中包含的相同Random变量,并用于所有随机使用。

然而,对于20个导弹的阵列,多次为坐标选择相同的值,以便由于图像的重叠而在视觉上仅存在3或4个导弹。这也发生在速度和侧面变量上,并且可能与损伤变量有关,但我还没有检查。

导弹是包含图像的矩形。 X和Y坐标受到导弹延伸的GameObject类中包含的旋转移动值的影响,这意味着我必须用缩放值除以倍数以在像素坐标和纹理坐标之间切换。

以下是导弹一旦到达面板一侧而不击中玩家就会重新生成的代码。

side = game.rand.Next(1, 4);

    switch (side)
    {
            case 1:
                angle = 90;
                x = game.rand.Next((int)(30 / xScale), (int)(990 / xScale));
                y = (int)(30 / yScale);
                break;
            case 2:
                x = (int)(1000 / xScale);
                y = game.rand.Next((int)(30 / yScale), (int)(610 / yScale));
                break;
            case 3:
                angle = 180;
                x = game.rand.Next((int)(30 / xScale), (int)(990 / xScale));
                y = (int)(610 / yScale);
                break;
            case 4:
                angle = -90;
                x = (int)(30 / xScale);
                y = game.rand.Next((int)(30 / yScale), (int)(610 / yScale));
                break;
        }

game.rand是存储在另一个类中的常见随机变量。它应该沿y轴或x轴选择随机变量,但通常只选择2个不同的值,尽管这种方法被调用了20次。

欢迎任何和所有建议。非常感谢您的阅读。

3 个答案:

答案 0 :(得分:2)

你的随机不正确。 rand.Next中的maxValue是返回的随机数的唯一上限。值返回来自minValue,但小于maxValue。

所以,你的

 side = game.rand.Next(1, 4);   //creates a number between 1 and 3

要实现目标,您应该将其更改为:

side = game.rand.Next(1, 5);   //creates a number between 1 and 4

答案 1 :(得分:2)

您的代码的一个问题是您使用Next(int,int)来获取随机值,而您拥有的值不是整数,而是加倍(30 / xScale)。

请改用NextDouble方法:

public double GetRandomNumber(double minimum, double maximum)
{ 
    return game.rand.NextDouble() * (maximum - minimum) + minimum;
}

答案 2 :(得分:1)

为您进行一些测试:

 class Freq
        {
            public int one = 0, two = 0, three = 0, four = 0, els = 0;
            public override string ToString()
            {
                return String.Format("Ones: {0} - Twos: {1} - Threes: {2} - Fours: {3} ", one, two, three, four);
            }
        }
        static void RunTest()
        {
            int n;
            for (int i = 0; i < 20; i++)
            {
                n = game.rand.Next(1, 4);
                switch (n)
                {
                    case 1:
                        ++freq.one;
                        break;
                    case 2:
                        ++freq.two;
                        break;
                    case 3:
                        ++freq.three;
                        break;
                    case 4:
                        ++freq.four;
                        break;
                    default:
                        ++freq.els;
                        break;
                }
            }
            Console.WriteLine(freq);
        }


side = game.rand.Next(1, 4);

产地:

  

一个:5 - 两次:5 - 三次:10 - 四:0

     

一个:5 - 两次:11 - 三次:4 - 四:0

     

一个:7 - 两次:9 - 三次:4 - 四:0

     

一个:6 - 两次:7 - 三次:7 - 四:0

     

一个:7 - 两次:5 - 三次:8 - 四:0

     

一个:3 - 两次:9 - 三次:8 - 四:0

应改为:

side = game.rand.Next(1, 5);

产生:

  

一个:2 - 两次:6 - 三次:7 - 四:5

     

一个:6 - 两个:2 - 三分:8 - 四:4

     

一个:8 - 两次:2 - 三次:7 - 四:3

     

一个:3 - 两个:1 - 三个:11 - 四:5

     

一个:4 - 两次:8 - 三次:4 - 四:4