0

多次元配列を並べ替えようとしていますが、これが正しい方法かどうかわかりません。これまでのところ、多次元配列で5つの数値を取得し、それらを1次元配列に移動して、配列の並べ替えを使用しています。より良い方法を知っていますか?または私のものを改善する方法についてのアイデアがありますか?また、コードは現在、並べ替え領域で機能していません。配列からのインデックスエラーが発生します。

どんな助けでもありがたいです。前もって感謝します

Module q
    Sub Main()
        Randomize()
        Dim Player,RandomNumber,NumberOfPlayers,Index As Integer
        Dim Roll as Integer = 0
        Console.Write("How many people will be playing Yahtzed?: ")
        Player = convert.toint32(Console.Readline)
        NumberOfPlayers = Player
        Dim Game(Player,5) As Integer
        Do until Player = 0
            Console.Write("User")
            Roll = 0
            Do until Roll = 5
                RandomNumber = CINT(Int((6 * Rnd()) + 1))
                Game(Player,Roll) = RandomNumber
                Roll += 1
                Console.Write(" "&RandomNumber)
            Loop 
            Player -= 1
            Console.Writeline()
        Loop 
        Player = NumberOfPlayers
        Do until Player = 0
            Dim Ordering(5) as Integer
            Roll = 0
            Do until Roll = 5
                Ordering(Index) = Game(Player,Roll)
                Roll += 1
                Index += 1
                Array.Sort(Ordering)
            Loop
        Loop
    End Sub
End Module
4

2 に答える 2

0

配列を反復する慣用的な方法は、Forステートメントを使用して行われます。

Const  NPlayers As Integer = 5, NRolls As Integer = 5

Dim game = New Integer(NPlayers - 1, NRolls - 1) {}
Dim randomizer As New Random()
Dim randomNumber As Integer

For p As Integer = NPlayers - 1 To 0 Step -1
    For r As Integer = 0 To NRolls - 1
        randomNumber = randomizer.[Next](10)
        game(p, r) = randomNumber
    Next 
Next

配列インデックスは常にから0になりarraysize-1ます。

Ordering配列のサイズは次のようになりますNPlayers * NRolls

Dim Ordering(NPlayers * NRolls - 1) As Integer

あなたは短すぎます。したがって、例外が発生します。


Randomクラスを使用して整数乱数を作成できます

Dim randomizer As New Random()
Dim randomNumber As Integer

...

randomNumber = randomizer.[Next](10)

これにより、0から10までの乱数が作成されます。ランダマイザーを1回だけ作成してから、Nextメソッドを呼び出して次の乱数を取得します。

(VBのキーワードであるNextため、メソッドを角かっこで囲む必要があります。)Next


アップデート

プレイヤーごとにロールを並べ替えたいと思います。これを実現する最も簡単な方法は、代わりにジャグ配列を使用することです。

Const  NPlayers As Integer = 5, NRolls As Integer = 5

Dim game = New Integer(NPlayers - 1)() {}
For p As Integer = NPlayers - 1 To 0 Step -1
    game(p) = New Integer(NRolls - 1) {}
    For r As Integer = 0 To NRolls - 1
        game(p)(r) = randomizer.[Next]()
    Next
    Array.Sort(game(p))
Next

game(p)(r)ただし、の代わりにでロールにアクセスする必要がありますgame(p,r)

于 2012-10-18T18:47:43.920 に答える
0

あなたがこれをスケッチするならば、それはあなたが私が賭けるのを本当に助けるでしょう。一次元配列と多次元配列の間に実際の違いはありません。それは純粋にあなた自身の思考プロセスです。5つのサイコロのロールのグリッドで構成される5x3の配列を考えてみましょう。2つの方法で整理できます。

2次元として:配列の開始->ロール1-> 1 2 345ロール2->24 215ロール3->25 4 3 2

または1次元として:配列の開始-> 1 2 3 4 5 2 4 2 1 5 2 5 4 3 2

いずれにせよ、メモリブロックのチャンクをどのように分割するかを任意に決定する必要があります。2次元の場合、最初の配列インデックスに事前にマークを付けて、基本的に「各2次元は5つの整数を保持します」と言います。メモリ内では、次のようになります。memory_address=配列のメモリ空間に到達するためのオフセット+[1st_Dim] * sizeof(5 integers)+ [2nd_Dim] * sizeof(integer)

1次元の場合は、代わりにこれを行います。memory_address=配列のメモリ空間に到達するためのオフセット+[1st_Dim] * sizeof(integer)

正しいインデックスにいることに注意している限り、2つのアドレスは同じになります。

これを紙に描き、索引付けを実行します。これは、何を繰り返しているかを理解するのに役立ちます。

于 2012-10-18T18:55:30.397 に答える