Highscore

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Beitrag 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
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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
BildBildBildBild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Svking hat geschrieben:@hardfalcon
Ja die werden schon in der Liste sortiert
ähm... wie sortierst du die liste denn?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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))
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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.
Antworten