Autor Beitrag
Makaan
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 12.06.07 16:33 
Wir haben im Rahmen eines Schulprojektes die Aufgabe bekommen ein Programm zu schreiben. Wir haben uns für das Spiel PingPong entschieden und ich habe in der Gruppe die Aufgabe eine Highscore zu programmieren.
Diese muss bis spätestens Montag fertig sein und ich hänge fest.
Mein Problem ist, wie ich in der Highscore jetzt
1. die Punkte von gleichnamigen Spielern addiere (wenn man z. B. 10 Punkte hat und ein spiel mit 3 punkten beendet soll man in der Highscore dann 13 Punkte haben und nicht 2 einträge mit 10 und mit 3 punkten)
2. nach Punkten sortiere, sodass der mit den meisten Punkten ganz oben steht.

Habt ihr vielleicht einen Vorschlag wie man das gescheit lösen könnte?
Vielen Dank schonmal im Vorraus.
ausblenden volle Höhe Delphi-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:
Type  TSpielerHS = record
        Punktzahl   : Integer;
        Spielername: String[50];
        end;
type
  TFHighscore = class(TForm)
    SgHS: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure WriteInStringGrid();
    procedure HSeinlesen();
    procedure HSanzeigen();
    procedure Dateischreiben();
    procedure FormDestroy(Sender: TObject);
  end;
procedure punkteeinlesen(Spieler1p,Spieler2p:integer{; Spieler1n,Spieler2n:string[50]});



const maxHS = 5001; //maximale Anzahl an Einträgen in der Highscore

var
  aSpielerHS:array[0..1] of TSpielerHS;//Die beiden Aktuellen Spieler
  FHighscore: TFHighscore;
  Highscore: File of TSpielerHS;
  Highscorealt: array[0..maxHS] of TSpielerHS;

implementation

{$R *.dfm}



procedure TFHighscore.HSeinlesen;//wird beim Programmstart aufgerufen, schreibt Werte von Datei in Highscorealt
var i : word;
begin
  assignFile(Highscore,'Highscore.hgs');

  if fileexists('Highscore.hgs') then
  reset(Highscore)
  else
  rewrite(Highscore);
  i:=0;

  if Filesize(Highscore) > 0 then begin
    repeat
      read(Highscore,Highscorealt[i]);
      inc(i);
    until (i>=MaxHS) or (EOF(Highscore));
  end;
  closefile(Highscore);

end;

Procedure TFHighscore.HSanzeigen;//Schreibt die Werte von Highscorealt in das StringGrid (beim Programmstart)
var i,s: word;
begin
  i:=1;
  s:=0;
  repeat
     SgHS.Cells[1,i] :=Highscorealt[s].Spielername;
     SgHS.Cells[2,i] :=InttoStr(Highscorealt[s].punktzahl);
     inc(i);
     inc(s);
  until i>=maxHS;
end;


procedure TFHighscore.dateischreiben;//Beim Beenden des Programms ausgeführt 
var i,check : word;
begin
  assignFile(Highscore,'Highscore.hgs');
  check:=0;
    while highscorealt[check].Spielername<>'' do
    inc(check);


for i := 1 to maxHS-1 do//schreibt alle Werte die nun im StringGrid stehen in Highscorealt
begin
  highscorealt[check].Spielername := SgHS.Cells[1,i];
  highscorealt[check].Punktzahl := strtoint(SgHS.Cells[2,i]);
  inc(check);
end;

i:=0;
  if fileexists('Highscore.hgs') then
  reset(Highscore)
  else
  rewrite(Highscore);

      while (i<=MaxHS) and (highscorealt[i].Spielername<>'') do//schreibt Highscorealt in die Datei Highscore.hgs
      begin
        write(Highscore,Highscorealt[i]);
        inc(i);
      end;
    closefile(Highscore);


end;



procedure TFHighscore.WriteInStringGrid();//wird nach jedem beendeten Spiel aufgerufen und fügt ans ende des StringGrids
var i,a:integer;                          //die Namen und Punktzahlen der Spieler an
begin
a:=1;
  while SgHS.Cells[1,a]<>'' do  begin
    inc(a);
  end;

for i:=0 to 1 do
  begin
    SgHS.Cells[1,a]:=aSpielerHS[i].Spielername;
    SgHS.Cells[2,a]:=inttostr(aSpielerHS[i].Punktzahl);
    inc(a);
  end;



end;

procedure punkteeinlesen(Spieler1p,Spieler2p:integer{; Spieler1n,Spieler2n:string[50]});
begin                   //Liefert die Spielwerte aus der Hauptunit, eingabe von eigenen Namen wird bald möglich sein
  aSpielerHS[0].punktzahl:=Spieler1p;
  aSpielerHS[0].Spielername:={Spieler1n}'In development1';

  aSpielerHS[1].punktzahl:=Spieler2p;
  aSpielerHS[1].Spielername:={Spieler2n}'In development2';
end;

procedure TFHighscore.FormCreate(Sender: TObject);
var i : integer;
begin

  SgHS.Cells[1,0]:='Spielername';
  SgHS.Cells[2,0]:='Punkte';

    for i := 1 to SgHS.rowcount do
    SgHS.Cells[0,i]:=inttostr(i)+'. Platz';
    FHighscore.HSanzeigen;
  end;

procedure TFHighscore.FormDestroy(Sender: TObject);
begin
FHighscore.dateischreiben;
end;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 12.06.07 16:54 
Moin und :welcome: im Forum!

Schau mal hier, vielleicht ist ein TListViewbesser geeignet, als ein TStringGrid(IMHO schon...)? ;) Weiterhin ist in dem Beispiel das Sortieren bereits automatisch mit drin. :D

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Makaan Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 13.06.07 14:59 
Erstmal danke für die Antwort. Ich hoffe ich krieg das mit dem TListView gescheit hin.
Makaan Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 14.06.07 19:02 
So da mir mein Programmierlehrer geraten hat, weiterhin TStringGrind zu benutzen, da ich TListView nicht kenne und daher gefahr laufe viele Fehler zu machen, dessen Verständnis zuviel Zeit in Anspruch nehmen könnte, habe ich jetzt doch noch eine Lösung gefunden, die sortiert und die Punktzahl von gleichnamigen Einträgen addiert:

ausblenden volle Höhe Delphi-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:
procedure TFHighscore.sortieren;
var a,i,j,MerkeP:integer;
    MerkeName:string[50];
begin
a:=0;
i:=0;
j:=1;
while highscorealt[a].Spielername<>'' do
inc(a);

repeat
  repeat
   if (highscorealt[i].Spielername=highscorealt[j].spielername) and (highscorealt[j].Spielername<>'PointsAdded') and (highscorealt[i].Spielername<>'') and (i<>j) then
   begin
     highscorealt[i].Punktzahl:=highscorealt[i].Punktzahl+highscorealt[j].punktzahl;
     highscorealt[j].Spielername:='PointsAdded';
     highscorealt[j].Punktzahl:=-1;
     inc(j);
   end
   else
   inc(j);

  until (highscorealt[j].Spielername='');
inc(i);
j:=1;
until (highscorealt[i].Spielername='');
    

  for i := a-2 downto 0 do
    for j := 0 to i do
      if (highscorealt[j].Punktzahl<highscorealt[j+1].Punktzahl) then
       begin
         MerkeP:=Highscorealt[j].Punktzahl;
         MerkeName:=Highscorealt[j].Spielername;

         Highscorealt[j].Punktzahl:=Highscorealt[j+1].Punktzahl;
         Highscorealt[j].Spielername:=Highscorealt[j+1].Spielername;

         Highscorealt[j+1].Punktzahl:=MerkeP;
         Highscorealt[j+1].Spielername:=Merkename;
       end;
i:=0;
repeat
while (highscorealt[i].Spielername<>'PointsAdded') and (i<maxHS) do
inc(i);

if highscorealt[i].Spielername='PointsAdded' then
begin
  highscorealt[i].Spielername:='';
  highscorealt[i].Punktzahl:=0;
  inc(i);
end;

until (i>=maxHS) or (highscorealt[i].Spielername='');

    FHighscore.HSanzeigen;
end;