Logisches Problem + arrays

Hi leute!
Nehmen wir an, ich habe eine .ini, mit 100 personen, die alle eine eigenschaft .spot haben.

Ich erzeuge nun ein array von personen, in dem alle stehen, deren eigenschaft .spot auf zb. 1 steht.
var personcount gibt an, wieviele personen in der .ini stehen.

for x:= 0 to personcount-1 do
begin
if person[x].spot = 1 then
temparray[x] := person;
end;

nun will ich, dass er von allen übriggebliebenen, eine zufällige anzahl, und auch zufällige personen in ein neues array schreibt.

max = length(temparray); //get length of array (wieviele personen bei dem spot?)

rand = random(max-1)+1; //create random number (wieviele personen im neuen array sein werden)

for x := 0 to rand do
begin
finalarray[x] := temparray[rand];
end;

Is das so richtig is meine erste Frage…
Weiters, habe ich hierbei das problem, dass er auch mehrmals dieselbe person ins finalarray reintun kann. Um das zu verhindern müsste ich den ausgewählten eintrag aus dem temparray löschen.

die delphi hilfe, sagt wunderbares: delete(Index:integer)
that’s it… woher weiß er aus welchem array?

Naja, ihr werded sicher schon 10 logik, und syntaxfehler gefunden haben, also warte ich mal auf antworten! :smile:
Mit freundlichen Grüßen
und danke im Vorraus

Tom

Hi Tom,

so ganz verstanden habe ich dein Beispiel nicht. Ich weiß auch nicht, was du mit der .ini meinst und ob du Arrays oder Listen meinst.

Da du von Eigenschaften schreibst, gehe ich mal davon aus, du hast eine Liste mit 100 Objekten des Typs TPerson:

type 
 TPerson = class
 ...
 property Spot:Integer...
 ...
 end;

Die Listen seien

var
 Liste: TList; _// Liste aller Personen_
 Unterliste: TList; _// Liste aller Personen mit Spot=1_
 Auswahlliste: TList; _// Liste aller Ausgewählten Personen aus der Unterliste_

Nun erzeugst du eine Liste mit den Personen, bei denen Spot=1 ist:

var
 i,j,n: integer;
begin
 for i := 0 to Liste.count-1 do
 if TPerson(Liste[i]).Spot = 1 then Unterliste.Add(Liste[i]);
...

und nun wird eine Auswahl zufälliger Größe und Zusammensetzung der Unterliste gebildet

...
 n := Random(UnterListe.count-1)+1; _// 1   
 for j := 0 to n do  
 begin  
 repeat  
 i := Random(Unterliste.count)  
 until Auswahl.IndexOf(UnterListe[i])=-1;  
 Auswahl.Add(UnterListe[i]);  
 end;  
..._   

Das war’s. Ich hoffe, das hift weiter. Natürlich gibt es auch noch eine Menge anderer möglicher Lösungen für dieses Problem.

Gruß
Jochen

Danke mal fürs antworten!
Also ich versuchs mal zu konkretisieren.
Ich mach ein minigame. Da hast du die möglichkeit sachen von verscheidenen leuten zu kaufen und die dann auch zu verkaufen…
jetzt isses so, dass ich irgendwo eine „liste“ von den leuten brauche, mit denen man handeln kann. Ebenso brauch ich eine „liste“ von handelsgütern…
Ich als Laie habe mir das so vorgestellt, dass ich das alles in einer .ini stehn hab…

die sieht dann zb so aus:
[Dealer 0]
name=mustermann
age=90
spot=1

[Dealer 1]
name=gartenschlauch
age=80
spot=4

.
.
.
soviel zur .ini … ich weiß nicht inwiefern das so sinnvoll ist??!

Naja, ich habe einen typ definiert.

type
 TDealer = class
 ...
 name:string;
 age:integer;
 spot:integer;
 ...
 end;

und meine „container“ sind arrays…
also ich habe sie als

var
TempDealers: array of TDealer;

deklariert.

Also scheint hier eine liste sinnvoller zu sein?
Hast du mit deinem code auch schon verhindert, dass in der „finalen liste“ auch keine doppelten einträge stehen? Wenn ja, wo? :smile:
Viiieeellen vielen dank für die hilfestellung!

Greez n Eze Tom

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Tom,

Ich als Laie habe mir das so vorgestellt, dass ich das alles
in einer .ini stehn hab…

Aha, in einer Datei. Ok, das kannst du so machen, ist aber umständlich. (Alternativ könntest du ein binäres Dateiformat verwenden. Das hat aber den Nachteil, daß du alle Daten immer schön der Reihe nach lesen bzw. schreiben mußt).

soviel zur .ini … ich weiß nicht inwiefern das so sinnvoll
ist??!

Wie gesagt, kann man so machen. Viele Wege führen nach Rom.

Naja, ich habe einen typ definiert.

type
TDealer = class

name:string;
age:integer;
spot:integer;

end;

Gut.

und meine „container“ sind arrays…

Das ist untypisch. Normalerweise verwendet man als Container für sowas Listen. Du könntest dir sogar einen eigenen Listentyp ableiten mit entspechenden Methoden zum Speichern, Laden usw.

Also scheint hier eine liste sinnvoller zu sein?

Ja, weil Listen eben auch Klassen sind, denen man Methoden und Eigenschaften mitgeben kann.

Hast du mit deinem code auch schon verhindert, dass in der
„finalen liste“ auch keine doppelten einträge stehen? Wenn ja,
wo? :smile:

Ja. Die Repeat-Schleife wird solange durchlaufen, bis der jedesmal neu und zufällig gewählte Dealer nicht schon in der Auswahl-Liste vorhanden ist.

CU
Jochen