Algorithmus gesucht KO-System
Connor
- php
Hallöchen. Ich mal wieder :)
Weis jemand wie man einen Algoritmus erstellen kann auf folgender Basis:
Max. Anzahl im Array: 8 oder 16 oder 32 oder 64 usw.
Dann immer: Erster gegen Letzen, Zweiter gegen vorletzten usw.
Bsp bei 8 im array:
Runde:1
Sp1: 1 gegen 8
Sp2: 2 gegen 7
Sp3: 3 gegen 6
Sp4: 4 gegen 5
Runde 2:
Sp5: Sieger Sp1 gegen Sieger Sp2
Sp6: Sieger Sp3 gegen Sieger Sp4
Runde 3:
Sp7: Verlierer Sp5 gegen Verlierer Sp6
Runde 4:
Sp8: Sieger Sp5 gegen Sieger Sp6
Das gleiche dann bei den anderen Werten(16 od 32 od 64).
Mit if-abfragen gehts es zwar, aber das ist sehr aufwendig.
Habe das hier:
http://connormcleod.saarmikey.de/flc/tuni/
programmiert mit if-abfragen.
Danke und Gruss Connor
Soweit bin ich schon mal.
Was mich noch stört, ist das ich in der FOR-Schleife die $anzahl immer wieder addieren muss.
Ob das elleganter geht ? * :-)
/* Max Anzahl: 8, 16, 32, 64 */
$maxanzahl = 64;
$spieler = range(1, $maxanzahl);
/* Spiel um Platz 3 ? Coding fehlt noch */
$platz_3 = false;
/*
foreach ($spieler as $werte)
{
print "<pre>";
print_r ($werte);
print "</pre>";
}
Folgt noch */
$anzahl = count($spieler);
$out = "Gesamt Spieler: $anzahl<br>";
$out .= "<br>";
$out .= "Runde 1: ".($anzahl/2)." Spiele<br>";
for($count = 1; $count <= $anzahl/2; $count++)
{
$out .= "Spiel ".$count."<br>";
}
$out .= "<br>";
$out .= "Runde 2: ".($anzahl/4)." Spiele<br>";
for($count = $count; $count <= ($anzahl/2)+($anzahl/4); $count++)
{
$out .= "Spiel ".($count)."<br>";
}
$out .= "<br>";
$out .= "Runde 3: ".($anzahl/8)." Spiele<br>";
for($count = $count; $count <= ($anzahl/8)+($anzahl/4)+($anzahl/2); $count++)
{
$out .= "Spiel ".($count)."<br>";
}
$out .= "<br>";
if (!is_float($anzahl/16) ){
$out .= "Runde 4: ".($anzahl/16)." Spiele<br>";
for($count = $count; $count <= ($anzahl/16)+($anzahl/8)+($anzahl/4)+($anzahl/2); $count++)
{
$out .= "Spiel ".($count)."<br>";
}
$out .= "<br>";
}
if (!is_float($anzahl/32)){
$out .= "Runde 5: ".($anzahl/32)." Spiele<br>";
for($count = $count; $count <= ($anzahl/32)+($anzahl/16)+($anzahl/8)+($anzahl/4)+($anzahl/2); $count++)
{
$out .= "Spiel ".($count)."<br>";
}
$out .= "<br>";
}
if (!is_float($anzahl/64)){
$out .= "Runde 6: ".($anzahl/64)." Spiele<br>";
for($count = $count; $count <= ($anzahl/64)+($anzahl/32)+($anzahl/16)+($anzahl/8)+($anzahl/4)+($anzahl/2); $count++)
{
$out .= "Spiel ".($count)."<br>";
}
}
echo $out;
Gruss Connor
Warum zählst du nicht einfach die Einträge und prüfst, ob der wert ein glatte potentierte 2 ist (Stichwort log())
Danach läufst du das Array ungeachtet der Länge mit einer for-schleife durch, aber nur n/2 Durchläufe und nimmst jeweils i+1 und n-i bis du durch bist?
ob das dann 4, 8 oder 1024 Mannschaften sind, spielt da keine Rolle mehr - zudem ist der Code vermutlich nur mehr 1/3 deines Codes.
Hallo suit und danke für deine Antwort
Warum zählst du nicht einfach die Einträge und prüfst, ob der wert ein glatte potentierte 2 ist (Stichwort log())
Aus dem PHP-Manual:
float log ( float $arg [, float $base = M_E ] )
Berechnet den natürlichen Logarithmus von arg beziehnugsweise den Logarithmus von arg zur Basis base falls der optionale zweite Parameter base gegeben ist.
Das werde ich natürlich testen :-)
Danach läufst du das Array ungeachtet der Länge mit einer for-schleife durch, aber nur n/2 Durchläufe und nimmst jeweils i+1 und n-i bis du durch bist?
Oha, leider war ich in Mathe nicht so gut.
Könntest du mir bitte genauer beschreiben wie du das meinst?
ob das dann 4, 8 oder 1024 Mannschaften sind, spielt da keine Rolle mehr - zudem ist der Code vermutlich nur mehr 1/3 deines Codes.»»
Genau das ist mein Ziel :-)
Gruss Connor
Danach läufst du das Array ungeachtet der Länge mit einer for-schleife durch, aber nur n/2 Durchläufe und nimmst jeweils i+1 und n-i bis du durch bist?
Oha, leider war ich in Mathe nicht so gut.
Könntest du mir bitte genauer beschreiben wie du das meinst?
n steht in diesem Fall für die Anzahl der Einträge in deinem Array, also Anzahl der Teilnehmer oder Teams oder whatever.
i ist der Zähler, welchen du für deine Schleife verwendest.
Du hast n/2 Durchläufe, d. h. halb so viele Durchläufe wie Einträge. Das kommt daher, dass du bei jedem Schleifendurchlauf zwei Werte abgreifen wirst.
Beim ersten Schleifendurchlauf ist i+1 der erste Teilnehmer. Der Teilnehmer, der an Platz Eins gesetzt ist. (i+1 weil die Schleife bei 0 zu zählen beginnt).
n-i solltest Du dir selbst erschließen können. Überlege einfach, welche Werte sich beim ersten und beim zweiten Schleifendurchlauf ergeben. Dann sollte das System klar werden.
Gruß Fabulit