Autor Beitrag
Helmut
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Di 03.12.02 21:24 
Hallo,

also, es wäre echt unverschämt wenn ich das hier posten würde und einfach sagen würde ob mir das jemand verkürzen könnte.
Auf die schnelle geht das wahrscheinlich garnicht....

Ich hab eine Prozedur, und diese funktioniert auch. Allerdings ist der rechenaufwand für das was sie macht total verschwendet. :)

Wer lust hat sich das ganze mal anzusehen der kann ja jet6zt weiterlesen. Ich komme mit der prozedur zurecht, aber es ist halt unschön und sieht nicht gerade professionell aus.

also erstmal was die prozedur können muss:
gegeben sind 6 bilder. wuerfel1, wuerfel2, wuerfel3 ... wuerfel6 vom typ TImage. Alle sind 32x32 pixel gross.

Diese TImages liegen in einem rechteck, welches sich so errechnet:
links oben hat die korrdinaten x=0 und y=0. Rechts unten hat die koordinaten y=(form1.groupbox1.Height-form1.bevel1.height-100) und x=(form1.bevel1.Width-280).

Die images werden auf einen (externen, also nicht in dieser prozedur)knopfdruck zufallsgesteuert in diesem rechteck verteilt (also .top und .left werden mit random erzeugt)

Was die prozedur macht:
sie muss nur alle zufällig übereinanderliegenden images "verrücken" so das sie nichtmehr übereinander liegen. Es komtm manchmal vor das einige bilder sich überdecken, manchmal überdeckt sich aber auch keins und die prozedur macht dann natürlich nix :)

So, hier mal meine prozedur... bitte nicht erschrecken...

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:
procedure auseinanderlegen;  {rückt aufeinanderliegende würfel auseinander}
var
index,a,error,zufall: integer;  {index, a sind laufvariablen für for..to; error ist zur sicherung wenn die repeat..until-schleife zu oft durchläuft droht das programm abzustürtzen, error wird bei jedme durchlauf um 1 erhöht und ab 100 wird zufallsgeneriert...; zufall ist entweder 0 oder 1 und es wird damit bestimmt ob nach vertikal oder horizontal gerückt wird}
exit,geaendert: boolean;  {exit ist dazu da wenn error eingreifen musste das die repeat..until-schleife sofort abbricht, geaendert ist dazu da wenn es während eines gesamten durchlaufs auf false bleibt dann sind keine würfel mehr überlagert von andern würfeln, dann wird abgebrochen}
begin
 repeat
 randomize;
 geaendert:=false;
 For index := 0 to 5 do
 For a := (index + 1) to 6 do
 Begin
  if ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left)>=(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left)-32)
  and ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left)<=(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left)) then
  begin
   if ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top)>=(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top)-32)
   and ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top)<(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top)) then
   begin
    error:=0;
    exit:=false;
    geaendert:=true;
    zufall:=random(2)+1;
    {showmessage('1.-left und 1.-top erfüllt. Achtung es wird gerückt!');}
    if (zufall=1) then
    begin
     repeat
     begin
       TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).left:=TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left+1;
       error:=error+1;
      if (error>100) then
      begin
       TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
       exit:=true;
      end;
     end;
     until (TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left>TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left+32) or (exit=true);
    end else {if zufall=2}
    begin
     repeat
     begin
       TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top:=TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top+1;
       error:=error+1;
      if (error>100) then
      begin
       TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).left:=random(form1.bevel1.Width-312);
       exit:=true;
      end;
     end;
     until (TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top>TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top+32) or (exit=true);
    end;
   end;

   if ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top)<=(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top)+32)
   and ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top)>(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top)) then
   begin
    error:=0;
    exit:=false;
    geaendert:=true;
    zufall:=random(2)+1;
    {showmessage('1.-left und 2.-top erfüllt. Achtung es wird gerückt!'); }
    if (zufall=1) then
    begin
     repeat
     begin
      if TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).left>=(form1.bevel1.Width-312) then
      TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).left:=TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left-1
      else
      TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).left:=TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left+1;
      error:=error+1;
      if (error>100) then
      begin
       TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
       exit:=true;
      end;
     end;
     until (TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left>TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left+32) or (exit=true);
    end else {if zufall=2}
    begin
     repeat
     begin
      if TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top>=(form1.groupbox1.Height-form1.bevel1.height-100) then
      TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top:=TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top-1
      else
      TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top:=TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top+1;
      error:=error+1;
      if (error>100) then
      begin
       TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
       exit:=true;
      end;
     end;
     until (TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top>TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left+32) or (exit=true);
    end;
   end;
  end;
   {2. left -->>}
  if ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left)<=(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left)+32)
  and ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left)>=(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left)) then
  begin
   if ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top)>=(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top)-32)
   and ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top)<(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top)) then
   begin
    error:=0;
    exit:=false;
    geaendert:=true;
    zufall:=random(1);
    {showmessage('2.-left und 1.-top erfüllt. Achtung es wird gerückt!'); }
    repeat
    begin
     TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).left:=TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left-1;
     error:=error+1;
     if (error>100) then
     begin
      TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
      exit:=true;
     end;
    end;
    until (TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left<TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left-32) or (exit=true);
   end;

   if ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top)<=(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top)+32)
   and ((TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).top)>(TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).top)) then
   begin
    error:=0;
    exit:=false;
    geaendert:=true;
    zufall:=random(1);
    {showmessage('2.-left und 2.-top erfüllt. Achtung es wird gerückt!');}
    repeat
    begin
     TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).left:=TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left-1;
     error:=error+1;
     if (error>100) then
     begin
      TImage(form1.FindComponent('Wuerfel'+IntToStr(index+1))).top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
      exit:=true;
     end;
    end;
    until (TImage(form1.FindComponent('Wuerfel'+IntToStr(Index+1))).left<TImage(form1.FindComponent('Wuerfel'+IntToStr(a))).left-40) or (exit=true);
   end;
  end;
 end;
 for index:=1 to 6 do  {überprüfung ob ausversehen ein würfel ausserhalb des spielfeldes liegt--->}
 begin  {horizontal--->}
  if TImage(form1.FindComponent('Wuerfel'+IntToStr(Index))).left<0 then
  begin
   TImage(form1.FindComponent('Wuerfel'+IntToStr(Index))).left:=random(form1.bevel1.Width-280);
   geaendert:=true;
  end;
  if TImage(form1.FindComponent('Wuerfel'+IntToStr(Index))).left>form1.bevel1.Width-312 then
  begin
   TImage(form1.FindComponent('Wuerfel'+IntToStr(Index))).left:=random(form1.bevel1.Width-280);
   geaendert:=true;
  end;
   {vertikal --->}
  if TImage(form1.FindComponent('Wuerfel'+IntToStr(Index))).top<0 then
  begin
   TImage(form1.FindComponent('Wuerfel'+IntToStr(Index))).top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
   geaendert:=true;
  end;
  if TImage(form1.FindComponent('Wuerfel'+IntToStr(Index))).top>(form1.groupbox1.Height-form1.bevel1.height-100) then
  begin
   TImage(form1.FindComponent('Wuerfel'+IntToStr(Index))).top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
   geaendert:=true;
  end;
 end;
 until (geaendert=false);
end;


Ich glaub programmieren liegt mir echt nicht so.... bei dem salat den ich hie rproduziert habe :oops: :roll: :lol:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.12.02 15:01 
Helmut hat folgendes geschrieben:
Die images werden auf einen (externen, also nicht in dieser prozedur)knopfdruck zufallsgesteuert in diesem rechteck verteilt (also .top und .left werden mit random erzeugt)

Soll man diese Image-Komponenten dann bewegen können, oder warum werden die Koordinaten zufällig gewählt?
Helmut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mi 04.12.02 15:44 
ne, also nix mit drag usw :)

Sähe halt nur komisch aus wenn beim würfel alle würfel immer auf dem selben platz liegen :wink:
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mi 04.12.02 15:56 
Hallo,

hatte mir den Code gestern mal kurz angeschaut.

was mir gleich aufgefallen ist:
randomize brauchst nur einmal aufrufen (z.B. bei Formcreate) und schon gar nicht in schleifen

wenn du die Proc auseinanderreucekn mit in den private abschnitt der Form aufnimmst kannst du dir das form1.xxx sparen.

außerdem ist die Verteilung immer wieder die gleiche und nicht komplett zufällig. Wenn ich nochmal Zeit habe, poste ich nochmal was.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Helmut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mi 04.12.02 16:07 
hi keldorn,

also das mit form1. rauslassen ist mir dann während des programmierens auch eingefallen, da ich da aber schon fast fertig war... hätte ich auch einfach with form1 do ... machen können, deine lösung is da aber die beste.
Bei randomize war ich mir nie im klaren wie oft man das aufrufen musste und wieso man überhaupt erst randomize schreibt,. Eigentlich ist doch mit random(zahl) dem programm gesagt das es eine zufällige zahl erzeugen soll oder?
Dann werde ich alle randomizes die ich in meinem programm hab mal rausschmeissen :) (bis auf eines...)

Aber was mich interessiert: "die verteilung immer die gleiche" ? heisst das das random(...) garkeine wirklcihen zufallszahlen erzeugt?? Mein programm braucht unbedingt etwas zufälliges :lol:

lass dir zeit mit deiner antwort :)

mfg
Helmut
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mi 04.12.02 16:36 
Hallo,

nochmal kurz:

thema randomize: einmal F1 und du weißt es :lol:

doch random erzeugt Zufallszahlen. aber dein Code macht irgendwas, das alle Würfel bei mehrmaligen Aufruf der Proc immer wieder die gleiche Pos haben.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Helmut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mi 04.12.02 18:23 
hm, jo, irgendwas macht mein code :lol:

Diese grosse repeat..until-schleife ist dazu da, wenn bei einem durchlauf alle bilder verrückt werden die übereinander liegen um nochmal zu überprüfen ob nicht zufällig das verschobene wieder auf nem anderen bild liegt. Wenn die variable geaendert auf false bleibt endet die grosse schleife, dann wurde nix geändert, also sind alle bilder einander nicht-überlappend.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.12.02 21:27 
Warum werden die Images eigentlich zufällig angeordnet?

Diese Frage stelle ich aus ernsthaften Interesse! Ist nicht irgendwie böse gemeint. Ich verstehe nur den Ansatz nicht. Wenn ich ein Würfelprogramm machen würde, bei dem man die Würfel nicht verschieben kann, dann würde ich den Dingern feste Positionen zuweisen und bloß die Pics via Zufallsgenerator tauschen.
Helmut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mi 04.12.02 21:32 
hm, lol, ok. Ich versuchs mal zu erklären...

also das ist wie eine fläche, wenn man auf würfeln klickt taucht ein umgekippter würfelbecher auf und die würfel erscheinen auf dem spielfeld. Wär ja komishc wnen die würfel immer an der gleichen stelle im spielfeld sind und nur die zahlen sich ändern...
Nebenbei: die images werden zusätzlich zufallsgeneriert.

Ich hoffe ich habs verständlich erklärt, wenn nicht fragt einfach nochmal :oops:
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 05.12.02 22:25 
Hallo

also so richtig werde ich auch nich so richtig schlau, was das ganze nun genau tuen soll. Außerdem scheint deine Proc nich die Würfel auseinanderzurücken sondern eher zusammen. aber egal, deine Frage war ja, wie man die Sache verkürzen kann. Deswegen wird meine Antwort nicht unbedingt das sein, was du suchst.

ich würde die Sache vom Ansatz anders lösen, ich würde einfach ne allgemeine Schleife
aufbauen und insbesondere die 1000 FindComponent-aufrufe vermeiden.
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:
procedure Tform1.auseinanderlegen2;
Var Wuerfel, Wuerfel2:Timage;
   i,a:integer;
   ueberschneidung:boolean;
  begin
    for i:=1 to 6 do
      begin
        //images einzeln durchgehen
        wuerfel:=TImage(FindComponent('Wuerfel'+inttostr(i)));
        ueberschneidung:=true;
        while ueberschneidung do
          begin
            //diesen Wuerfel zufällig verteilen
            wuerfel.left:=random(Groupbox1.width-wuerfel.width-10);
            wuerfel.top:=random(Groupbox1.height-wuerfel.height-10);
            //prüfen, ob sich der Würfel mit einem anderen überschneidet
            ueberschneidung:=false;
            if i<>1 then  //nicht beim ersten Würfel
              begin
                for a:=1 to i-1 do  //alle vorigen Wuerfel prüfen
                  begin
                    Wuerfel2:=TImage(FindComponent('Wuerfel'+inttostr(a)));
                    if ( (wuerfel.left                 in [Wuerfel2.Left..(Wuerfel2.left+wuerfel2.width)]) and
                         (wuerfel.top                  in [Wuerfel2.top..(Wuerfel2.top+wuerfel2.height)]) )
                       or
                       ( ((wuerfel.left+wuerfel.width) in [Wuerfel2.Left..(Wuerfel2.left+wuerfel2.width)]) and
                         ((wuerfel.top+wuerfel.height) in [Wuerfel2.top..(Wuerfel2.top+wuerfel2.height)]) ) then ueberschneidung:=true;
                  end;
              end;
          end;
      end;
  end;


wird dir die 6 Images, die alle auf der Combobox liegen, schön zufällig verteilen. Funktioniert nicht richtig, da nicht alle überschneidungen erkannt werden und das Optimum ist es sicher auch nich.
Dafür ist der Code aber viel kürzer, evtl besser lesbar und ich hab auch nur ne viertelstunde überlegt .... :wink:
Auißerdem muß die Groupbox ausreichend groß sein, sonst rennt sich das Programm tot.

Vielleicht hat Mathias noch ne Idee.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 06.12.02 17:22 
Nicht wirklich.
Meine Idee zielte eher darauf ab, dass es egal ist, wie die Würfel angeordnet werden. Aber du hast die ganze Sache ja sehr schön verkürzt. :)
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 06.12.02 17:31 
Hallo

Aber du hast vielleicht noch ne Idee, wie man rausbekommt ob ein Punkt in einer Fläche liegt oder sich Flächen überschneiden ?

Mfg Frank
[/quote]

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Helmut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Fr 06.12.02 23:47 
Hi Keldorn, vielen Dank für deine Mühe!
Aber so richtig sehe ich noch nicht durch.

zum beispiel...
Zitat:

left in [Wuerfel2.Left..(Wuerfel2.left+wuerfel2.width)]) and
(wuerfel.top in [Wuerfel2.top..(Wuerfel2.top+wuerfel2.height)]) )
or
( ((wuerfel.left+wuerfel.width) in [Wuerfel2.Left..(Wuerfel2.left+wuerfel2.width)]) and
((wuerfel.top+wuerfel.height) in [Wuerfel2.top..(Wuerfel2.top+wuerfel2.height)]) ) then ueberschneidung:=true;


soll das "in" nur sprichwörtlich sein oder ist das richtig aus der programmiersprache?

Ich weiss das man einiges verkürzen kann....
Heute hab ich nicht die zeit deine prozedur mal auszuprobieren (in mein programm einbauen...)
Aber ich kann dir (euzch) ja mal erklären was es mit meiner prozedur auf sich hat :lol:

Also, die groupbox ist genügend gross, 500x400 mindestens, wenn man maximiert wird sie halt grösser.
In meiner prozedur überprüfe ich jeden würfel mit jeder position der anderen würfel. Eine überschneidung gibt es auf 2 wegen, entweder ist der würfel mehr rechts oder mehr links von dem überschnittenen würfel-mittelpunkt (eigentlich unsinnig.... :( ) Wenn er weiter links ist wird er nach links gerückt, wenn er weiter rechts ist wird er nach rechts gerückt.

Daraus ergibt sich dann ein problem... wenn 2 würfel nebeneinander liegen und ein dritter sich auf zum beispiel dem rechten würfel aber mehr auf der linken seite befindet wird dieser nach links gerückt, dann isser ja auf dem linken würfel mehr auf der rechten seite und wird wieder nach rechts gerückt. Dann wechselt der würfel bis ins undendliche seine position immer hin und her.
Als ich mich bis dahin gewurschtelt habe hab ich einfach "error"-variable eingebaut, bei jedem repeat durchgang wird sie um 1 erhöht, wenn der würfel also in dieser/einer "zwickmühle ist wird nach 100 durchgängen abgebroczhen und die würfelpos. zufallsgeneriert.

Dann kann noch vorkommen das ein würfel wenn er nach links/rechts gerückt wird das er dann ausserhalb des spielfeldes sich befindet, dessen position wird dann auch wieder gerandomed.

Nicht grade eine elegante lösung, aber es funzt... bis auf den einen fehler:
wenn die .top position von zwei würfeln gleich ist erkennt er das übernanderliegen nicht, und es wird nicht gewechselt. Da mein programmtext so unübersichtlich geworden ist konnte ich da nichts mehr amchen :oops:
Aber es steckt glaube ich der richtige lösungsansatz drin. Ich werd das ganze vielleicht nochmal von vorn schreiben, nachdem ich den code von dir, keldron durchgesehen hab., Vielleicht kann ich das kombinieren oder so....
Die abfrage ob die übernanderliegen klappt ja ganz gut, nur das verschieben ist chaotisch :D

mfg
Helmut
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Sa 07.12.02 10:01 
Hallo

Zitat:

soll das "in" nur sprichwörtlich sein oder ist das richtig aus der programmiersprache?

if (x in [1..10])
sollte
if (x>=1) and (x<=10) entsprechen

die Überscheidungsproc macht nix weiter ales zu prüfen, ob der linke obere oder der rechte untere Punkt des Wuerfels in dem Bereich eines bereits erstellten Wuerfels(2) liegt. Das sind natürlich nicht alle möglichen Fälle und du willst ja auch noch was zu tun haben.

Zitat:

Daraus ergibt sich dann ein problem... wenn 2 würfel nebeneinander liegen und ein dritter sich auf zum beispiel dem rechten würfel aber mehr auf der linken seite befindet wird dieser nach links gerückt, dann isser ja auf dem linken würfel mehr auf der rechten seite und wird wieder nach rechts gerückt. Dann wechselt der würfel bis ins undendliche seine position immer hin und her.

Eben. Aus meiner Sicht wirst du nie froh, wenn Du gleich alle Würfel mit einmal überprüfst. Und spätestens nach einem viertel Jahr weißt du überhaupt nicht mehr, wie dein Code funktioniert und bei einem Fehler siehst Du alt aus.
Bei mir steckt der Ansatz dahinter:
* Einen Würfel setzen
* Überprüfung, ob eine Überschneidung mit den vorherigen Würfeln - wenn ja -> Position erneut ändern und wieder die Pos prüfen ....
* zum nächsten Würfel gehen


Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Helmut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Sa 07.12.02 12:43 
ahh, ja, achso denkst du dir das.
OK, das werd ich heut abend gleichmal umsetzen, ich denk das schaff ich.
Ich poste dann mein ergebnis hier
thx

[edit]
So, habe jetzt mal deine prozedur so geschrieben das sie für mich passt.
Aber irgendwie scheint da noch der wurm drin zu sein. Er braucht wnen ers schafft ziemlich lange für die prozedur. So 5 sekunden, meisstens bleibt das prog stehen.

hier mal der code:
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:
procedure auseinanderlegen;
Var Wuerfel, Wuerfel2:Timage;
   i,a:integer;
   ueberschneidung:boolean;
begin
 for i:=1 to 6 do
 begin
  //images einzeln durchgehen
  wuerfel:=TImage(form1.FindComponent('Wuerfel'+inttostr(i)));
  ueberschneidung:=true;
  while ueberschneidung do
  begin
   //diesen Wuerfel zufällig verteilen
   wuerfel.left:=random(form1.bevel1.Width-280);
   wuerfel.top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
   //prüfen, ob sich der Würfel mit einem anderen überschneidet
   ueberschneidung:=false;
   if i<>1 then  //nicht beim ersten Würfel
   begin
    for a:=1 to i-1 do  //alle vorigen Wuerfel prüfen
    begin
     Wuerfel2:=TImage(form1.FindComponent('Wuerfel'+inttostr(a)));
     if (wuerfel.left<wuerfel2.left+32) and (wuerfel.left>Wuerfel2.left-32)
     or
     (wuerfel.top<wuerfel2.top+32) and (wuerfel.top>wuerfel2.left-32) then
     ueberschneidung:=true;
    end;
   end;
  end;
 end;
end;


dort müssten eigentlich alle möglichkeiten drin sein welche der würfel haben kann wenn er überdeckt wird. Wenn sie nur funzen würde. Irgendwie ist da ein Fehler drin :(
[/edit]
Helmut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mo 09.12.02 14:16 
hm, vielleicht hätte ich nicht editieren sollen :roll: :? :shock:
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 09.12.02 15:26 
Helmut hat folgendes geschrieben:
hm, vielleicht hätte ich nicht editieren sollen :roll: :? :shock:


das stimmt 8) , ich gugg mir nur neue Beiträge an 8)

hab heut keine Zeit, nur überflogen

ausblenden Quelltext
1:
2:
3:
     if (wuerfel.left<wuerfel2.left+32) and (wuerfel.left>Wuerfel2.left-32) 
     or 
     (wuerfel.top<wuerfel2.top+32) and (wuerfel.top>wuerfel2.left-32)

die Anordnung kann nicht klappen
if Bed1 and bed2 or bed3 and bed4
mach besser sowas
if (bed1 and Bed2) or (bed3 and bed4)
das finde ich ist übersichtlicher. Dein Fhler wird entstehen, weil deine Bedignugn immer true ergeben wird und dann das Prog in einer endlosschleife drinhängt.

dazu mußt du deine Bedingungen auch noch anders gestalten.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Helmut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mo 09.12.02 16:26 
bla, ich bin doch auch blöd:
da liesst man sich den quellext 100 mal durch und kommt nicht drauf, erst andere bringen einen dann durch ganz kleine hinweise darauf!

so muss es richtig heissen:
und SO klappt die prozedur auch prima (super schnell und alles was ich mir gewünscht hab :D)

Hier nochmal die fertige prozedur:

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:
procedure auseinanderlegen;
Var Wuerfel, Wuerfel2:Timage;
   i,a:integer;
   ueberschneidung:boolean;
begin
 randomize;
 for i:=1 to 6 do
 begin
  //images einzeln durchgehen
  wuerfel:=TImage(form1.FindComponent('Wuerfel'+inttostr(i)));
  ueberschneidung:=true;
  while ueberschneidung do
  begin
   //diesen Wuerfel zufällig verteilen
   wuerfel.left:=random(form1.bevel1.Width-280);
   wuerfel.top:=random(form1.groupbox1.Height-form1.bevel1.height-100);
   //prüfen, ob sich der Würfel mit einem anderen überschneidet
   ueberschneidung:=false;
   if i<>1 then  //nicht beim ersten Würfel
   begin
    for a:=1 to i-1 do  //alle vorigen Wuerfel prüfen
    begin
     Wuerfel2:=TImage(form1.FindComponent('Wuerfel'+inttostr(a)));
     if (wuerfel.left<wuerfel2.left+32) and (wuerfel.left>Wuerfel2.left-32)
     and (wuerfel.top<wuerfel2.top+32) and (wuerfel.top>wuerfel2.top-32) then
     ueberschneidung:=true;
    end;
   end;
  end;
 end;
end;


achja, randomize mach ich auchnoch weg < g >

Also, GANZ GROSSEN DANK nochmal an dich :D Ohne dich würde ich mich noch mit der alten prozedur rumquälen.

mfg
Helmut