2012-08-11 61 views
0

我正在嘗試編寫角色扮演Dice子程序。我在Visual Basic中使用Visual Studio 2010編寫。根據Visual Studio的所有語法都是正確的。該表格如下所示:我該如何解決「索引超出數組邊界」並將值寫入數組

當您單擊骰子文本框的數值爲「1」或「null」的數字按鈕時,它將滾動一個骰子並給予一個隨機值,具體取決於哪個數字按鈕你點擊。如果你輸入一個2或更大的值,那麼程序停止並給我以下異常錯誤。

我已經做了研究,並認爲代碼被寫入正確,但由於某種原因值沒有進入數組。想知道如何使值進入數組,並讓程序識別出多個骰子正在滾動。以下是其中一個按鈕的代碼副本。

Private Sub btnD4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnD4.Click 
    Dim v, w, x, y, z, iarry(x) As Integer 
    lvRolls.Items.Clear() 
    If txt4Qty.Text = vbNullString Then 
     x = 1 
    Else 
     x = CInt(txt4Qty.Text) 
    End If 
    If x = 1 Then 
     z = CInt(Int(Rnd() * 5)) 
     If z > 4 Then 
      z = 4 
     ElseIf z < 1 Then 
      z = 1 
     End If 
     lvRolls.Items.Add("Roll 1") 
     lvRolls.Items(0).SubItems.Add(CStr(z)) 
     If txt4Mod.Text = vbNullString Then 
      lblTotal.Text = CStr(z) 
     Else 
      w = CInt(txt4Mod.Text) 
      lblTotal.Text = CStr(z + w) 
     End If 
    Else 
     For y = 0 To x Step 1 
      z = CInt(Int(Rnd() * 5)) 
      If z > 4 Then 
       z = 4 
      ElseIf z < 1 Then 
       z = 1 
      End If 
      iarry(y) = z 
     Next 
     For v = 0 To x 
      lvRolls.Items.Add("Roll " & v + 1) 
      lvRolls.Items(x).SubItems.Add(CStr(iarry(y))) 
     Next 
    End If 
End Sub 
+0

雖然不熟悉vb.net,但我的猜測是你沒有以正確的方式初始化iarray。 Dim v,w,x,y,z,iarry(x)As Integer' x可能爲零,因此數組的長度也應該爲零。因爲你訪問該數組的唯一部分是當'x!= 1'應該是它。 – 2012-08-11 08:43:07

回答

3

您聲明您的數組iarry這裏: -

Dim v, w, x, y, z, iarry(x) As Integer 

這將對聲明數組沒有元素的影響。你需要,只要x的值是已知的,以

ReDim iarry(x) 

編輯多一點認真細讀你的代碼,看來你可能需要

ReDim iarry(x + 1) 

尺寸標註x元素的數組爲您提供元素0, 1, 2, ..., x-1

+0

在VB中,x將是數組的上限,而不是長度。所以如果x是0,那麼該數組將有一個元素。如果你需要一個包含10個項目的數組,它將被聲明爲iarry(9)。 – 2012-08-13 14:03:26

1

我建議你改變數組和使用列表(整數),它的easyer使用,你不需要初始化列表中的項目數。

編輯:

這裏是你的代碼的版本,我不知道是否是你想要這個東西。

Private Sub btnD4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnD4.Click 

    Dim x As Integer = CInt(If(txt4Qty.Text <> vbNullString, txt4Qty.Text, 1)) 
    Dim iarry As New List(Of Integer) 

    lvRolls.Items.Clear() 

    If x = 1 Then 

     Dim z As Integer 

     z = (New Random).Next(1, 4) 

     lvRolls.Items.Add("Roll 1") 
     lvRolls.Items(0).SubItems.Add(z.ToString) 

     If txt4Mod.Text = vbNullString Then 
      lblTotal.Text = z.ToString 
     Else 
      lblTotal.Text = (z + CInt(txt4Mod.Text)).ToString 
     End If 

    Else 

     Dim i As Integer 

     For i = 0 To x 
      iarry.Add((New Random).Next(1, 4)) 
     Next 

     For v = 0 To x 

      Dim t_item As New ListViewItem("Roll " & v + 1) 

      lvRolls.Items.Add(t_item) 

      t_item.SubItems.Add(CStr(iarry(v))) 

     Next 

    End If 
End Sub 
相關問題