Autor Beitrag
BravoLeader501
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 19.07.02 23:32 
Ich bin dabei, eine Art Quiz zu schreiben. Nun möchte ich aber dem Nutzer auch die Möglichkeit bieten, Seinen Namen und Punkte zu speichern und in einer HighScore-Liste zu sehen, welche natürlich mit dem höchsten Punktestsand beginnt. Ich habe schon viel versucht, hat aber alles nicht so geklappt. Wer kann mir helfen?
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Sa 20.07.02 01:51 
Hallo,

informiere dich mal in der Delphi Hilfe zum Thema Typisierte Dateien. Damit kriegst du deine Highscores gut auf die Festplatte und wieder Runter. Das mit dem Sortieren must du dann seperat angehen (devide & conquere).
Ein Beispiel zu Typisierten Dateien kannst du hier runterladen. Das habe ich mal für ein Problem im alten Delphi Forum geschrieben aber als Beispiel für die Technik sollte es auch hier herhalten können ;). Um es zu erklären ist es mir aber im Moment zu spät, wie Gesagt die Online-Hilfe kann dir auskunft geben.

Gruß
Klabautermann


Zuletzt bearbeitet von Klabautermann am Sa 11.01.03 20:48, insgesamt 1-mal bearbeitet
Robert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: So 21.07.02 15:22 
Titel: ich hab das gleiche Problem
Hi! In deinem Programm ist ein Fehler: Es läuft nicht!
Erst sagt mir Delphi (5), dass 'variant.dcu' nicht vorhanden ist; lösche ich es dann aus der uses-Liste, bringt Delphi zwar keine Fehlermeldung mehr, aber man kann auch keinen Namen einfügen :!:

Tschüs
Robert
b.brecht
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Mo 22.07.02 11:56 
Also ich habe auch mal ein Spiel mit Highscore programmiert und habe es folgendermaßen gelöst:

Einfach wenn Highscore aufgerufen wird (z.B. über ein OnClick Event) liest der Computer die alten Ergebnisse auf einer INI Datei und Listet Sie Z.B in einem "TRichEdit" Feld auf.

Wenn du neue Einträge vornehmen willst einfach Einträge aufrufen, überprüfen an welcher Stelle der Eintrag reinmuss und wieder abspeichern.
Hier eine kleine Hilfe um in INI Dateien zu schreiben/lesen:

ausblenden volle Höhe 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:
uses IniFiles

...

procedure schreiben;
var
IniDat:TIniFile; Namen:ARRAY[1..10] of String;
Score:ARRAY[1..10] of String; a:integer;
begin
IniDat := TIniFile.Create('.\highsorce.ini');
        with IniDat do
               FOR a:=1 to 10 do
                      begin
                      Namen[a]:=IntToStr(a);
                      Score[a]:=IntToStr(a*10);
                      WriteString('Highscore',Namen[a],Score[a]);
                      end;
IniDat.Free;
end;

procedure lesen;
var
IniDat:TIniFile; Namen:ARRAY[1..10] of String;
Score:ARRAY[1..10] of String; a:integer;
begin
IniDat := TIniFile.Create('.\highsorce.ini');
        with IniDat do
               FOR a:=1 to 10 do
                      begin
                      Namen[a]:=ReadString('Highscore',Namen[a],Namen[a]);
                      Score[a]:=ReadString('Highscore',Score[a],Score[a]);
                      end;
IniDat.Free;
end;
Indeterminatus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Do 25.07.02 02:59 
Titel: Ein anderer Vorschlag ...
Wenn Du wirklich nicht mit Dateien arbeiten willst (ganz abgesehen davon empfehle ich Dir DRINGEND, Dich mit Dateien und deren Operationen auseinanderzusetzen ...), kannst Du es auch mit Einträgen in die Windows-Registrierung vornehmen, wenn Du willst.

Dazu kann Dir sicher die Delphi-Hilfe weiterhelfen ...

Probiere es doch einfach auf folgende Art und Weise:

ausblenden volle Höhe 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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
unit HiScore;

interface

uses SysUtils;
  // meistens bereits automatisch in das Projekt eingebunden

const
  
  MAX_NAMEN = 20;
     // wieviele Namen Du max. in der HighScore aufnehmen lassen willst...

type
  
  TName = String[ 30 ];
    // für einen einfachen Eintrag in der HighScore brauchen wir keinen
    // String, der 255 Zeichen Speicherplatz verschlingt.
    // ein null-terminierter String kommt auch nicht in Frage, da er nicht
    // in eine typisierte Datei geschrieben werden kann.

  TEintrag = record
                     Name   : TName;
                     Punkte   : Word;
                  end;

  THighScore = object
                        // globale Variablen
                        Liste   : ARRAY[ 0..MAX_NAMEN ] of TEintrag;

                        // interne Variablen
                        Max_Eintrag : Byte;

                        constructor New;
                        destructor Done;

                        procedure Hinzufuegen( _name : TName; _punkte : Word );
                        procedure Sortieren;
                        procedure WriteToFile( _dateiname : String );
                        procedure ReadFromFile( _dateiname : String );
                      end;

var
   HighScore     : THighScore;

implementation

  constructor THighScore.New;
  begin
    Max_Eintrag := 0;
  end;

  destructor THighScore.Done;
  begin
     // ...dasselbe gilt auch für den Destructor
  end;

  procedure THighScore.Hinzufuegen( _name : TName; _punkte : Word );
  var
     min_punkte   : Word;
     max_punkte  : Word;
     j                   : Byte;
     merker         : Byte;
  begin
    if (Max_Eintrag < MAX_NAMEN) then
    begin
      // Sehr schön! Wir können den Namen einfach hinzufügen!
      // (Die HighScore ist noch nicht voll!)
      Inc( Max_Eintrag );
      Liste[ Max_Eintrag ].Name := _name;
      Liste[ Max_Eintrag ].Punkte := _punkte;
    end else
    begin
      // Bei diesem Fall müssen wir den Eintrag mit der niedrigsten Punkte-
      // zahl rauswerfen und den neuen Eintrag hinzufügen ...
      merker := 0;
      min_punkte := 65535;
      for j := 0 to MAX_NAMEN do
      begin
        if (Liste[ j ].Punkte < min_punkte) then
        begin
          merker := j;
          min_punkte := Liste[ j ].Punkte;
        end;
      end;
      Liste[ merker ].Name := _name;
      Liste[ merker ].Punkte := _punkte;
    end;
  end;

  procedure THighScore.Sortieren;
  var
    j     : Byte;
    i     : Byte;
    temp: TEintrag;
  begin
    for j := 0 to MAX_NAMEN do
    begin
      for i := 0 to MAX_NAMEN do
      begin
        if (Liste[ i ].Punkte > Liste[ j ].Punkte) then
        begin
          // Elemente vertauschen ... funktioniert nur über Dreieck ...
          temp.Name := Liste[ j ].Name;
          temp.Punkte := Liste[ j ].Punkte;
          Liste[ j ].Name := Liste[ i ].Name;
          Liste[ j ].Punkte:= Liste[ i ].Punkte;
          Liste[ i ].Name := temp.Name;
          Liste[ i ].Punkte:= temp.Punkte;
        end;
      end;
    end;
  end;

  procedure THighScore.WriteToFile( _dateiname : String );
  var
     f   : TextFile;
     j   : Byte;
     s   : String;
  begin
    AssignFile( f, _dateiname );
    Rewrite( f );
    Writeln( f, 'HI-SCORE' );
    for j := 0 to Max_Eintrag do
    begin
      Writeln( f, Liste[j].Name );
      Str( Liste[j].Punkte, s );
      Writeln( f, s );
    end;
    Writeln( f, '%&/()' );
    CloseFile( f );
  end;

  procedure THighScore.ReadFromFile( _dateiname : String );
  var
     f   : TextFile;
     s  : String;
    punkte_s : String;
    punkte_i : Word;
     Ende : Boolean;
  begin
    AssignFile( f, _dateiname );
    if (not FileExists( f )) then
    begin
      // Fehlermeldung ausgeben, Programm abbrechen oder was auch immer
      exit;
    end;
    Reset( f );
    Readln( f, s );
    if (s='HI-SCORE') then
    begin
      Ende := False;
      while ((not Eof( f )) and (not Ende)) do
      begin
        Readln( f, s );
        if ( s = '%&/()' ) then Ende:=True;
        Readln( f, punkte_s );
        if ( punkte_s = '%&/()' ) then Ende:=True;
        if ( Ende = False ) then
        begin
          punkte_i := StrToInt( punkte_s );
                            // wo diese Funktion zu finden ist, schlägst Du am besten in der Delphi-Hilfe nach ...
          Hinzufuegen( s, punkte_i );
        end;
      end;
      CloseFile( f );
    end else
    begin
      CloseFile( f );
    end;
  end;


Das wäre die Unit, die wir benötigen würden. Eingebunden in unser Programm sähe das dann so aus ...

Laden der Liste
ausblenden Quelltext
1:
HighScore.ReadFromFile( {irgendein Dateiname} );					


Hinzufügen eines neuen Eintrags
ausblenden Quelltext
1:
HighScore.Hinzufuegen( {Name}, {Punktezahl} );					


High-Score ausgeben
ausblenden Quelltext
1:
2:
HighScore.Sortieren;
// in For-schleife zeichnen oder wie immer Du das machen willst...


Datei speichern (z.B. beim Beenden des Programms)
ausblenden Quelltext
1:
HighScore.WriteToFile( {irgendein Dateiname} );					


Also dann, ich hoffe, ich konnte Dir etwas helfen ...

P.S.: Ich weiß nicht, ob das Programm funktioniert, ich habe es nicht ausprobiert, sondern hier "on-the-fly" geschrieben ... es werden sich sicherlich ein paar Fehler eingeschlichen haben, aber im Großen und Ganzen müsste es doch laufen ... *gg*

Yours,

Indeterminatus.

_________________
_______________________________________
Indeterminatus

---=si tacuisses, philosophus mansisses=---
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 25.07.02 11:05 
Titel: Re: ich hab das gleiche Problem
Hallo,

Robert hat folgendes geschrieben:
Hi! In deinem Programm ist ein Fehler: Es läuft nicht!
Erst sagt mir Delphi (5), dass 'variant.dcu' nicht vorhanden ist; lösche ich es dann aus der uses-Liste, bringt Delphi zwar keine Fehlermeldung mehr, aber man kann auch keinen Namen einfügen :!:


stimmt, das habe ich seinerzeit mit D6 Personal erstellt. Ich habe es aber in D5 Compilieren und nutzen können nachden ich Variants entfernt habe.

Zur bedienung:
Trage Namen, Vornamen und Geburtstag ein und Klicke auf hinzufügen sobalt du mindestens zwei einträge hast kannst du durch die Datei Scrollen. Der übernehmen Kopf ist dazu da einen bereits vorhandenen Datensatz zu ändern. Die bennungen sind vieleicht nicht die Besten aber das ganze soll ja nur ein Demo sein ;).

Gruß
Klabautermann