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
4

1 回答 1

2

代码不像现在那样真正有意义。您创建一些随机数,然后将它们扔掉,并对从未分配过任何东西的数组进行排序。此外,该数组只有一项,因此无法保存随机值。

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

Dim order(4) As Integer

然后将随机数放入数组中,而不是将它们放入变量中,其中每个随机数将替换前一个:

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

当您对数组进行排序时,您开始查看index数组外部的索引 6(因为变量是 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

这种排序算法称为冒泡排序

如果您想使用它,框架中还内置了排序功能:

Array.Sort(order)

如果你在排序时写出值,你会得到它们多次,所以你在排序后这样做:

index = 0
Do until index = 5
  Console.Write(" " & order(index))
Loop
于 2012-10-17T17:46:01.947 回答