Autor Beitrag
Girgl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 281


D6 Enterprise
BeitragVerfasst: Sa 17.04.04 17:06 
Kann mir jemand sagen,wie ich einen spielplan erstellen könnte.
Also es gibt 18 Manschaften und jede soll gegen jede spielen.Nur weiss ich nich,wie ich einen zufalls spielplan erstellen kann.
Hoffe es kann einer helfen
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 17.04.04 17:14 
Du kannst doch einfach erst einmal alle Kombinationen berechnen (da ist ja noch nichts mit Zufall) und dann aus der Liste der Kombinationen zufällig die Spiele "ziehen". Und das gezogene natürlich immer schön aus der Liste entfernen (oder irgendwie markieren), damit es nicht zweimal gezogen wird.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Girgl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 281


D6 Enterprise
BeitragVerfasst: Sa 17.04.04 17:54 
hmm,stimmt,so kann ichs mal versuchen,danke
Lemon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 96

Win XP
D5 Standart
BeitragVerfasst: So 18.04.04 09:53 
hallo,

habe auch schon einmal mit diesem problem gekaempft und habe mir dann einen algorithmus ueberlegt, der einen spielplan fuer mehrere runden aufstellt, sodass jeder spieler gleichberechtigt ist.
allerdings funktioniert diese methode nur mit einer ungeraden anzahl an spielern.

zuerst muss man die spieler in zwei gruppen aufteilen, beispielsweise in zwei arrays.
da die spielerzahl ungerade ist ist das eine array groesser als das andere.

dann muss du die beiden arrays 'rotieren' lassen, so ne art wasserkreislauf, sodass jedes element sich 'bewegt'.
diesen vorgang muss man doppelt so oft, wie das groessere array elemente hat wiederholen.
die aufstellung ist dann ganz leicht.
bei jedem durchlauf spielt element x aus dem einen array gegen element x aus dem anderen array.

hab' das ganze schon mehrmal eingesetzt und es funktioniert wirklich!!
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: So 18.04.04 10:27 
Titel: hmm,
dieses Rutschsystem wird auch beim Schach benutzt, es funktioniert auch mit eienr geraden Anzahl von Spielern. Der Trick ist dass dabei eine Partei immer an ihrem Platz bleibt und die anderen springen drüber. Also so :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
1. Runde
 1 2 3
 - - -
 6 5 4

2. Runde
 1 6 2
 - - -
 5 4 3

3. Runde
 1 5 6
 - - - 
 4 3 2 

usw.

Beim Schach ist es so dass der Spieler 1 immer sein Brett dreht, sprich einmal Weiss hat dann Schwarz usw. Also quasi Heimspiel/Auswärtsspiel.

_________________
mfg. Joel
rokdd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: So 18.04.04 11:14 
meinst du das man bei 18 mannschaften noch durchsieht? ist ja deine sache! ich würde das ganze wie bei vielen spielen machen. es gibt verschiedene missionen und die startplätze sind alle gleich. ist ja ähnlich der ersten variante wo alle kombinationen erfasst werden und dann per zufall ausgeählt werden. nur das im bedarfsfall der zufall durch den user ersetzt werden kann...
Lemon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 96

Win XP
D5 Standart
BeitragVerfasst: So 18.04.04 14:45 
danke, das hat jetzt auch mir geholfen!!!
Garek
Hält's aus hier
Beiträge: 11

Win 2k
D4 prof
BeitragVerfasst: Fr 11.03.05 15:23 
Habe mal das ganze in eine proc gebracht aber ich bekomme bei mehr als 1 gruppe in der FOR lv=1 zeile nach dem zweiten durchlauf ne exception von wegen ungültige zeiger operation (beim zweiten durch laufen bei zwei gruppen sind lv und anzgr jeweils=2) ich benutze delphi4 prof

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:
procedure TMainF.SpielplanerstClick(Sender: TObject);
VAR i,j,row,lv,lv2,spag,runde:Integer;
    spielplan: ARRAY OF Integer;
begin
row:=0;
setlength(spielplan,anzjegr);
FOR lv:=1 TO anzgr DO /// also HIER 
    BEGIN
    runde:=1;
    i:=1;
    inc(row);
    spielplan[0]:=1;
    WHILE (i<=anzjegr) DO
          BEGIN
          spielplan[i]:=anzjegr-i+1;
          inc(i);
          END;
    spag:=0;
    REPEAT
    SpielplanSG.Cells[1,row]:=gruppen[lv].mannschaften[spielplan[spag]];
    SpielplanSG.Cells[2,row]:=gruppen[lv].mannschaften[spielplan[spag+1]];
    SpielplanSG.Cells[0,row]:=IntToStr(runde);
    inc(runde);
    inc(spag);inc(spag);
    inc(row);
    UNTIL (spag)>=anzjegr;
    inc(row);
    FOR lv2:=1 TO ((2*(anzjegr))-(anzjegr+2)) DO
        BEGIN
        j:=spielplan[1];
        FOR i:=1 TO (length(spielplan)-1) DO spielplan[i]:=spielplan[i+1];
        spielplan[anzjegr-1]:=j;
        spag:=0;
        REPEAT
        SpielplanSG.Cells[1,row]:=gruppen[lv].mannschaften[spielplan[spag]];
        SpielplanSG.Cells[2,row]:=gruppen[lv].mannschaften[spielplan[spag+1]];
        SpielplanSG.Cells[0,row]:=IntToStr(runde);
        inc(runde);
        inc(spag);inc(spag);
        inc(row);
        UNTIL (spag)>=anzjegr;
        inc(row);
        END;
    END;
end;


Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 11.03.05 15:27 
Was ist anzgr und in welchem Kontext wird es in deiner ersten for-Schleife verwendet?

//EDIT: die Schleife darf außerdem nur bis ... - 1 laufen!

AXMD
Garek
Hält's aus hier
Beiträge: 11

Win 2k
D4 prof
BeitragVerfasst: Fr 11.03.05 15:30 
1. anzgr ist die anzahl der gruppen //edit dh wie oft der Spielplan erstellt werden muss

2. wie eine For schleife darf nur bis 1 laufen??? FOR i:=1 TO 10 DO ich kann doch ne for schleife soweit laufen lassen wie ich das will.... oder verstehe ich dich falsch :?: :?: :?:
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 11.03.05 15:33 
Da ich annehme, dass gruppen ein dynamisches Array ist, kann ich nur sagen: ein dyn. Array fängt immer bei 0 an und hört bei count - 1 auf.

AXMD
Garek
Hält's aus hier
Beiträge: 11

Win 2k
D4 prof
BeitragVerfasst: Fr 11.03.05 15:36 
anzgr ist ein int sonst würde es ja keinen sinn machen ^^

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  
TYPE
  Gruppe= RECORD
    Mannschaften:ARRAY [1..100] OF STRING;
    Kategorie:STRING;
VAR
Gruppen:ARRAY [1..25] OF Gruppe;
anzgr,anzjegr,anzgesamt:Integer;


spielplan ist ein dyn array aber das wird ja auch mit 0 begonnen alle anderen Array bei mir beginnen aus praktischen gründen bei 1 in dem programm

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 11.03.05 15:38 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
    WHILE (i<=anzjegr) DO
          BEGIN
          spielplan[i]:=anzjegr-i+1;
          inc(i);
          END;


Aber DAS kann aus oben genannten Gründen gar nicht gehen...

AXMD
Garek
Hält's aus hier
Beiträge: 11

Win 2k
D4 prof
BeitragVerfasst: Fr 11.03.05 15:47 
OK ^^ das = war zuviel komischen weise lief diese Stelle aber immer ohne probleme durch
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    
spielplan[0]:=1;
    WHILE (i<anzjegr) DO
          BEGIN
          spielplan[i]:=anzjegr-i+1;
          inc(i);
          END;

so einfach das gleich rausnehmen und es funkt auf jeden fall für mannschaftsanzahlen mod 2 = 0 ^^

thx
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 11.03.05 15:48 
Jeder soll gegen jeden spielen. Du willst einfach die Reihenfolge der Spiele zufällig haben, hab ich das richtig verstanden? Das sind dann 153 Spiele!?
Sowas vielleicht?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);
const
 Count = 18;
Var
 I, J : Integer;
 List : TStringlist;
begin
 List := TStringList.Create;
 For I := 1 to Count do
  For J := 1 to I-1 do
  List.Add(inttostr(J)+' gegen '+inttostr(I));
 while List.Count > 0 do
 begin
  J := Random(List.Count);
  Memo1.lines.add(List.Strings[J]);
  List.Delete(J);
 end;
 List.Free;
end;
Garek
Hält's aus hier
Beiträge: 11

Win 2k
D4 prof
BeitragVerfasst: Fr 11.03.05 15:53 
damit bekomme ich aber keinen geordneten spiel plan sonder erst alle Spiele einer Mannschaft (wenn ich das jetzt richtig überblickt hab) und genau das will ich ja nicht es soll ja von vorn herein eine geordnete Reihen Folge der Spiele da sein so das mann den Spielplan mit den jeweilen gruppen so abbareiten könnte... das Funktioniert ja jetzt auch aber trozdem thx
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 11.03.05 15:59 
Zitat:
damit bekomme ich aber keinen geordneten spiel plan sonder erst alle Spiele einer Mannschaft

???
Wenn dus sonst irgendwie geschafft hast, ist ja gut. Aber ich seh das Problem nicht ganz... Wenn jede Mannschaft gegen jede andere Mannschaft spielen soll, dann kann man nur noch die Reihenfolge der Spiele zufällig machen. Die Liste, die vom Code oben erzeugt wird, hat eine ganz zufällige Reihenfolge der Spiele; und es spielt jede Mannschaft einmal gegen jede andere Mannschaft.
In der Liste ("X gegen Y") ist links immer die Mannschaft mit der tieferen Mannschaftsnummer, und rechts die Mannschaft mit der höheren Mannschaftsnummer.
Garek
Hält's aus hier
Beiträge: 11

Win 2k
D4 prof
BeitragVerfasst: Fr 11.03.05 16:14 
ja wie gesagt wie gesagt zu fälig ich will aber nen geordneten Spielplan... (habe das nach dem system weiter oben im thread gemacht) weil wenn in einer gruppe mannschaft 1-2 spielt und in einer anderen bei der selben spielnummer 9-37 spielt das sehr verwirrend für die spieler ist... glaub mir hab ich schon erlebt hab lange fussball gespielt udn auch nicht sleten bei volleyball tunieren mit gemacht...

//edit man sieht hier das du nur als programmierer denks und nicht an den user ;)