Entwickler-Ecke

Sonstiges (Delphi) - Highscore richtig sortieren


hibbert - Sa 15.02.03 22:08
Titel: Highscore richtig sortieren
hallo,

ich habe ein kleines spiel gemacht (oho) und dort kann man sich in eine Highscoreliste eintragen. und so sieht sie bis jetzt aus:
eine datei (highscore.txt) liegt auf meinem server.
wenn der spieler sich in die highscoreliste eintragen möchte, wird die datei highscore.txt vom webserver heruntergeladen (also abgespeichert).
dann wird sie geöffnet. ab hier beginnt mein problem:
die highscore.txt wird in eine listbox geladen. nun kann ich ja die funktion
listbox1.sorted:=true verwenden, doch diese ist
1. ungenau
2. in der verkehrten reihenfolge für eine highscoreliste.
der befehl listbox1.sorted:=true sortiert leider nur von klein nach groß, ich möchte dies aber genau andersrum haben. doch nur wie???
mfg hibbert
achso, bevor ich es noch vergesse:
das mit dem vorher abspeichern der datei highscore.txt ist zu einfach, um daten zu fälschen, kann man nicht so etwas ähnliches machen:
listbox1.lines.loadfromfile('http://meinedomain.de/highscore.txt') ???
vielleicht kennt ja auch noch einer eine bessere und einfachere lösung meines problem.

nochmal mfg hibbert

Moderiert von user profile iconTino: Titel geändert.


Delete - Sa 15.02.03 22:36

Nein, du mußt sie immer runterladen. Aber was spricht dagegen sie sofort wieder zu löschen, wenn sie in die Listbox geladen wurde?


hibbert - Sa 15.02.03 23:52

hai,
natürlich lösche ich die datei sofort nach dem einfügen, aber ich dachte das man das vielleciht auch anders machen kann. naja so gehts ja auch.
aber zurück zum Highscore thema, wie bekomme ich die richtige reihenfolge hin? das Problem ist, dass sich ja unbegrenzt viele user in die highscore liste eintragen können. also butter bei de fische: wie kann ich das problem mit der reihenfolge lösen???

mfg hibbert


Tino - So 16.02.03 13:40

Du musst das Sortieren der Liste wohl selbst machen. Zeigt doch mal wie eine Zeile aus der Datei aussieht.

Gruß
TINO


hibbert - So 16.02.03 20:31

hai,
ok so sieht eine zeile aus:

9999.............Name


mfg hibbert


Tino - Mo 17.02.03 10:46

Ist der Punktestand immer 4 Stellig? Was sollten die Punkte in der Zeile?

Grluß
TINO


hibbert - Mo 17.02.03 19:50

hai,
jain, sie kann auch schonmal 5 stellig werden (glaube ich aber nicht).

die punkte sind als Platzhalter gedach, sodass der User nicht in der zeile verruscht. wieso, stören die etwa beim sortieren ?

mfg hibbert


Fred Ferkel - Mo 17.02.03 21:21

hi

Am einfachsten wärs doch wenn du es über ne ini(-> steht bestimmt in der FAQ) machst oder in dem format
punkte1
name1
punkte2
name2
punkte3
name3
etc.

speicherst..

anbei ist die sortierfunktion eines meiner progs wobei ich die beiden arrays global deklariert hatte
highscores_p:array [1..11] of integer;
highscores_s:array [1..11] of string;


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function check_highscores(points:integer;name:string):boolean;
var l1  : integer;
    hlpp : integer;
    hlpn : string;
begin
  result:=false;
  highscores_p[11]:=points;
  highscores_s[11]:=name;
  l1:=11;
  while (l1>1)and(highscores_p[l1]>highscores_p[l1-1]) do
    begin
      result:=true;
      hlpp:=highscores_p[l1-1];
      hlpn:=highscores_s[l1-1];
      highscores_p[l1-1]:=highscores_p[l1];
      highscores_s[l1-1]:=highscores_s[l1];
      highscores_p[l1]:=hlpp;
      highscores_s[l1]:=hlpn;
      dec(l1);
    end;
  if result then writeini;
end;


cya


hibbert - Di 18.02.03 18:27

hai,
danke, wie ich in eine ini datei schreibe weiß ich, aber wie soll ich das mit diesem code schnipsle machen? gut ich weiß, dass ich diesen code unter der implementation einfügen muss. aber die ich muss doch garantiert den pfad zur ini datei angeben, oder ? :?
wenn ja wo, und wie?
aber danke schön schon einmal für deine hilfe.

mfg hibbert


Fred Ferkel - Di 18.02.03 23:35

hi
na wenn du noch die beiden globalen variablen

Quelltext
1:
2:
highscores_p: array[1..11] of integer;
highscores_s: array[1..11] of string;

global definiert hast, kannst du die 10werte aus der ini in die ersten 10 array elemente laden und wenn das spiel vorbei ist bei game over oder so musst du einfach nur

Quelltext
1:
check_highscores(punktzahldesspielers,namedesspielers);                    

aufrufen und die funktin gibt noch mit zurück ob der spieler in den highscores ist als könnte man auch auch

Quelltext
1:
2:
if check_highscores(punktzahldesspielers,namedesspielers)then
  showmessage('SIE SIND IN DEN HIGHSCORES!');

benutzen.

cya


hibbert - Fr 21.02.03 15:55

hallo,
danke, aber ich habe da warscheinelich eine recht dumme frage:
wo ist denn da nun die listbox? :oops:
ich muss doch die namen und punkte darin sortieren.
und wieviele listboxen brauche ich bei diesem code, und wie müssen die heißen?
mfg hibbert


Fred Ferkel - Fr 21.02.03 18:18

naja also das ist blos der code um die dinger zu sortieren, geladen gesichert und angezeigt werden die damit nciht..
aber anzeigen geht so

Quelltext
1:
2:
for i:=1 to 10 do
  listbox1.items.add(highscores_s[i]+' '+inttostr(highscores_p[i]))


-> niemand denkt das du dumm bist nur weil du die antwort darauf nicht weiß...


hibbert - Fr 21.02.03 18:28

hallo,
naja, ich kam mir sehr dumm bei dieser frage vor, und ich hab schon wieder eine davon:
muss ich die daten vorher in eine andere listbox laden? wann ja, wie geht das dann mit dem sortieren? wegen dem highscores_s[i]+da muss ich doch irgendwie bestimmen, welche daten sortiert werden sollen, oder hab ich das mal wieder übersehen??

mfg hibbert


Fred Ferkel - Fr 21.02.03 21:06

naja also eigentlich ist das garnicht soo schwer also:

alle einträge in den arrays sind schon sortiert, wenn du einen hinzufügst ist dieser auch automatisch richtig einsortiert; ums sortieren musst du dich nicht kümmern

nur eben noch ums sichern und laden
(wenn dus nicht zu genau mit der sicherheit nimmst dann kannst du einfach ne ini nehmen...->FAQ)

am anfang des programms musst du einfach die highscores laden und am ende die eventuell veränderten highscores wieder speichern...


hibbert - Sa 22.02.03 00:41

gut, das hab ich ja verstanden, aber wie soll ich die daten laden? einfach in eine listbox?? :oops:
mit arrays hab ich noch nie gearbeitet :lol:
kannst du mir da noch ein leztes mal helfen???
mfg hibbert


Fred Ferkel - Sa 22.02.03 00:47

naja wie man ne ini benutzt steht zwar 100PRO in der FAQ aber damit du mal die finger häslt ..;) ein teil aus meinen *megasturzranzestackoverlowblöddauerndzufälligcrashendenfalschcompiliertenproggi*


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
procedure ff_WriteIni;
var
  i:integer;
  ini:Tinifile;
begin
  ini:=Tinifile.create(extractfilepath(application.exename)+'config.ini');
  for i:=1 to 10 do
    begin
      ini.Writestring('hs','s'+inttostr(i),ff_highscores_s[i]);
      ini.Writeinteger('hs','p'+inttostr(i),ff_highscores_p[i]);
    end;
  freeandnil(ini);
end;

procedure ff_ReadIni;
var
  i:integer;
  ini:Tinifile;
begin
  if not fileexists(extractfilepath(application.exename)+'config.ini') then
    begin
      ini:=Tinifile.create(extractfilepath(application.exename)+'config.ini');
      for i:=1 to 10 do
        begin
          ini.Writestring('hs','s'+inttostr(i),'<->');
          ini.Writeinteger('hs','p'+inttostr(i),0);
          ff_highscores_s[i]:='<->';
          ff_highscores_p[i]:=0;
        end;
      freeandnil(ini);
      exit;
    end;
  ini:=Tinifile.create(extractfilepath(application.exename)+'config.ini');
  for i:=1 to 10 do
    begin
      ff_highscores_s[i]:=ini.Readstring('hs','s'+inttostr(i),'<->');
      ff_highscores_p[i]:=ini.Readinteger('hs','p'+inttostr(i),0);
    end;
  freeandnil(ini);
end;


hibbert - Sa 22.02.03 11:17

hai,
wie ich mit ner ini file arbeite, das weiß ich so ungefähr, dass war ja nicht das problem, ich wollte nur wissen, woher das programm weiß, welche daten sortiert werden sollen, aber ich glaube das die daten direkt aus der ini file geladen werden, oder? und bei deinem code hab ich 2 fehler entdeckt, einen konnte ich beheben, undzwar den mit uses inifiles;, und dann tritt noch ein weiterer fehler auf, und da weiß ich nicht was falsch ist, ist das eine listbox o.ä.?
Zitat:
[Error] Unit1.pas(33): Undeclared identifier: 'ff_highscores_s'

da musste mir leider nocheinmal helfen, aber trozdem danke.

mfg hibbert


Fred Ferkel - Sa 22.02.03 11:29

ach bitte vergleiche doch mal die variablen über die wir gesprochen haben mit der variable die hier in der fehlermeldung auftaucht...;)
und lies dann weiter...versuch es einfach selber herauszufinden...
.
.
.
.
.
.
ändere im code einfach ff_hiscores_p in higscores_p

cya


hibbert - Sa 22.02.03 13:22

ey sorry man,
ich weiß dass es langsam nervt abba ich bekomme das einfach nicht hin. :oops: :oops: :oops:
auch wenn ich das so änder, der fehler ist nochimmer der gleiche.

kannst du mir nicht einfach den code so posten, dass alles per button klick sortiert wird?? (sonst sitzen wir hier noch tage, wochen, monate dran...).

bittte .........
mein code sieht jetzt so aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
implementation

{$R *.dfm}
uses inifiles;
function check_highscores(points:integer;name:string):boolean;
var l1  : integer;
    hlpp : integer;
    hlpn : string;
begin

  result:=false;
  highscores_p[11]:=points;
  highscores_s[11]:=name;
  l1:=11;
  while (l1>1)and(highscores_p[l1]>highscores_p[l1-1]) do
    begin
      result:=true;
      hlpp:=highscores_p[l1-1];
      hlpn:=highscores_s[l1-1];
      highscores_p[l1-1]:=highscores_p[l1];
      highscores_s[l1-1]:=highscores_s[l1];
      highscores_p[l1]:=hlpp;
      highscores_s[l1]:=hlpn;
      dec(l1);
    end;
  if result then writeini;
end;


end.

mfg hibbert


Fred Ferkel - Sa 22.02.03 14:07

ich weiß ja nicht obs dringend ist aber ich will dir ja helfen und nciht den code für dich einfach schreiben...also such doch mal nach der variablendeklaration von highscores_p und highscores_s?
bei dem was du gepostet hast ist die jedenfalls nicht zu sehen...

vielleicht solltest du acuh mal nen paar infos über arrays in der delphi-hilfe, der FAQ und anderen beiträgen in diesem forum suchen...bei den bald 30000 posts wird in mind. jedem 100 ein array benutzt...

cya


hibbert - Mo 24.02.03 20:17

hai,
das problem hab ich jetzt dank Peter Lustig gelöst (Danke nochmal!).
8)
mfg hibbert


Christian S. - Mo 24.02.03 20:26

Gern geschehen! Jederzeit wieder!


Fred Ferkel - Mo 24.02.03 20:53

hohoho :evil: :evil: :evil: :!:
:arrow: war mir auch ne freude


hibbert - Mi 26.02.03 11:56

sorry Fred Ferkel,
abba ich habe mich über die faq's mit peter lustig verständigt und das problem gelöst.

mfg hibbert