0

次のコードがあります。

Private Sub highscoreCheck()
    Dim a As Integer, b As String, c As Integer
    For a = 1 To 10
        If highscore > lst_score(a) Then
            highscoreIndex = a
            Exit For
        End If
    Next
    If highscoreIndex > 0 Then
        For highscoreIndex As Integer = 1 To 10
            b = lst_name(highscoreIndex)
            c = lst_score(highscoreIndex)
            If highscoreIndex = a Then
                lst_name(highscoreIndex) = userName
                lst_score(highscoreIndex) = highscore
            Else
                lst_name(highscoreIndex) = b
                lst_score(highscoreIndex) = c
            End If
        Next

    End If
End Sub

私は10行で構成されるハイスコアリストを持っています.highscoreindexは、現在のハイスコアがどれよりも大きいかどうかを表し、そうであれば、highscoreIndexがそれらの最大数です。(例: 12、8、6。現在のものは 9 で、ハイスコアインデックスは 2 です)。コードで実行したかったのは、現在のハイスコアを適切な位置に挿入し、その下にあるものと置き換えたものを 1 つ下げることでした。それは現在のハイスコアを挿入しますが、他のものを1つ下げません.私は何を台無しにしましたか? 私は何をすべきか?

4

1 に答える 1

0

名前用とスコア用に別々の配列を持つ代わりに、関連付けられた 2 つの値を保持するクラスを作成します。そのクラスにIComparableを実装させて、自分自身をソートできるようにします。クラスのインスタンスをList()に保持して、それに対してSort()を呼び出すことができるようにします。List に追加して Sort() を呼び出した後、目的の数だけが残るまで最後のエントリを繰り返し削除します。

簡単な例を次に示します。

Public Class Form1

    Private Const MaxNumberOfHighScores As Integer = 3
    Private HighScores As New List(Of ScoreEntry)

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim score As New ScoreEntry
        score.Name = "Bob"
        score.Value = 7
        AddEntry(score)

        score = New ScoreEntry
        score.Name = "George"
        score.Value = 3
        AddEntry(score)

        score = New ScoreEntry
        score.Name = "Dora"
        score.Value = 9
        AddEntry(score)

        score = New ScoreEntry
        score.Name = "John"
        score.Value = 6
        AddEntry(score)

        score = New ScoreEntry
        score.Name = "Jennifer"
        score.Value = 10
        AddEntry(score)

        score = New ScoreEntry
        score.Name = "Mike"
        score.Value = 8
        AddEntry(score)

        For i As Integer = 0 To HighScores.Count - 1
            Debug.Print(HighScores(i).Name & ": " & HighScores(i).Value)
        Next
    End Sub

    Private Sub AddEntry(ByVal E As ScoreEntry)
        HighScores.Add(E)
        HighScores.Sort()
        While HighScores.Count > MaxNumberOfHighScores
            HighScores.RemoveAt(HighScores.Count - 1)
        End While
    End Sub

End Class

Public Class ScoreEntry
    Implements IComparable(Of ScoreEntry)

    Public Name As String
    Public Value As Integer

    Public Function CompareTo(other As ScoreEntry) As Integer Implements System.IComparable(Of ScoreEntry).CompareTo
        Return other.Value.CompareTo(Me.Value) ' Sort Descending
    End Function

End Class
于 2013-05-01T20:24:49.960 に答える