Spielerranking

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Spielerranking

BeitragDi, Apr 23, 2013 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
hi leute ich habe da ein problem ein Spielerranking zu Programmieren.

Code: [AUSKLAPPEN]
Global Player:TPlayer
Type TPlayer
   Global List:TList=New TList
   Field Name$
   Field Punkte%
   
   Function ADD(Name$,Punkte%)
      Player:TPlayer=New TPlayer
      Player.name=name
      Player.punkte=punkte
      
      List.Addlast Player
   End Function
End Type


wie kann ich im nachhinein die liste durchblättern und nach dem höchsten punktstand sortieren?
also irgendwie steh ich voll auf dem schlauch... mein ansatz...


Code: [AUSKLAPPEN]
for P:Tplayer=eachin tplayer.list
for P1:Tplayer=eachin tplayer.list
if p1.name=p.name then
else
if p.punkte>p1.punkte then



aber das problem ist ja dann auch ... naja wie sortiere ich richtig? danke im vorraus

BlitzMoritz

BeitragDi, Apr 23, 2013 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Bau in deine Klasse TPlayer eine Methode "Compare:Int(P:TPlayer)" ein, bei der du die Punkte vergleichst und je nachdem 1 oder 0 zurückgibst.
TList.sort() sortiert dann nach deinen Kriterien.

Mathias-Kwiatkowski

BeitragDi, Apr 23, 2013 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
wie verwende ich genau TList.Sort()

also wie beziehe ich es auf die punkte?=

Xeres

Moderator

BeitragDi, Apr 23, 2013 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Sort Methode verwendet die Compare Methode der Objekte. Wenn du sie wie BlitzMoritz schrieb, implementierst, wird die liste automatisch richtig sortiert.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Tennisball

BeitragDi, Apr 23, 2013 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Habe dir ein Codebeispiel geschrieben.
BlitzMax: [AUSKLAPPEN]
SuperStrict


Type TTestType
Field Punkte:Int

Method Compare:Int( O:Object )
Local Test:TTestType = TTestType( O ) ' Von Object nach TTestType casten
If Self.Punkte = Test.Punkte Then Return 0 ' Gleiche Punktzahl -> 0
If Self.Punkte > Test.Punkte Then Return -1 ' Andere Punktzahl ist kleiner als die eigene -> -1
If Self.Punkte < Test.Punkte Then Return 1 ' Andere Punktzahl ist größer als die eigene -> 1
End Method
End Type



Local TestList:TList = CreateList()
Local Test:TTestType

For Local i:Int = 0 To 9
Test = New TTestType
Test.Punkte = i
Print Test.Punkte
TestList.AddLast( Test )
Next

Print "Jetzt sortieren."


TestList.Sort( True, compareFunc ) ' compareFunc zum vergleichen nutzen
TestList.Sort() ' Compare von TTestType nutzen


For Test = EachIn TestList
Print Test.Punkte
Next


Function compareFunc:Int( O1:Object, O2:Object )
Local Test1:TTestType = TTestType( O1 )
Local Test2:TTestType = TTestType( O2 )
Return Test2.Punkte - Test1.Punkte
End Function


Es ist mMn sauberer, eine eigene Funktion für das Vergleichen zu schreiben, ohne Compare zu überschreiben (Ich habe in meinem Code spaßeshalber beides implementiert). Mit einer Extrafunktion kannst du später auch nach verschiedenen Aspekten sortieren. Wenn du Compare überschreiben solltest, musst du darauf achten, dass du 0 zurückgeben musst, wenn sich die beiden verglichenen Objekte gleichen, sonst kommt es zu Fehlern bei z.B. List.Contains().

Mit freundlichen Grüßen,
Tennisball

Mathias-Kwiatkowski

BeitragDi, Apr 23, 2013 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
also wäre es demnach so?

Code: [AUSKLAPPEN]
Global Player:TPlayer
Type TPlayer
   Global List:TList=New TList
   Field Name$
   Field Punkte%
   
   Function ADD(Name$,Punkte%)
      Player:TPlayer=New TPlayer
      Player.name=name
      Player.punkte=punkte
       
      List.Addlast Player
   End Function

   Method Compare:Int(P:TPlayer)
       For P1:tplayer=EachIn list
           If p.punkte> p1.punkte Then Return 1
       Next
       Return 0
   End Method

End Type

For p:tplayer=EachIn tplayer.list
   tplayer.list.sort(compare(p))
Next




edit : zu späd gesehen--- danke

DAK

BeitragMi, Apr 24, 2013 11:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Mathias, du hast noch einen Fehler in der Compare: du vergleichst das einkommende Objekt mit jedem Objekt in der Liste. Alles was du brauchst, ist es mit dem aktuellen Objekt, also Self zu vergleichen.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group