Entwickler-Ecke

Sonstiges (Delphi) - For-Schleife oder wie?


waldmeister - Mi 13.11.02 20:08
Titel: For-Schleife oder wie?
Sorry für den Titel,a ber mir is nix besserers eingefallen um mein problem zu beschreiben.

Mein Problem:

ich arbeite an einem Strategiespiel bei dem man auch bauen kann.
ich möchte das so machen ,dass der user z.b. eingibt wieviele häuser er bauen will un diese dann nach 24 zeiteinheiten fertig sind. allerdings kann er jeder zeit neue häuser bauen, die dann auch wieder nach 24 stunden fertig sind. ich habe das bisher versucht mit einem array von 1..24 zu lösen aber hatte dabei keinen erfolg.

Wisst ihr wie ich das machen könnt??


Christian S. - Mi 13.11.02 21:07

1. Könntest Du das etwas genauer beschreiben? Ich bin mir nicht sicher, dass ich Dich richtig verstanden habe.

2. Sollte ich Dich richtig verstanden haben: könntest Du nicht eine Art "Zeitzähler" einbauen? Dann könntest Du das so machen: möchte jemand ein Haus bauen, wird dieses in 24 Zeiteinheiten fertig sein. Du speicherst, das zum Zeitpunkt "aktuelle Zeit +24" ein Haus gebaut werden soll. Und beim Beginn jeder Zeiteinheit fragst Du dann ab, ob in dieser Zeiteinheit etwas gebaut werden soll.

MfG,
Peter


waldmeister - Mi 13.11.02 21:37

hast mich schon richtig verstanden, denke ich *g*

das mit dem Zeitzähler war mir auch klar, ich wollte das in nem Timer machen, aber so sollte es auch gehn. Dann bräuchte ich nur ne art variable, der ich 2 werte zuweisen kann, also was gebaut werden soll un wann!!


Christian S. - Do 14.11.02 14:35

Ja, genau! Ich würde es so machen, dass Du Dir ein Array baust, welches die Bauaufträge speichert. Am besten machst Du das so, dass du direkt beim einsortieren guckst, dass die Aufträge auch zeitlich sortiert sind. Das macht die Sache sehr viel einfacher.
Über das Array und die Speicherung solltest Du allerdings mal genauer nachdenken, damit Du pro Zeiteinheit möglichst wenig daran ändern musst. Sonst wird das ganze ziemlich langsam. Also wirklich überlegen, wie die Bauaufträge sortiert werden, wie sie am besten hinzugefügt werden und wie man sie am besten wieder entfernt. Mein Vorschlag übersteht dein Nachdenken wahrscheinlich keine 3 Sekunden, aber das ist ja immer so mit ersten Ideen.

MfG,
Peter


waldmeister - Do 14.11.02 15:09

Das programm ist nicht so umfangreich, da is das ziemlich egal wie ich das mit den arrays mache. aber wenn ich später, wie bei allen meinen programmen, eine überarbeitete optimierte version erstelle, dann muss ich da wahrscheinlich schon drauf achten!


Christian S. - Do 14.11.02 15:56

Hi!

Dann solltest Du eventuell für das Array einen Datentypen erstellen, dem Du verschiedene Funktionen zuweist, die Du zum einsortieren, abrufen, etc. der Bauauftträge verwendest. Dann kannst Du hinterher die Implementation dieses Arrays und der Funktionen beliebig ändern, ohne auch nur eine Änderung im Programm vornehmen zu müssen, da die Schnittstellen gleich bleiben.

MfG,
Peter


waldmeister - Sa 16.11.02 09:41

wie mache ich sowas?? ich meine einen datentyp erstellen!


Christian S. - Sa 16.11.02 11:42

Hi!

Ich habe auch erst letztens erkannt, dass Objekte auch in Delphi ziemlich praktische Dinger sein können. Aus Java kannte ich das, aber das musste ich nur zwangshalber lernen und war generell nicht so begeistert. Aber Objekte sind echt praktisch. Hier habe ich ein Objekt "Vektor" erstellt, dass aber noch kaum Funktionen besitzt:


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:
unit vektorU;

interface

type eins_bis_drei = 1..3;

type TVektor = class(TObject)
     private
       element : ARRAY[0..2] OF Extended;

     public
       constructor add(v1, v2 : TVektor); overload;
       constructor create(v : TVektor); overload;
       constructor create(x,y,z : Extended); overload;
       constructor create; overload;
       procedure add(v1 : TVektor); overload;
       procedure add(x,y,z : Extended); overload;
       function komponente(nummer : eins_bis_drei) : Extended;
     end;


implementation

constructor TVektor.add(v1, v2 : TVektor);
VAR i : INTEGER;
begin
  for i:=0 TO 2 DO
  element[i]:=v1.komponente(i+1)+v2.komponente(i+1);
end;

constructor TVektor.create(v : TVektor);
VAR i : INTEGER;
begin
  for i:=0 TO 2 DO
  self.element[i]:=v.komponente(i+1);
end;


constructor TVektor.create(x,y,z : Extended);
begin
  element[0]:=x;
  element[1]:=y;
  element[2]:=z;
end;

constructor TVektor.create;
begin
  element[0]:=0;
  element[1]:=0;
  element[2]:=0;
end;


procedure TVektor.add(v1 : TVektor);
VAR i : INTEGER;
begin
  for i:=0 TO 2 DO
  self.element[i]:=self.element[i]+v1.komponente(i+1);
end;

procedure TVektor.add(x,y,z : Extended);
begin
  self.element[0]:=self.element[0]+x;
  self.element[1]:=self.element[1]+y;
  self.element[2]:=self.element[2]+z;
end;

function TVektor.komponente(nummer : eins_bis_drei) : Extended;
begin
  result:=self.element[nummer-1];
end;

end.


Wenn Du diese Unit in ein Programm einbindest, kannst Du über einen beliebigen der vier Kosntruktoren einen Vektor erstellen und damit im Rahmen der implementierten Methoden arbeiten. Und solange Du den Methodenkopf nicht änderst, kannst Du die Implemetation Deiner Methoden beliebig ändern, ohne das derjenige, der Dein Objekt benutzt, etwas davon merkt. Und ohne, dass Du Dein Programm, welches das Objekt benutzt, ändern musst.
MfG,
Peter