2012-10-17 225 views
0

我正在制作一个输出随机数然后组织它们的程序。订购输出随机数

我正在组织数字,以便稍后我可以添加代码以告诉用户他或她已收到多少匹配的号码。

该程序编译得很好,但后来当我运行exe文件,输出第一行随机数后输出崩溃。我收到的错误是:

索引超出了数组的边界。

任何帮助都将不胜感激。

Option Explicit On 
Option Strict On 

Imports System 

Module Yahtzed 

Sub Main() 

    Randomize() 
    Dim Index, Values, NumberOfPlayers,Temp as Integer 
    Dim order(index) as integer 
    Dim Last As Integer = 0 'to Order.Length-2 
    Console.Write("How many people will be playing Yahtzed?: ") 
    NumberOfPlayers = convert.toint32(Console.Readline) 
    Do while NumberOfPlayers > 0 
     Index = 0 
     Do until index = 5 
      Values = CInt(Int((6 * Rnd()) + 1)) 
      Console.Write(" "&values) 
      Index += 1 
     Loop 
     Do Until Index = 0 
      If Order(Index + 1) < Order(index) 
       Temp = Order(Index + 1) 
       Order(Index + 1) = order(index) 
       Order(index) = Temp 
       Console.WriteLine(Order(Index)) 
      End if 
      index -= 1 
     loop 
     Console.Writeline 
     NumberOfPlayers -= 1 
     Console.Writeline() 
    Loop 

End Sub 

End Module 
+0

也许我在这里的方式,但问题可能与行'Dim命令(索引)作为整数'?你只在上面的一行声明'index',所以不会把'Dim order(index)as integer'实质上变成'Dim order(0)as integer'?你是否已经通过代码来确定哪一行失败了? – LittleBobbyTables

回答

2

该代码并不像现在这样。你创建一些随机数,然后把它们扔掉,然后对从未分配过任何东西的数组进行排序。此外,数组只有一个项目,所以它不能保存随机值。

我认为你要声明数组的五个项目,而不是一个(如index是你创建数组时零):

然后把随机数数组中,而不是将它们放在一个变量,其中每个随机数将取代前一:

Index = 0 
Do until index = 5 
    order(index) = CInt(Int((6 * Rnd()) + 1)) 
    Console.Write(" " & order(index)) 
Loop 

当排序的阵列,则开始寻找在索引6(作为可变index为5),这是阵列外部。你会想从数组的最后一个项目开始(即在索引3)。然后你循环直到index为-1,否则你不会比较数组中的两个第一项。

此外,你还得继续整理,直到有没有更多的交换,只是经历了一次阵不让它排序:

Dim swapped as Boolean = True 
Do While swapped 
    index = 3 
    swapped = False 
    Do Until index = -1 
    If order(index + 1) < order(index) 
     temp = order(index + 1) 
     order(index + 1) = order(index) 
     order(index) = temp 
     swapped = True 
    End if 
    index -= 1 
    Loop 
Loop 

此排序算法称为Bubble Sort

另外也排序内置的框架,如果你想使用来代替:

Array.Sort(order) 

如果你会写出来,而排序的值,你会比让他们好几次,所以你做他们排序后:

index = 0 
Do until index = 5 
    Console.Write(" " & order(index)) 
Loop 
+0

谢谢Guffa!非常有帮助和信息 – user1683391