Kleines Problem mit Highscoreliste?
Übersicht

bruce85Betreff: Kleines Problem mit Highscoreliste? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group