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

コードは今のままではあまり意味がありません。いくつかの乱数を作成してから破棄し、何も割り当てられていない配列を並べ替えます。また、配列には項目が 1 つしかないため、ランダムな値を保持できません。

1つではなく5つのアイテムの配列を宣言したいと思います(index配列を作成する時点ではゼロです):

Dim order(4) As Integer

次に、乱数を変数に入れる代わりに、乱数を配列に入れます。変数では、各乱数が前の乱数に置き換わります。

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

配列をソートすると、配列の外側にあるインデックス 6 (変数indexが 5 であるため) を見始めます。配列の最後から 1 つの項目 (つまり、インデックス 3) から開始する必要があります。次に、-1 になるまでループしますindex。そうしないと、配列の最初の 2 つの項目を比較できなくなります。

また、スワップがなくなるまでソートを続行する必要があります。配列を一度通過するだけではソートされません。

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 に答える