2015-08-18 71 views
4

我正在使用Visual C#(Winforms應用程序)的遊戲工作,該工具的導彈來自面板的所有4邊,隨機速度,損傷和軸值的位置。在初始化變量時使用的所有隨機Next()函數使用包含在另一個類中的相同Random變量,並用於所有隨機用法。隨機變量選擇相同的值,儘管單個實例

但是,對於20枚導彈陣列,多次選擇相同的座標值作爲座標,以便由於圖像重疊而只有3或4枚導彈可視。這也發生在速度和側面變量上,並且可能與損壞變量相關,但是我還沒有檢查。

導彈是矩形與其中包含的圖像。 X和Y座標受到導彈擴展的GameObject類中包含的旋轉移動值的影響,這意味着我必須用縮放值分割和倍數以在像素座標和texal座標之間切換。

以下是導彈一旦到達面板側面而不擊中玩家就會重新生成的代碼。

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次。

歡迎任何和所有建議。非常感謝您的閱讀。

+5

[MSDN](https://msdn.microsoft.com/en-us/library/2dx6wyd4(v = vs.110).aspx)文檔說_MaxValue_是獨佔的,意味着案例4無效。 –

回答

2

一個問題是,您使用的是下一個(INT,INT),以獲得您的隨機值,而你有的值不是整數,但是加倍(30/xScale)。

使用方法NextDouble代替:

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

這工作得很好,謝謝:) –

+0

很高興幫助哥們。 –

2

你的隨機數是不正確的。 maxValuerand.Next是返回的隨機數的唯一上限。返回值來自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 
+0

這真的很有幫助,謝謝:) –

+0

不客氣。 –

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 - Fours:4