Highscores verwalten und sichern

    • VB.NET

    Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von ChosiX.

      Highscores verwalten und sichern

      hallo,

      ich hab hier mal eine Klasse geschrieben, die Highscores verwaltet und sichert.
      Die idee dazu kam von Tobikubi.

      Dafür brauchen wir eine Klasse. In dieser werden die Highscores verwaltet.
      Code für die Klasse:

      VB.NET-Quellcode

      1. Imports System
      2. Imports System.IO
      3. Imports System.Runtime
      4. Imports System.Runtime.Serialization
      5. Imports System.Runtime.Serialization.Formatters.Binary
      6. <Serializable()> Public Class ClassHighscore
      7. 'highscore structur
      8. <Serializable()> Public Structure highscore
      9. Public Sub New(ByVal n As String, ByVal s As Integer)
      10. Name = n
      11. Score = s
      12. End Sub
      13. Public Name As String
      14. Public Score As Integer
      15. End Structure
      16. 'liste aller highscores
      17. Private HighScores As List(Of highscore)
      18. 'Event welches ausgelöst wird, wenn die Highscore Liste aktualisiert wurde.
      19. Public Event HighscoreListUpdated()
      20. Private _maxcount As Integer = 10 'maximale anzahl an highscore einträgen
      21. ''' <summary>Neue Instanz der ClassHighscore.</summary>
      22. Public Sub New(ByVal maxcount As Integer)
      23. _maxcount = maxcount
      24. HighScores = New List(Of highscore)
      25. End Sub
      26. ''' <summary>Fügt einen neuen Eintrag zur Highscore Liste hinzu,
      27. ''' wenn dieser größer als der aktuell kleinste Eintrag ist.</summary>
      28. ''' <param name="name">Name des Spielers.</param>
      29. ''' <param name="score">Punkte (Score).</param>
      30. ''' <returns>True wenn eingetragen werden konnte - sonst False.</returns>
      31. ''' <remarks></remarks>
      32. Public Function AddItem(ByVal name As String, ByVal score As Integer) As Boolean
      33. Dim hs As New highscore(name, score)
      34. Return additemtolist(hs)
      35. End Function
      36. ''' <summary>Fügt einen neuen Eintrag zur Highscore Liste hinzu,
      37. ''' wenn dieser größer als der aktuell kleinste Eintrag ist.</summary>
      38. ''' <param name="hs">Highscore als Strukture Highscore.</param>
      39. ''' <returns>True wenn eingetragen werden konnte - sonst False.</returns>
      40. ''' <remarks></remarks>
      41. Public Function AddItem(ByVal hs As highscore) As Boolean
      42. Return additemtolist(hs)
      43. End Function
      44. ''' <summary>Gemeinsame Funktion zum Hinzufügen von Einträgen zur Highscore Liste.</summary>
      45. Private Function additemtolist(ByVal hs As highscore) As Boolean
      46. 'zur liste hinzufügen
      47. HighScores.Add(hs)
      48. 'sortieren
      49. HighScores.Sort(AddressOf sort_highscores)
      50. 'prüfen ob mehr einträge zur verfügung stehen als erwünscht.
      51. If HighScores.Count > _maxcount Then
      52. HighScores.RemoveAt(_maxcount)
      53. End If
      54. 'event auslösen
      55. RaiseEvent HighscoreListUpdated()
      56. End Function
      57. ''' <summary>Sortiert die Highscore Liste nach Punkten (Score).</summary>
      58. ''' <remarks></remarks>
      59. Private Function sort_highscores(ByVal hs1 As highscore, ByVal hs2 As highscore) As Boolean
      60. If hs1.Score > hs2.Score Then
      61. Return True
      62. Else
      63. Return False
      64. End If
      65. End Function
      66. #Region "Properties"
      67. ''' <summary>Gibt die Highscore Liste zurück.</summary>
      68. ''' <remarks></remarks>
      69. Public ReadOnly Property GetHighscoreList() As List(Of highscore)
      70. Get
      71. Return HighScores
      72. End Get
      73. End Property
      74. #End Region
      75. #Region "Save and Load"
      76. ''' <summary>Lädt die Highscores.</summary>
      77. ''' <param name="filename">Highscoredatei mit Pfad.</param>
      78. ''' <remarks></remarks>
      79. Public Sub Load(ByVal filename As String)
      80. 'datei existiert nicht
      81. If File.Exists(filename) = False Then
      82. Throw New Exception("File not Found")
      83. End If
      84. 'datei laden
      85. Dim fs As New FileStream(filename, FileMode.Open)
      86. Dim formatter As New BinaryFormatter
      87. HighScores = DirectCast(formatter.Deserialize(fs), List(Of highscore))
      88. fs.Close()
      89. 'event auslösen
      90. RaiseEvent HighscoreListUpdated()
      91. End Sub
      92. ''' <summary>Speichert die Highscores.</summary>
      93. ''' <param name="filename">Dateiname (mit Pfad) unter welchem die Highscores gespeichert werden sollen.</param>
      94. ''' <remarks></remarks>
      95. Public Sub Save(ByVal filename As String)
      96. 'datei speichern
      97. Dim fs As New FileStream(filename, FileMode.Create)
      98. Dim formatter As New BinaryFormatter
      99. formatter.Serialize(fs, HighScores)
      100. fs.Close()
      101. End Sub
      102. #End Region
      103. End Class

      und eine Form. Diese dient zur Anzeige und Eingabe der Highscores
      Für die Form brauchen wir einen Button, zwei Textboxen und ein ListView

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private WithEvents cs As New ClassHighscore(10) 'Klasse mit der Anzahl der maximalen Einträge Instanzieren
      3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      4. Me.ListView1.View = View.Details
      5. Me.ListView1.Columns.Add("Name")
      6. Me.ListView1.Columns.Add("Score")
      7. cs.Load("test.dat")
      8. End Sub
      9. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      10. cs.Save("test.dat")
      11. End Sub
      12. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      13. cs.AddItem(Me.TextBox1.Text, CInt(Me.TextBox2.Text))
      14. Me.TextBox1.Text = ""
      15. Me.TextBox2.Text = ""
      16. End Sub
      17. Private Sub cs_HighscoreListUpdated() Handles cs.HighscoreListUpdated
      18. Me.ListView1.Items.Clear()
      19. For i As Integer = 0 To cs.GetHighscoreList.Count - 1
      20. Me.ListView1.Items.Add(cs.GetHighscoreList(i).Name).SubItems.Add(cs.GetHighscoreList(i).Score)
      21. Next
      22. End Sub
      23. End Class

      Kommentare erwünscht. ;)

      gruss

      mikeb69
      ich glaub ich bin zu dumm aber ich bin auch noch totaler anfänger in VB ... Ich hab alles in ne klasse und in ne form gegeben ... aber wie mache ich das jezz das der Score einem bestimmtem wert entspricht? (In meinem Fall dem gleichen Wert des Integers "intTag") ^^

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Im1337N00b“ ()

      Hier mein Code mit den Erweiterungen die bei mir FEHLER ergeben:

      1. Auch eine Level funktion mit einer Textbox

      2. Auch eine Spielzeit funktion mit einer Textbox

      3.Eine Modus funktion also ob leicht hwer oder normal usw...


      Der Code für die Classe ClassHighscore bei mir :



      Spoiler anzeigen


      VB.NET-Quellcode

      1. Imports System
      2. Imports System.IO
      3. Imports System.Runtime
      4. Imports System.Runtime.SerializationImports System.Runtime.Serialization.Formatters.Binary
      5. <Serializable()> Public Class ClassHighscore
      6. 'highscore structur
      7. <Serializable()> Public Structure highscorePublic Sub New(ByVal n As String, ByVal s As Integer, ByVal l As Integer, ByVal sp As Integer, ByVal m As String)
      8. Name = n
      9. Score = s
      10. Level = l
      11. spielzeit = sp
      12. modus = m
      13. End Sub
      14. Public Name As String
      15. Public Score As Integer
      16. Public Level As Integer
      17. Public spielzeit As Integer
      18. Public modus As String
      19. End Structure
      20. 'liste aller highscoresPrivate HighScores As List(Of highscore)
      21. 'Event welches ausgelöst wird, wenn die Highscore Liste aktualisiert wurde.Public Event HighscoreListUpdated()
      22. Private _maxcount As Integer = 10 'maximale anzahl an highscore einträgen
      23. ''' <summary>Neue Instanz der ClassHighscore.</summary>Public Sub New(ByVal maxcount As Integer)
      24. _maxcount = maxcountHighScores = New List(Of highscore)
      25. End Sub
      26. ''' <summary>Fügt einen neuen Eintrag zur Highscore Liste hinzu,
      27. ''' wenn dieser größer als der aktuell kleinste Eintrag ist.</summary>
      28. ''' <param name="name">Name des Spielers.</param>
      29. ''' <param name="score">Punkte (Score).</param>
      30. ''' <returns>True wenn eingetragen werden konnte - sonst False.</returns>
      31. ''' <remarks></remarks>
      32. Public Function AddItem(ByVal name As String, ByVal score As Integer) As BooleanDim hs As New highscore(name, score, level, spielzeit, modus)
      33. Return additemtolist(hs)
      34. End Function
      35. ''' <summary>Fügt einen neuen Eintrag zur Highscore Liste hinzu,
      36. ''' wenn dieser größer als der aktuell kleinste Eintrag ist.</summary>
      37. ''' <param name="hs">Highscore als Strukture Highscore.</param>
      38. ''' <returns>True wenn eingetragen werden konnte - sonst False.</returns>
      39. ''' <remarks></remarks>
      40. Public Function AddItem(ByVal hs As highscore) As BooleanReturn additemtolist(hs)
      41. End Function
      42. ''' <summary>Gemeinsame Funktion zum Hinzufügen von Einträgen zur Highscore Liste.</summary>
      43. Private Function additemtolist(ByVal hs As highscore) As Boolean
      44. 'zur liste hinzufügen
      45. HighScores.Add(hs)
      46. 'sortierenHighScores.Sort(AddressOf sort_highscores)
      47. 'prüfen ob mehr einträge zur verfügung stehen als erwünscht.
      48. If HighScores.Count > _maxcount Then
      49. HighScores.RemoveAt(_maxcount)
      50. End If
      51. 'event auslösenRaiseEvent HighscoreListUpdated()
      52. End Function
      53. ''' <summary>Sortiert die Highscore Liste nach Punkten (Score).</summary>
      54. ''' <remarks></remarks>
      55. Private Function sort_highscores(ByVal hs1 As highscore, ByVal hs2 As highscore) As Boolean
      56. If hs1.Score > hs2.Score Then
      57. Return True
      58. Else
      59. Return False
      60. End If
      61. End Function
      62. #Region "Properties"
      63. ''' <summary>Gibt die Highscore Liste zurück.</summary>
      64. ''' <remarks></remarks>Public ReadOnly Property GetHighscoreList() As List(Of highscore)
      65. GetReturn HighScores
      66. End GetEnd Property
      67. #End Region
      68. #Region "Save and Load"
      69. ''' <summary>Lädt die Highscores.</summary>
      70. ''' <param name="filename">Highscoredatei mit Pfad.</param>
      71. ''' <remarks></remarks>Public Sub Load(ByVal filename As String)
      72. 'datei existiert nicht
      73. If File.Exists(filename) = False ThenThrow New Exception("File not Found")
      74. End If
      75. 'datei ladenDim fs As New FileStream(filename, FileMode.Open)
      76. Dim formatter As New BinaryFormatterHighScores = DirectCast(formatter.Deserialize(fs), List(Of highscore))
      77. fs.Close()
      78. 'event auslösenRaiseEvent HighscoreListUpdated()
      79. End Sub
      80. ''' <summary>Speichert die Highscores.</summary>
      81. ''' <param name="filename">Dateiname (mit Pfad) unter welchem die Highscores gespeichert werden sollen.</param>
      82. ''' <remarks></remarks>Public Sub Save(ByVal filename As String)
      83. 'datei speichernDim fs As New FileStream(filename, FileMode.Create)
      84. Dim formatter As New BinaryFormatter
      85. formatter.Serialize(fs, HighScores)
      86. fs.Close()End Sub
      87. #End Region
      88. End Class








      Der code für die Form1 mit jetzt natürlich den mehreren Textboxen.

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private WithEvents cs As New ClassHighscore(10) 'Klasse mit der Anzahl der maximalen Einträge InstanzierenPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      3. Me.ListView1.View = View.DetailsMe.ListView1.Columns.Add("Name")
      4. Me.ListView1.Columns.Add("Score")Me.ListView1.Columns.Add("Level")
      5. Me.ListView1.Columns.Add("Spielzeit")Me.ListView1.Columns.Add("Modus")
      6. cs.Load("test.dat")
      7. End SubPrivate Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs)
      8. cs.Save("test.dat")
      9. End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      10. cs.AddItem(Me.TextBox1.Text, CInt(Me.TextBox2.Text))
      11. Me.TextBox1.Text = ""
      12. Me.TextBox2.Text = ""
      13. Me.TextBox3.Text = ""
      14. Me.TextBox4.Text = ""
      15. Me.TextBox5.Text = ""
      16. End SubPrivate Sub cs_HighscoreListUpdated() Handles cs.HighscoreListUpdated
      17. Me.ListView1.Items.Clear()For i As Integer = 0 To cs.GetHighscoreList.Count - 1
      18. Me.ListView1.Items.Add(cs.GetHighscoreList(i).Name).SubItems.Add(cs.GetHighscoreList(i).Score).SubItems.Add(cs.GetHighscoreList(i).Level).SubItems.Add(cs.GetHighscoreList(i).spielzeit).SubItems.Add(cs.GetHighscoreList(i).modus)
      19. NextEnd Sub
      20. End Class




      Es ergibt bei mir auf diesen Stellen fehler ( Das was ROT ist!) :

      Einmal bei der Form 1:

      Private Sub cs_HighscoreListUpdated() Handles cs.HighscoreListUpdated
      Me.ListView1.Items.Clear()For i As Integer = 0 To cs.GetHighscoreList.Count - 1
      Me.ListView1.Items.Add(cs.GetHighscoreList(i).Name).SubItems.Add(cs.GetHighscoreList(i).Score).SubItems.Add(cs.GetHighscoreList(i).Level).SubItems.Add(cs.GetHighscoreList(i).spielzeit).SubItems.Add(cs.GetHighscoreList(i).modus)
      NextEnd Sub




      Und 2. bei der Classe:
      Public Function AddItem(ByVal name As String, ByVal score As Integer) As BooleanDim hs As New highscore(name, score, level, spielzeit, modus)
      Return additemtolist(hs)End Function

      Edit by der_Kurt:
      Die Farbe ROT ist den Moderatoren vorbehalten, siehe Boardregeln.
      Keine Doppelposts. Das nächste Mal gibt es eine Verwarnung!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „der_Kurt“ ()

      Starz schrieb:

      Kannn mir jetzt weiter helfen....
      Mein System: Windows 7, Visual basic 2010 mit .net ramework v2.0 als einstellung für dieses projekt, 64-Bit, intel i5 und ati grafik, laptop


      Jop, kann ich :
      www.vb-paradise.de/programmieren/hauptforum/19781-entwickler-ressourcen-und-tools-buecher-und-webcasts/
      http://openbook.galileocomputing.de/vb_net/
      www.vb-paradise.de/index.php?page=Rules

      Edit : Was für ein Fehler tritt den auf ?

      Viel Spaß beim Lesen, Trudi

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trudi“ ()

      Wer braucht Hilfe? Er, oder du?
      Hat er dasselbe System wie du? -> Wohl kaum..
      Will er das programmieren erlernen, oder du? -> Ich denke eher du, er wird wohl sein Wissen ausweiten wollen...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Ja ok Du hast recht:
      Hier die Fehler die bei mir das programm aus gibt:

      "level" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
      "modus" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
      "spielzeit" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
      "SubItems" ist kein Member von "System.Windows.Forms.ListViewItem.ListViewSubItem".



      Und hier die warnung des Programms:

      Die additemtolist-Funktion gibt nicht für alle Codepfade einen Wert zurück. Fehlt eine Return-Anweisung?


      Es wäre toll wenn ihr richtige Antworten postet di mir weiter helfen...

      Sonst Danke.
      Man deklariert wie folgt, bei 'Typ' setzt du den Typ von der Variable fest (z.B. string, integer, double) :

      VB.NET-Quellcode

      1. Dim variable As Typ


      Zu der Warnung :
      Du musst irgendwo in einer Verschachtelung eine Return-Anweisung angeben.

      VB.NET-Quellcode

      1. return "wasweißich";