2014-09-25 63 views
0

我正在做一個「一擲千金」類型的遊戲的一個項目列表在Visual Basic 2008刪除從VB

值我有分配5個值隨機至5盒出現問題。

例如,在一個遊戲中,盒可以容納這些值:

Box 1 = 1000 
Box 2 = 35000 
Box 3 = 25000 
Box 4 = 75000 
Box 5 = 5000 

並且在另一個遊戲,它們可以保持這些值

Box 1 = 75000 
Box 2 = 25000 
Box 3 = 1000 
Box 4 = 5000 
Box 5 = 35000 

的主要目的是隨機地分配這些值分配給每個框,一旦賦值,就不能同時分配給另一個框。

這裏是我此刻的代碼:

 Dim values As New List(Of Integer) 
     Dim box(4) As Integer 
     Dim randNum(4) As Integer 

     'adding values to the Value list 
     values.Add(1000) 
     values.Add(5000) 
     values.Add(25000) 
     values.Add(35000) 
     values.Add(75000) 

     Dim i As Integer 

     For i = 0 To 4 
      Dim RandomClass As New Random() 
      Dim RandomNumber As Integer 
      RandomNumber = RandomClass.Next(0, 4) 

      'assigning a box a random value form the list 
      box(i) = values(RandomNumber) 

      'removing that value from the list 
      values.RemoveAt(i) 
     Next 

     Console.WriteLine("Box 1 = " & box(0)) 
     Console.WriteLine("Box 2 = " & box(1)) 
     Console.WriteLine("Box 3 = " & box(2)) 
     Console.WriteLine("Box 4 = " & box(3)) 
     Console.WriteLine("Box 5 = " & box(4)) 

     Console.Read() 

VB不斷返回此錯誤消息當我嘗試牛逼運行應用程序:

指數超出範圍。必須是非負數且小於集合的大小。參數名稱:索引

在此先感謝您的任何答案。

+3

如果您從列表中刪除值,則列表變短,並且下一個隨機值的結果可能引用您擺脫的某個事物。設置一個斷點並進行調試以查看。你可能想要考慮的一件事是一個Shuffle – Plutonix 2014-09-25 14:02:11

+0

啊,這是有道理的,你能給我更多的信息嗎? – sam 2014-09-25 14:06:34

+0

如果你想要沒有重複值的機會(就像一副牌中只有一張黑桃王牌一樣),那麼你想創建一個可能的值列表,隨機播放它們,然後分配它們。調查Fisher-Yates shuffle - 它的例子在這裏 – Plutonix 2014-09-25 14:12:26

回答

1

當您刪除一個項目時,列表的長度會變小。所以在第二個循環中,4的索引不再存在。在第三個循環中,3不再存在,依此類推。試試這個:

Dim RandomClass As New Random() 
Dim RandomNumber As Integer 
For i = 0 To 4 
    RandomNumber = RandomClass.Next(0, values.count - 1) 

    'assigning a box a random value form the list 
    box(i) = values(RandomNumber) 

    'removing that value from the list 
    values.RemoveAt(i) 
Next 
+0

這很好用 – sam 2014-09-25 14:13:16

1

史蒂夫的答案可以防止發生錯誤,但我認爲它仍然沒有達到你想要的。 values.RemoveAt(i)將始終從第一次,第二次,下一次等列表中刪除第一個項目...它不會刪除剛剛放在框中的值。爲此,您應該使用values.RemoveAt(RandomNumber)

For i = 0 To 4 
    RandomNumber = RandomClass.Next(0, values.count - 1) 

    'assigning a box a random value form the list 
    box(i) = values(RandomNumber) 

    'removing that value from the list 
    values.RemoveAt(RandomNumber) 
Next 
+0

是的,我已經實現了我自己,謝謝你的回答,雖然 – sam 2014-09-25 14:42:34

+0

好趕上,我在看錯誤,並錯過了代碼中的其他問題。 – Steve 2014-09-25 14:52:21