Hallo,
ein paar Kumpels von mir und ich haben uns einen Kickertisch zusammen gekauft, um 1on1 Turniere auszutragen.
Es gilt also jeder gegen jeden und wenn möglich dieselbe Person nicht zweimal hintereinander.
Die Anzahl der Person ist dabei unbekannt, kann also gerade oder ungerade sein.
Wieviel Spiele gespielt werden müssen bekommt man mit folgender Bildungsvorschrift raus ( hoffe ich zumindest... ist mir nebenbei eingefallen ) :
spiele := (spieler*spieler-spieler)/2
Nun zum Problem...
Ich hab ein bisschen im Board hier schon gelesen und bin zu folgenden Schluß gekommen:
Bei gerader Anzahl von Spielern:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| 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. |
der erste Spieler bleibt fest und der Rest dreht im Urzeigersinn
Bei ungerader Anzahl von Spielern:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| 1. Runde 1 2 - - 3 5 4 2. Runde 5 1 - - 2 4 3 3. Runde 4 5 - - 1 3 2 usw. |
alle Spieler drehen sich im URzeigersinn....
soweit so gut, jetzt kommt ja der schwierigste Teil es in Code umzuwandeln :/
erstmal der Anfang:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type spiel = record first:integer; second:integer; resultfirst:byte; resultsecond:byte; end; var Form1: TForm1; spieler: integer; spiele: array[0..100] of spiel; spielegesamt:integer; |
sooo... jetzt zum Problem... ich weiß nicht, wie man es am einfachsten in Code umwandelt :/
ich hab folgendes Ergebnis, dass allerdings nicht klappt, weil da irgendwie ein Denkfehler drin ist...
( Turnierplan für eine gerade Anzahl von Spielern )
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.gerade(spieler:integer); var i,count,k,l:integer; weiter:boolean; begin count := 0; for i:=spieler downto 2 do begin weiter := true; k:=1; l:=i; repeat if k = 1 then begin spiele[count].first := 1; spiele[count].second := l; if (l+1) > spieler then k:=spieler else k:= i+1; end else begin if (i+1-k)< 2 then l:= spieler; spiele[count].first := k; spiele[count].second := l; if (k+1) > spieler then k:=spieler else k:= k+1; end; dec(l); if l < 2 then l:=spieler;
if (spiele[count].second = k) then weiter:= false;
count := count+1; until not weiter; end; end; |
Kann mir jemand helfen, ich bin total am verzweifeln
oder hat vielleicht jemand eine bessere Idee, wie man das umsetzten kann?
Mfg,
Matze