| Autor |
Beitrag |
Girgl
      
Beiträge: 281
D6 Enterprise
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 281
D6 Enterprise
|
Verfasst: Sa 17.04.04 17:54
hmm,stimmt,so kann ichs mal versuchen,danke
|
|
Lemon
      
Beiträge: 96
Win XP
D5 Standart
|
Verfasst: 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
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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 :
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
      
Beiträge: 329
Win XP
D6
|
Verfasst: 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
      
Beiträge: 96
Win XP
D5 Standart
|
Verfasst: 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
|
Verfasst: 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
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 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 AXMD: Code- durch Delphi-Tags ersetzt.
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: 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
|
Verfasst: Fr 11.03.05 15:36
anzgr ist ein int sonst würde es ja keinen sinn machen ^^
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 AXMD: Code- durch Delphi-Tags ersetzt.
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Fr 11.03.05 15:38
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
|
Verfasst: Fr 11.03.05 15:47
OK ^^ das = war zuviel komischen weise lief diese Stelle aber immer ohne probleme durch 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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?
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
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
|
Verfasst: 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 
|
|