Seite 2 von 2

Verfasst: 11.05.2006 18:12
von Kaeru Gaman
@Hardfalcon

dann könnte ich sie auch in konstanten packen!

eine Highscoreliste muss zur laufzeit mehrfach sortierbar sein, weil ich bei jedem spiel einen beliebigen platz in der liste erreichen kann.

ansonsten ist es eine beliebige textausgabe.


wobei ich mich frage,
a) wie er sie denn vorher sortiert bekommt, wenn es kein array ist. (außer es sind willkürliche fixwerte)
b) warum er sie erst in ne datei schreibt und dann ausgeben will (wohl weil er arrays nich kennt)

also, irgendwie ist das ganze höchst spanisch, ey...

Verfasst: 11.05.2006 19:08
von Svking
ui ui sieht ziemlich kompliziert aus ^^
aber ich denke ich habe den großteil verstanden.

nur wie bekomme ich jetzt hier:

Code: Alles auswählen

DeinArray (1)="Hallo" 
DeinArray (2)="Welt" 
DeinArray (3)="Hallo" 
DeinArray (4)="da draußen" 
statt Hallo, Welt etc.
meine Zeilen aus der Datei rein?

@hardfalcon
Ja die werden schon in der Liste sortiert

Verfasst: 11.05.2006 19:43
von Programie
Du kannst es aber auch mit einer LinkedList machen.

Code: Alles auswählen

; Beispiel für PureBasic 4.00


NewList Score.s(); LinkedList erstellen

; *** Datei auslesen ***

If ReadFile(#True,"HighScore.txt"); Datei öffnen
  Repeat; Starten einer Repeat-Until Schleife
   AddElement(Score()); Neues Element hinzufügen
   Score()=ReadString(#True); Zeile aus der Datei auslesen und in die Linkedlist einfügen
  Until Eof(#True); Schleife wiederholen bis das Dateiende erreicht wurde
 CloseFile(#True); Datei schließen
EndIf

; *** LinkedList auslesen ***

List=CountList(Score()); Elemente der Liste zählen
 If List; Wenn Elemente in der Liste vorhanden sind...
  If StartDrawing(ScreenOutput()); ...Anfangen zu zeichnen
    For Count=0 To List; Liste in einer For-Next Schleife aufzählen
     SelectElement(Score(),Count); Element auswählen
     DrawText(x,y,Score()); Text anzeigen
    Next; Ende der Schleife
   StopDrawing(); Zeichnen beenden
  EndIf
 EndIf

Verfasst: 11.05.2006 22:43
von Kiffi
@Programie

ein paar Anmerkungen zu Deinem Code:

Code: Alles auswählen

If ReadFile(#True,"HighScore.txt"); Datei öffnen
hat das einen besonderen Grund, warum Du #True als Kanalnummer
verwendest? Ist zwar nicht grundsätzlich falsch, aber eher ungewöhnlich.

Ich persönlich arbeite gerne mit #PB_Any

Code: Alles auswählen

FF = ReadFile(#PB_Any,"HighScore.txt")
If FF
  [...]
  CloseFile(FF)
EndIf
Bei diesem Code gibt's Probleme, wenn die Datei initial leer ist:

Code: Alles auswählen

Repeat; Starten einer Repeat-Until Schleife
  [...]
Until Eof(#True); Schleife wiederholen bis das Dateiende erreicht wurde
Arbeite lieber mit einer kopfgesteuerten Schleife:

Code: Alles auswählen

While Eof(#True) = 0
  [...]
Wend
und folgendes Konstrukt:

Code: Alles auswählen

For Count=0 To List; Liste in einer For-Next Schleife aufzählen
  SelectElement(Score(),Count); Element auswählen
  DrawText(x,y,Score()); Text anzeigen
  [...]
...kann man wie folgt vereinfachen:

Code: Alles auswählen

ForEach Score()
  DrawText(x,y,Score()); Text anzeigen
  [...]
Dann brauchst Du weder eine Zählvariable noch ein SelectElement().

Grüße ... Kiffi

Verfasst: 11.05.2006 23:08
von Kaeru Gaman
Svking hat geschrieben:@hardfalcon
Ja die werden schon in der Liste sortiert
ähm... wie sortierst du die liste denn?

Verfasst: 12.05.2006 08:26
von ts-soft
HighScorlisten haben normallerweise eine feste Anzahl Einträge, so das eine LinkList das ganze nur verlangsamt.
Ein Array für die HighScores braucht man also sowieso, man kann dieses also zur Speicherung nehmen, wobei dann nur noch in String umgewandelt werden muß Str(HighScore(x))

Verfasst: 12.05.2006 09:28
von Kiffi
> Ein Array für die HighScores braucht man also sowieso

nicht zwangsläufig. Es mag zwar sein, dass LinkedLists langsamer sind als
Arrays, aber die paar Millisekunden fallen bei der Verwaltung von Highscores
nicht auf.

Zudem halte ich die Verwendung von LinkedLists in diesem Zusammenhang
für einfacher handhabbar. Alle Scores werden per AddElement der LinkedList
hinzugefügt, dann sortiert und beim Anzeigen oder Speichern werden nur die
ersten X Ergebnisse berücksichtigt

Aber das ist sicherlich Geschmackssache. Der eine kommt besser mit Arrays
zurecht, der andere (z.B. ich) arbeitet lieber mit LinkedLists.

Grüße ... Kiffi

Verfasst: 12.05.2006 09:39
von Kaeru Gaman
hm... also, ich seh hier einen kleinen nachteil bei LL:

wenn die HSliste 10 einträge hat, und ich 20x spiele, dann hat sie 30 einträge nach deinem konzept?
und wenn das game dann mal nen monat läuft und immer wieder gespielt wird?

für eine liste mit 10 einträgen verwende ich ein array mit 11 feldern.
bei jeder neuen score wird die auf den 11ten platz gesetzt, dann das array sortiert.
auch ich betrachte nur die ersten 10 bei anzeigen und speichern, aber meine gesamtzahl übersteigt niemals 11.
außerdem finde ich die array lösung einfacher und besser nachzuvollziehen.

klar, im endeffekt ist es geschmackssache...

Verfasst: 12.05.2006 11:26
von Kiffi
> wenn die HSliste 10 einträge hat, und ich 20x spiele, dann hat sie 30
> einträge nach deinem konzept?

jepp.

> und wenn das game dann mal nen monat läuft und immer wieder gespielt
> wird?

es ist eigentlich eher unwahrscheinlich, dass ein Spiel so lange
ununterbrochen immer wieder gespielt wird, ohne dass es (oder der
Rechner) zwischendurch mal ausgeschaltet wird. Aber selbst da sehe ich
den (natürlich überflüssigen) Speicherverbrauch nicht so kritisch.

> für eine liste mit 10 einträgen verwende ich ein array mit 11 feldern.

ist naturlich auch eine gute Methode für die Speicherung von
Highscore-Einträgen.