Kleines Problem mit Highscoreliste?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

bruce85

Betreff: Kleines Problem mit Highscoreliste?

BeitragMo, Okt 20, 2008 5:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich habe in BM eine Highscoreliste für mein Spiel(Solitaire) geschrieben, hier ist mal ein Screen:
Screen

Ich möchte gerne die Highscoreliste umgekeehrt Sortieren lassen.
Hier mal meine Funktion:
Code: [AUSKLAPPEN]
Function HighscoreSort()
  For I=0 To 6
    For J=I To 6
      If SpielSteinUebrig[I] < SpielSteinUebrig[J] Then
        Local MerkerA:String = SpielerName[I]
        SpielerName[I] = SpielerName[J]
        SpielerName[J] = MerkerA

        MerkerB = SpielSteinUebrig[I]
        SpielSteinUebrig[I] = SpielSteinUebrig[J]
        SpielSteinUebrig[J] = MerkerB

        For y=0 To 12
          For x=0 To 16
            MerkerC = SpielBrett[x,y,I]
            SpielBrett[x,y,I] = SpielBrett[x,y,J]
            SpielBrett[x,y,J] = MerkerC
          Next
        Next
        For y=0 To 12
          For x=0 To 16
            MerkerD = SpielGeloest[x,y,I]
            SpielGeloest[x,y,I] = SpielGeloest[x,y,J]
            SpielGeloest[x,y,J] = MerkerD
          Next
        Next
      EndIf
    Next
  Next
End Function


Damit Sortiere ich die Liste abwärts, also z.B. von 30 auf 1......
Das funktioniert, Speichert und liest es auch ordentlich wieder aus.
Ich möchte die Liste gerne aufwärts Sortieren.
Ich habe das mal so versucht:
Code: [AUSKLAPPEN]
Function HighscoreSort()
  If SpielSteinUebrig[6] = 0 Then
    Return
  EndIf
  For I=0 To 6
    For J=I To 6
      If SpielSteinUebrig[I] > SpielSteinUebrig[J] Then
        Local MerkerA:String = SpielerName[I]
        SpielerName[I] = SpielerName[J]
        SpielerName[J] = MerkerA

        MerkerB = SpielSteinUebrig[I]
        SpielSteinUebrig[I] = SpielSteinUebrig[J]
        SpielSteinUebrig[J] = MerkerB

        For y=0 To 12
          For x=0 To 16
            MerkerC = SpielBrett[x,y,I]
            SpielBrett[x,y,I] = SpielBrett[x,y,J]
            SpielBrett[x,y,J] = MerkerC
          Next
        Next
        For y=0 To 12
          For x=0 To 16
            MerkerD = SpielGeloest[x,y,I]
            SpielGeloest[x,y,I] = SpielGeloest[x,y,J]
            SpielGeloest[x,y,J] = MerkerD
          Next
        Next
      EndIf
    Next
  Next
  SpielSteinUebrig[6] = 0
End Function


leider funktioniert das irgendwie nicht, er zeigt dann garnix mehr an, in der Highscore.txt werden auch die Daten wieder gelöscht Rolling Eyes

Weiss einer eine lösung, wie ich das ambesten machen kann?

Ich bedanke mich schonmal im Voraus.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragMo, Okt 20, 2008 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Weiss keiner eine lösung?
Es geht mir im Prinzip nur um das Sortieren der Highscoreliste.
Wenn ich es andersrum Sortieren lasse, dann bekomme ich dieses ergebnis:
Screen

Platz 1 ist dann immer Leer.

Wie könnte ich das Problem lösen?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
  • Zuletzt bearbeitet von bruce85 am Di, Okt 21, 2008 2:19, insgesamt 2-mal bearbeitet

Suco-X

Betreff: .....

BeitragMo, Okt 20, 2008 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend.
Wie ich sehe liegen die Daten in verschiedenen Arrays vor und ich frage mich, wieso sie nicht in Klassen zusammengefasst sind. Dies würde dir auch das sortieren erleichtern, da BlitzMax schon Funktionen zum sortieren von Listen/Arrays bereitstellt. Ohne deinen Code richtig ausführen zu können ist mir persönlich eine Fehlersuche zu kompliziert und ich kann dir deswegen nur die besagte Alternative + Beispielcode bieten.

Code: [AUSKLAPPEN]

Strict

Type THighscoreUser
   Field spielsteinUebrig:int
   Field nick:String
   
   Rem
      Diese Methode wird automatisch von der BlitzMax Sortierfunktion
      aufgerufen, wenn entweder eine Liste (List.Sort()) oder ein Array(Array.Sort())
      sortiert wird. Natürlich müssen sich in der Liste/Array objekte des Types
      THighScoreUser befinden.
   End Rem
   
   Method compare(other:Object)
      Local user:THighscoreUser
      user = THighscoreUser(other)
      Return spielsteinUebrig-user.spielsteinUebrig
   End Method

End Type


Type THighscore
   Field listUsers:TList
   
   Method New()
      listUsers = New TList
   End Method
   
   Method addUser(spielsteinUebrig:Int, nick:String)
      Local instance:THighscoreUser
      instance = New THighscoreUser
      instance.spielsteinUebrig = spielsteinUebrig
      instance.nick = nick
      listUsers.addLast(instance)
   End Method
   
   Method out()
      For Local user:THighscoreUser = EachIn listUsers
         Print "Uebrig: "+user.spielsteinUebrig+" | Nick: "+user.nick
      Next
   End Method

End Type

Local highscore:THighscore = New THighscore

For Local i:Int = 0 Until 6
   highscore.addUser(Rand(0,50), "Nick"+i)
Next


Print ""
Print "Unsortiert"
highscore.out()
highscore.listUsers.sort()
Print ""

Print "Sortiert"
highscore.out()
Print ""

Print "Rückwärts sortiert"
highscore.listUsers.sort(False)
highscore.out()
Print ""



Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

bruce85

BeitragMi, Okt 22, 2008 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir.
Gibt es denn keine andere möglichkeit das Problem zu lösen?
Mit Types kenne ich mich schon gut aus, aber möchte keine zusätzliche Types für mein Spiel verwenden.

In Blitz3D könnte ich es z.B. so lösen:
Code: [AUSKLAPPEN]
Function HighscoreSort()
  If SpielSteinUebrig(6) = 0 Then
    Return
  EndIf
  For I=0 To 6
    For J=I To 6
      If SpielSteinUebrig(I) > SpielSteinUebrig(J) Then
        MerkerB$ = SpielSteinUebrig(I)
        SpielSteinUebrig(I) = SpielSteinUebrig(J)
        SpielSteinUebrig(J) = MerkerB
      EndIf
    Next
  Next
  SpielSteinUebrig(6) = 0
End Function


aber in BlitzMax funktioniert das nicht so, die Funktion wird sofort wieder verlassen an dieser stelle und es wird noch nicht einmal ein Teil der Liste Sortiert:
Code: [AUSKLAPPEN]
If SpielSteinUebrig(6) = 0 Then
  Return
EndIf


Gibts denn keine andere lösung außer die Einträge in einer Liste zu speichern mit Types?
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragFr, Okt 24, 2008 4:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab das Problem jetzt so gelöst:
Code: [AUSKLAPPEN]
'Highscoreliste Sortieren
Function HighscoreSort()
  Local I:Int=5,J:Int=5
  Local x:Int,y:Int
  Local SBrett:Int

  While I >= 0
    While J >= 0
      For SBrett=0 To 3
        If SpielSteinUebrig[J,SBrett] < SpielSteinUebrig[I,SBrett] Then
          Local MerkerA:String = SpielerName[I,SBrett]
          SpielerName[I,SBrett] = SpielerName[J,SBrett]
          SpielerName[J,SBrett] = MerkerA

          Local MerkerB:Int = SpielSteinUebrig[I,SBrett]
          SpielSteinUebrig[I,SBrett] = SpielSteinUebrig[J,SBrett]
          SpielSteinUebrig[J,SBrett] = MerkerB

          Local MerkerE:String = HighscoreZeit[I,SBrett]
          HighscoreZeit[I,SBrett] = HighscoreZeit[J,SBrett]
          HighscoreZeit[J,SBrett] = MerkerE

          For y=0 To 12
            For x=0 To 16
              Local MerkerC = SpielBrett[x,y,I,SBrett]
              SpielBrett[x,y,I,SBrett] = SpielBrett[x,y,J,SBrett]
              SpielBrett[x,y,J,SBrett] = MerkerC
            Next
          Next
          For y=0 To 12
            For x=0 To 16
              Local MerkerD = SpielGeloest[x,y,I,SBrett]
              SpielGeloest[x,y,I,SBrett] = SpielGeloest[x,y,J,SBrett]
              SpielGeloest[x,y,J,SBrett] = MerkerD
            Next
          Next
        EndIf
      Next
      J = J - 1
    Wend
    J = 5
    I = I - 1
  Wend
End Function

Es bestehen 6 Einträge in der Highscoreliste und ich lasse beim Sortieren nur 6 mal die While schleife Wiederholen, da ich den neuen Eintrag auf Platz 6 setze und der letzte Eintrag sowieso verschwindet, wenn ein neuer Highscore ereicht wird und lasse anschließend die Liste Sortieren.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragSo, Okt 26, 2008 9:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal,
ich hab noch ein kleines Problem beim Sortieren der Highscore liste.
Also, zuerst Sortiere ich die Liste aufsteigend nach verbleibende Kugeln,
das klappt schonmal, jetzt Prüfe ich, ob untereinander die gleiche
Highscore Einträge bestehen und lasse es anschließend noch nach Bestzeit Sortieren.

Hier erstmal der Screen:
Screen

Die Zeit lasse ich in Sekunden von der Highscore.txt laden, nur bei Highscore liste
lasse ich die Sekunden in MM:SS anzeigen.

Jetzt gibts ein kleines Problem beim Sortieren nach Sekunden,
jedesmal wenn ich die Highscoreliste aufrufe, rutscht der
erste Eintrag (Test 2) eins runter und (Test 5) erscheint da wo (Test 2) war u.s.w.
Das darf natürlich nicht passieren.

Hier mal der Code:
Code: [AUSKLAPPEN]
'Highscore Prüfen, dann Sortieren
Function CheckHighscore(SBrett:Int)
  Local I:Int=5,J:Int=5
  Local x:Int,y:Int

  While I >= 0
    While J >= 0
      If SpielSteinUebrig[J,SBrett] < SpielSteinUebrig[I,SBrett] Then
        HighscoreSort(I,J,SBrett)
      EndIf
      If SpielSteinUebrig[J,SBrett] = SpielSteinUebrig[I,SBrett] Then
        If HighscoreZeit[J,SBrett] < HighscoreZeit[I,SBrett] Then
          HighscoreSort(I,J,SBrett)
        EndIf
      EndIf
      J = J - 1
    Wend
    J = 5
    I = I - 1
  Wend
End Function


Ich hab zwar herausgefunden, wieso das nicht geht, das Problem liegt beim ersten Eintrag(Test 1),
wenn ich bei (Test 1) die Zeit auf 5 Sekunden in der Highscore.txt änder, dann klappt es.

Bei dieser If abfrage
Code: [AUSKLAPPEN]
If SpielSteinUebrig[J,SBrett] = SpielSteinUebrig[I,SBrett] Then
  If HighscoreZeit[J,SBrett] < HighscoreZeit[I,SBrett] Then
    HighscoreSort(I,J,SBrett)
  EndIf
EndIf

ist etwas nicht in Ordnung, habt ihr vieleicht eine ahnung, was ich falsch mache?

Vielen Dank schonmal.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group