Autor Beitrag
bs-Hobbit
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Windows Xp (Home/Prof.), Windows Server 2003, Linux
D7,D2005
BeitragVerfasst: Di 28.03.06 01:00 
Hi,

Ich glaub ich bin grad zu blöd zum denken ;)

Ich habe ein Zweidimensionales Array.... also [X,Y], welches meine Karte für ein Spiel darstellt.
Jetzt sollen sagen wir 5 Objekte "Spawnen" an verschiedenen Positionen.

Jetzt brauch ich eine Möglichkeit X und Y koordinaten per random für jedes Obejekt zu erstellen, aber die Objekte dürfen nicht auf den Selben Koordinaten landen.

Also schwups nen Eindimensionales Array erstellen, in dem ich dann Koordinaten eines Objektes speicher... jetzt könnte ich ja solange zufallszahlen erstellen, bis ich Koordinaten finde, die nicht in dem Eindimensionalen Array sind... ist aber schlecht... könnte im schlechtesten Fall zu einer Endlosschleife führen habe ich mir überlegt, jetzt suche ich nach einer möglochkeit, nur Koordinaten zu filtern, die FUNKTIONIEREN dann ein Random über diese laufen zu lassen und gut ist :)

Aber wie nur....
DaiweL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27



BeitragVerfasst: Di 28.03.06 05:22 
1 Möglichkeit wäre:

du füllst ein Array mit allen möglichen Koordinaten(einmalig).
Diese wirfst du dann zufällig zB. 100 mal umher dh:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for i := 1 to 100  // Bsp.halber (100)
do begin
  X := random(AnzahlKoords)+1;   // Random Verstauschungskoordinaten
  Y := random(AnzahlKoords)+1;
  Tempkoord := koord[X];         // Koordinaten vertauschen
  koord[X] := koord[Y];
  koord[Y] := Tempkoord;
end;


dann kannst du einfach die 5 ersten Koordinaten nehmen.

mfg DaiweL
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 28.03.06 06:15 
Genau! Das Mischen geht aber so (beweisbar optimal):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Procedure ShuffleMillerYates (Var A :TArray);
Var  
 I, J : Integer;  
 T : TArrayElement;

begin  
  For I := Low (A) to High (A) do begin  
    J := I + Random (Length(A) - I);  
    T := A[J];  
    A[J] := A[I];  
    A[I] := T;  
  end;  
end;

Hier wäre TArrayElement z.B. so definiert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Type
  TArrayElement = Record 
    X,Y : Integer 
  End;


Das Mischverfahren ist vom theoretischen Standpunkt aus betrachtet nicht optimal. Die Idee von Daiwei ist aber korrekt (Array befüllen, mischen, erste 5 Elemente nehmen).

_________________
Na denn, dann. Bis dann, denn.