2

私は学生で、レベル C のプログラミングの試験プロジェクトを提出しようとしています。

私はプロジェクトの最後にいます。ハイスコアのゲームをプログラムしました。ハイスコ​​アはスコアをメモ帳に保存するので、ゲームを再起動したときに古いハイスコアを再度読み取ることができます。

問題は、新しいハイスコアが来るたびに、新しいハイスコアを追加し続けることです。したがって、100 ゲームをプレイした場合、100 のハイスコアがあり、それは望ましくありません。ハイスコ​​アに制限を設けたい。15くらいで考えています。

私には2つの考えがあります。最初のアイデアは、プログラムが最初の 15 のハイスコアのみを読み取るというものです。2 番目のアイデアは、古いハイスコア リストを読み取るサブを作成し、それを新しいハイスコアと比較して、古いハイスコア リストを更新する必要があるかどうかを確認することです。

しかし、問題は、私はそれをプログラミングするのに大きな問題を抱えているということです.. ハイスコアのサブスクをアップロードして、助けを求めます.

ここにハイスコアリストを書きます

Private Sub skrivhighscore()
    ReDim Preserve HighscoreNavn(UBound(HighscoreNavn) + 1)
    ReDim Preserve HighscoreLevel(UBound(HighscoreLevel) + 1)

'insets the new highscore on the right place so that level is on top
        For i As Integer = 1 To UBound(HighscoreLevel)
        If (level > HighscoreLevel(i)) Then
            'the new highscore is bigger than highscorecount(i). inset the new here but first move the others 
            For j As Integer = UBound(HighscoreLevel) To i + 1 Step -1
                'kopier array(j-1) til array(j)
                HighscoreNavn(j) = HighscoreNavn(j - 1)
                HighscoreLevel(j) = HighscoreLevel(j - 1)
            Next j
            HighscoreNavn(i) = brugernavn
            ' sets highscore name to username. brugernavn = username
            HighscoreLevel(i) = level
            'set shighscorelvel(I) to the level the user died on.
            Exit For
        End If
    Next i

    'clear username and change level to 0
    brugernavn = ""
    level = 0

    'writes highscore to a file so it can be read next time
    highscoreboardskriv()

End Sub    

これは、ハイスコアリストをメモ帳に保存する場所です

 Private Sub highscoreboardskriv()
    ' create a file at the same place as the game 
    'append:=False means overwrite and not repleace

    fileWriter = My.Computer.FileSystem.OpenTextFileWriter("HighScore.txt", append:=False)
    For i As Integer = 1 To UBound(HighscoreLevel)
        ' In every line the name is on the first   20 spaces and the score is from space   22
        'example: "Player1            :   2"
        If (HighscoreNavn(i) IsNot Nothing) AndAlso (HighscoreNavn(i).Trim <> "") Then
            ' If username is empty, it will not be written in the highscorelist. by using this method a highscore can be removed. 
            FileLine = HighscoreNavn(i).PadRight(20) & ":" & HighscoreLevel(i).ToString.PadLeft(5)
            fileWriter.WriteLine(FileLine)
        End If
    Next i

    fileWriter.Close()

End Sub

これは私のハイスコアリストを表示する場所です

Private Sub Highscore()
    'Now we read both information again from the file 

    Dim HighScoreText As String = ""

    'highscorelist line by line
    For i As Integer = 1 To UBound(HighscoreLevel)
        'takes every spaces in an array (we dont use the first line)
        If (HighscoreNavn(i) IsNot Nothing) AndAlso (HighscoreNavn(i).Trim <> "") Then
            If (HighScoreText <> "") Then
                'new line by every highscore except the first line
                HighScoreText = HighScoreText & vbNewLine
            End If
            'line 1 example: "player1            :   230"
            HighScoreText = HighScoreText & HighscoreNavn(i).PadRight(20) & ":" & HighscoreLevel(i).ToString.PadLeft(5)
        End If
    Next i

    'show highscorelist to user
    MsgBox(HighScoreText, Title:="Highscore list")

End Sub

これは、メモ帳からハイスコアリストを読んだ場所です。

Public Sub highscoreboardlæs()

Public HighscoreNavn(0) As String
Public HighscoreLevel(0) As Integer
Public level As Integer = 0
Public fileReader As System.IO.StreamReader
Public FileLine As String

    Try
        fileReader = My.Computer.FileSystem.OpenTextFileReader("HighScore.txt")

        FileLine = fileReader.ReadLine()

        While (FileLine <> "") 'loop så længe der er linjer i filen, for at få alle highscores med

            'extend array with 1 extra line

            ReDim Preserve HighscoreNavn(UBound(HighscoreNavn) + 1)
            ReDim Preserve HighscoreLevel(UBound(HighscoreLevel) + 1)


            HighscoreNavn(UBound(HighscoreNavn)) = Mid(FileLine, 1, 20)
            HighscoreLevel(UBound(HighscoreLevel)) = Val(Mid(FileLine, 22, 5))

            'read next line from the file
            FileLine = fileReader.ReadLine()
        End While

        fileReader.Close()
    Catch
        'i use try method, else it will crash if there arent any highscorelist
    End Try
    'MsgBox("Highscore: " & vbNewLine & fileReader.ReadLine() & vbNewLine & fileReader.ReadLine() & vbNewLine & fileReader.ReadLine())
End Sub
4

1 に答える 1

0

ファイルに 15 のスコアを保持したい場合は、すべてのスコアを配列に読み込んで並べ替え、最も高い 15 のスコアをファイルに書き戻すことができます。すべてのスコアをメモリにロードすると、より大きなリストでOOM(メモリ不足)例外が発生する可能性があるため、スコアリストが長い場合はお勧めしませんが、あなたの場合は完全に問題ありません。

Sub AddScore(score%, filePath$)
    Dim Scores As New List(Of Integer)

    ' Loads all the scores into our list
    Using Sr As New IO.StreamReader(filePath)
        Do Until Sr.EndOfStream
            Scores.Add(Sr.ReadLine)
        Loop
    End Using

    Scores.Sort() ' Sort it
    Scores.Reverse() ' Reverse it, as the the highest scores is at the bottom. You would property want to just read trough the last 15 items in the list rather than reversing it, but I'm just being lazy.

    ' Write the first 15
    Using Sw As New IO.StreamWriter(filePath, False)
        For i = 0 To Math.Min(Scores.Count - 1, 14)
            Sw.WriteLine(Scores(i))
        Next
    End Using
End Sub

ああ、ところで、あなたのスウェーデン語は正しいですか?スウェーデンのプログラミング学校の様子にとても興味があるので、PM を送っていただけませんか。

于 2013-04-20T18:37:10.760 に答える