Dynamische Tabelle aus 2er Potenz (KO-System)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Dynamische Tabelle aus 2er Potenz (KO-System)

    Hallöchen liebe Gemeinde.
    ich möchte eine HTML-Tabelle dynamisch (Vorgabe ist Anzahl Teilnehmer)
    ausgeben lassen.
    Teilnehmer sind immer 2er Potenzen. Also: 8,16,32,64,128 usw.

    Teilnehmer: 8
    Spiele: 4
    In Runde: 1 Teilnehmer: 4
    Spiele: 2
    In Runde: 2 Teilnehmer: 2
    Spiele: 1
    In Runde: 3
    oder:

    Teilnehmer: 16
    Spiele: 8
    In Runde: 1 Teilnehmer: 8
    Spiele: 4
    In Runde: 2 Teilnehmer: 4
    Spiele: 2
    In Runde: 3 Teilnehmer: 2
    Spiele: 1
    In Runde: 4
    usw...........

    Die dynamische Tabelle sollte sich selber aufgrund der Anzahl der Teilnehmer erstellen können und so aussehen (bsp 8 Teilnehmer die in einem ARRAY stehen):


    Runde 1
    Spiel 1 A:B
    Spiel 2 C
    Spiel 3 E:F
    Spiel 4 G:H
    (hier ein tr)
    Runde 2 (Halbfinale)
    Spiel 5 A (Gewinner Spiel 1 : Gewinner Spiel 2)
    Spiel 6 F:G (Gewinner Spiel 3 : Gewinner Spiel 4)
    (hier ein tr)
    Runde 3 (Finale)
    Spiel 7 D:G (Gewinner Spiel 5 : Gewinner Spiel 6)

    Bisher hatte ich 4 verschiedene Codings für die(8,16,32,64) Teilehmer und
    das ist schwer zu warten.

    Mein Ansatz:

    PHP-Code:
    $anzahl 16// Anzahl Teilnehmer
    $rest 1;
    $runde 1;
    echo 
    "<table border=1><tr>";
    while(
    $anzahl $rest)
       {
       
    $spiel $anzahl/2;
       
          echo 
    "<tr><td>Teilnehmer: ".$anzahl."<br>Spiele: ".$spiel ."<br>In Runde: ".$runde++."</td></tr>" ;
       
    $anzahl $anzahl /;
       }
    echo 
    "</table><br><br>"
    Okay da fehlt noch das ARRAY der Teilnehmer, aber da könnte man als Dummy
    PHP-Code:
    $teilnehmer range (1,16); 
    nehmen

    Vllt hilft mir ja jemand aufs richtige Pferd

  • #2
    Hallo,

    die Aufgabe habe ich verstanden, aber nicht, auf welches Pferd du willst. Bitte konkretisiere das Problem.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Pferd:
      PHP-Code:
      $a range(1,8);
      while(
      true){
          
      $aUse array_slice($a0count($a)/2);
          
      $a array_slice($acount($a)/2);
          
      var_dump($aUse);
          
      var_dump($a);
          if(
      count($a) <= 1) break;

      Code:
      array
        0 => int 1
        1 => int 2
        2 => int 3
        3 => int 4
      array
        0 => int 5
        1 => int 6
        2 => int 7
        3 => int 8
      array
        0 => int 5
        1 => int 6
      array
        0 => int 7
        1 => int 8
      array
        0 => int 7
      array
        0 => int 8
      Zuletzt geändert von steffomia; 11.08.2012, 01:01. Grund: add: ausgabe
      Wer keine Arbeit hat, der macht sich welche
      XAMPP + NetBeans + XDebug(Xampp included) + SVN == FUN

      Kommentar


      • #4
        Zitat von Wasser_Wanderer Beitrag anzeigen
        Okay da fehlt noch das ARRAY der Teilnehmer, aber da könnte man als Dummy
        PHP-Code:
        $teilnehmer range (1,16); 
        nehmen
        Das ist aber das Hauptproblem. Da an der Stelle noch nicht bekannt ist, wer im ersten Spiel gewonnen hat, ist es unmöglich, die Teilnehmer des zweiten Spiels aufzulisten.

        Wenn du dagegen sowieso nur mit anonymen Buchstaben arbeitest (so wie in deinem Beispiel A…H), brauchst du wiederum kein Teilnehmerarray, sondern nur deren Anzahl. In diesem Falle könnte das so aussehen:

        PHP-Code:
        $firstPlayer 'A';
        $playerCount 16;
        for (
        $first ord($firstPlayer), $players array_map('chr'range($first$first $playerCount));
            (
        $gameCount count($players) >> 1) >= 1;
        ) {
            
        $temp array_splice($players$gameCount);
            
        $matches array_map(null$players$temp);
            
        print_r($matches);

        Zuletzt geändert von AmicaNoctis; 11.08.2012, 01:39.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Hallo AmicaNoctis und steffomia,
          zunächst lieben Dank für Eure Mühe.

          Amica:
          Das ist aber das Hauptproblem. Da an der Stelle noch nicht bekannt ist, wer im ersten Spiel gewonnen hat, ist es unmöglich, die Teilnehmer des zweiten Spiels aufzulisten.
          Das ist Richtig aber zunächst nicht relevant, da die Ergebnisse ( es gibt nur Sieger oder Verlierer, die sieger kommen weiter) aus der ersten Runde ja noch nicht fest stehen.

          Die Zuteilung der Teilnehmernamen (nicht anonymsiert) ist vorher erfolgt.

          Es geht zunächst um die HTML-Tabellarische Ausgabe (ohne Ergebnisse) wenn:
          8 Teilnehmer (können auch 16,32,64 usw sein)

          Ausgabe
          Runde 1

          Spiel 1: 1 vs 8
          Spiel 2: 2 vs 7
          Spiel 3: 3 vs 6
          Spiel 4: 4 vs 5

          Runde 2 (Halbfinale):
          Spiel 5: Gewinner Spiel 1 vs Gewinner Spiel 2 (per if abfrage)
          Spiel 6: Gewinner Spiel 3 vs Gewinner Spiel 4 (per if abfrage)

          Runde 3 (Finale):
          Spiel 7: Gewinner Spiel 5 vs Gewinner Spiel 6 (per if abfrage)

          Die in FETT geschrieben Dinge sollen sich , wie auch die TD,s und TR,s ,dynamisch ausgeben werden.

          Klar das sich bei zb 16 Teilnehmernamen die Zahlen(Fette Wörter) entsprechend verändern.

          Ich hoffe das ich mein Problem besser beschreiben konnte.

          Eure derzeitigen Vorschläge werde ich selbstverständlich ausgiebig testen

          Kommentar


          • #6
            Ich habe mich (leider mit wenig Erfolg) weiter ausgetobt
            und möchte euch das gesamte "Machwerk" nun vorstellen.

            Im Script habe ich Notizen hinterlassen. Ich hoffe das jemand doch
            helfen kann.

            PHP-Code:
            // zum Testen des Scriptes, diese Zahl ändern
            $teilnehmer_anzahl 6// zu prüfende Zahl (Veränderbar)

             // array erstellen. Als Dummy. Im Einsatz ist es ein
             // ARRAY mit Namen/ID,s
            $anzahl range(1,$teilnehmer_anzahl);

            print 
            "<pre><b>Spieler-Liste:</b><br>";
            print_r ($anzahl);
            print 
            "</pre>"

            // Mischen des ARRAY $anzahl, wenn nötig
            #srand((double)microtime()*1000000);
            #shuffle($anzahl);

             // wieviele Einträge sind im ARRAY $anzahl enthalten
            $zahl count($anzahl);

            // Anfang Prüfung ob $zahl eine 2er Potenz ist
            $potenz pow(2,ceil(log($zahl2)));
            // Wenn $zahl eine 2er Potenz:
            if ($zahl == $potenz)
            {
            echo 
            'Geprüfte Menge an Teilnehmern: '.$zahl.' ist Okay.<br>Es gibt keine Freilose<br><br>';
            // Das ARRAY $anzahl bleibt unverändert
            $anzahl $anzahl;
            $anzahl_neu count($anzahl);
            }
            // wenn $zahl keine 2er Potenz
              
            else 
              {
              
            // wenn $zahl kleiner als nächste 2er Potenz
              
            if ($zahl $potenz)
              {
              
            // solange Summe $anzahl kleiner nächste 2er Potenz,
              // schreibe mir in das Array $anzahl: Freilos hinein
              
            while(count($anzahl) < $potenz){array_push($anzahl,'Freilos');}
              }
            $anzahl_neu count($anzahl);
            $anzahl_freilose = ($anzahl_neu $zahl);

            echo 
            'Geprüfte Zahl: '.$zahl.'<br>'.'Nächste 2er-Potenz: '.$potenz.'<br><br>';
            echo 
            'Es wurden: '.$anzahl_freilose.' Freilose hinzugefügt<br><br>';
              }
            // Ende Prüfung ob $zahl eine 2er Potenz ist

              
            print "<pre><b>Endgültige Spieler-Liste:</b><br>";
            print_r ($anzahl);
            print 
            "</pre>";

            // nun aus dem ARRAY $anzahl, die Paarungen bilden:
            // und als HTML-Tabelle ausgeben

            $spiel_nr 1// Startzähler für die Spiel-Nr.
            $limit $anzahl_neu/2// Begrenzer für die Schleife

            // Anfang Ausgabe HTML-Tabelle
            echo '<table border=1>';
            echo 
            '
                  <th>Spiel-Nr</th>
                  <th colspan=3>Begegnung</th>
                  <th colspan=3>Ergebnis</th>'
            ;
            // solange Menge in $anzahl_neu, größer ist als
            // als $limit ($anzahl_neu geteilt durch 2)
            // wird die Menge in $count dekrementiert (um 1 vermindert)
            // damit dann das neue ARRAY $paarungen füllen
            for($count $anzahl_neu$count $limit$count--)
            {
            // Nun werden die Paarungen in dem neuen ARRAY $paarungen gebildet
            // wobei der Erste gegen den Letzen, der Zweite gegen den Vorletzten ...
            // ... usw "gepaart" werden
            $paarungen = array(array_shift($anzahl),(array_pop($anzahl)));
            // Paarungen als HTML-Tabelle ausgeben
            echo '
            <tr>
            <td>Spiel: '
            .$spiel_nr++.'</td>
            <td>'
            .$paarungen[0].'</td>
            <td>&nbsp;-&nbsp;</td>
            <td>'
            .$paarungen[1].'</td>
            <td>&nbsp;</td>
            <td>&nbsp;:</td>
            <td>&nbsp;</td>
            </tr>'
            ;
            /* 
            Leider gehts bisher nur in der Ersten Runde
            Die nachfolgenden Runden bekomme ich nicht hin.
            Mein Gedanke ist, das ARRAY $paarungen immer weiter zu teilen
            und auszugeben, bis nur noch eine Paarung (Finale) übrig bleibt.
            Aber wie??
             */
            }
            /* Nun kommt der Teil der Fehlt */
            echo '
            <tr>
            </tr>
            <tr>
            </tr>
            <tr>
            <td colspan=4>(Ab soll es weiter dynamisch gehen)</td>
            </tr>
            <tr>
            <td colspan=4>Halbfinale (da vorletzte Runde bei 4 Paarungen)</td>
            </tr>
            <td>Nr: ??</td>
            <td>Gewinner Spiel 1</td>
            <td>&nbsp;-&nbsp;</td>
            <td>Gewinner Spiel 2</td>
            </tr>
            <td>Nr: ??</td>
            <td>Gewinner Spiel 3</td>
            <td>&nbsp;-&nbsp;</td>
            <td>Gewinner Spiel 4</td>
            <tr>
            <tr>
            </tr>
            <tr>
            </tr>
            <td colspan=4>Finale (da letzte Runde bei 4 Paarungen)</td>
            </tr>
            <td>Nr: ??</td>
            <td>Gewinner Spiel ?</td>
            <td>&nbsp;-&nbsp;</td>
            <td>Gewinner Spiel ?</td>
            </tr>
            '
            ;

            // Ende Ausgabe HTML-Tabelle
            echo '</table>'

            Kommentar


            • #7
              Nun gut.............
              Es ist nun eine Woche her das, ich hier mein "Machwerk"
              vorgestellt hatte.

              Klar das ich nicht erwarte das sich alle auf mein Problem stürzen.

              Aber da ich Cross-Posting vermeiden möchte, aber gerne weiterkommen will,
              überlege ich, mein Problem in einem anderem Forum darzustellen.

              Ich hoffe das ich mit dem Gedanken NICHT iwie hier den engagierten Leuten
              hier, auf die "Füße" trete.

              Kommentar


              • #8
                Hi Wasser_Wanderer,

                ich hab' von den Codeschnipseln 'n bißchen was gemischt mit
                eigener Idee. Herausgekommen ist eine rekursive Lösung, allerdings
                erstmal ohne Tabelle, die kannst du dann ja selber "reinfriemeln", wenn
                du willst.

                Zwei Ausgabeversionen sind hier möglich:

                1. Runde 1 bis Runde n, dann Finale

                2. Runde 1 bis Runde n, dann Achtel-, Viertel, Halbfinale, Finale. Siehe Kommentare im Script.

                PHP-Code:
                <?php
                /*
                * Die Variable wird auf TRUE gesetzt, wenn die Spielerzahl eine 2er-Potenz ist
                */
                $create_table=false;
                /*
                * Wurde Anzahl Spieler gesendet und ist die Anzahl größer als 3 (mind. 4)
                */
                if(isset($_POST['anz_spieler']) && ($_POST['anz_spieler']>3)){
                 
                /*
                 * Ist die Anzahl eine 2er Potenz (4,8,16,32 . . . usw) . . . 
                 */
                 
                $is_potenz2=pow(2,ceil(log($_POST['anz_spieler'],2)));
                 if(
                $is_potenz2==$_POST['anz_spieler']){
                  
                /*
                  * Wenn ja, geht's unten weiter
                  */
                  
                $create_table=true;
                 }else{
                    
                /*
                    * Wenn nein, zurück zum Form.
                    */
                    
                header('location:a_dyn_tab.php');
                    exit;
                    }
                }
                ?>
                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
                <html>
                <head>
                <title>Untitled</title>
                </head>
                <body>
                <form action="" method="post">
                <p><label for="anz_spieler">Wieviele Spieler </label><input type="text" name="anz_spieler" id="anz_spieler" />
                <input type="submit" value="Los!!" /></p>
                </form>
                <?php
                /*
                * Rekursive Funktion
                */
                function spiele($liste,$runde,$spiel,$spiele){
                 if(
                count($liste) <= 1) return;
                   
                $aUse array_slice($liste0count($liste)/2);
                    
                $liste array_slice($listecount($liste)/2);
                    
                $spiel_runde=count($aUse);
                  
                /*
                  * Gibt Runde 1, Runde 2, . . . usw., als letztes Spiel Finale aus
                  */
                  /*
                  if(count($liste) == 1){
                   echo '<br><b><i>Finale</i></b><br><br>';
                  }else{
                     echo '<br><b><i>Runde '.$runde.'</i></b><br><br>';
                     }
                  */
                  /*
                  * Gibt je nach Spielerzahl Runde 1, Runde2, . . . usw.,
                  * dann Achtel-, Viertel-,Halbfinale, Finale aus.
                  */
                  
                switch(count($liste)){
                   case 
                1:$mod='<br><b><i>Finale</i></b><br><br>';break;
                   case 
                2:$mod='<br><b><i>Halbfinale</i></b><br><br>';break;
                   case 
                4:$mod='<br><b><i>Viertelfinale</i></b><br><br>';break;
                   case 
                8:$mod='<br><b><i>Achtelfinale</i></b><br><br>';break;
                   default:
                $mod='<br><b><i>Runde '.$runde.'</i></b><br><br>';
                  }
                  echo 
                $mod;
                  if(
                $runde==1){
                  for(
                $r=0;$r<$spiel_runde;$r++){
                   echo 
                'Spiel '.$spiele.' : Spieler '.$aUse[$r].' gegen Spieler '.$liste[$r].'<br>';
                   
                $spiele++;
                   }
                  }else{
                     for(
                $r=0;$r<$spiel_runde;$r++){
                      echo 
                'Spiel '.$spiele.' :  Gewinner Spiel '.$spiel.' gegen Gewinner Spiel '.++$spiel.'<br>';
                      
                $spiel++;
                      
                $spiele++;
                      }
                     }
                  
                $runde++;
                  
                /*
                  * Rekursiver Aufruf der Funktion
                  */
                  
                spiele($liste,$runde,$spiel,$spiele);
                }
                if(
                $create_table==true){
                 
                $liste range(1,$_POST['anz_spieler']);
                 
                /*
                 * Mit Runde 1 fangen wir an
                 */
                 
                $runde=1;
                 
                /*
                 * Zähler Gewinner Spiel 1 : Gewinner Spiel 2 . . . usw.
                 */ 
                 
                $spiel=1;
                 
                /*
                 * Zähler der gesammten Spiele
                 */
                 
                $spiele=1;
                 
                /*
                 * Funktionsaufruf
                 */
                 
                spiele($liste,$runde,$spiel,$spiele);
                }
                ?>
                </body>
                </html>
                Gruß
                Günni

                Kommentar


                • #9
                  Ich habe ein altes „Projekt“ mal leicht erweitert und das hier gebaut:

                  File-Upload.net - tournament.tar.gz

                  md5sum b87c0b185a5ad0539223cc77a1faa0c5


                  (Sind etliche Dateien, deshalb auf dem Weg. Wusste nicht, wo sonst hin damit.)

                  Kommentar


                  • #10
                    @ Günni:
                    Hallöchen Günni,
                    genau so hab ich es mir vorgestellt.
                    Da werde ich bestimmt heute die Nacht mit durchmachen

                    Vielen lieben Dank für deine Mühe

                    @ mermshaus
                    Hallöchen,
                    auch dir lieben Dank für deine Mühe.
                    Habe mir deine Daten geladen und werde sie natürlich auch
                    ausgiebig testen.

                    Kommentar


                    • #11
                      Erledigt. Danke

                      Sodele,
                      mal ein fettes an den Günni.
                      Dein Vorschlag hat mich ( gottseidank ) weitergebracht.
                      Ich fummel da noch die Freilose rein, wenn keine 2er Potenz.

                      Dein Vorschlag war echt klasse.

                      Ich wäre niemals auf die Idee gekommen das mit deiner Funktion
                      zu machen.

                      Gerade die CASE-Sache hat mich fast zum weinen gebracht (vor Freude)



                      Edit:
                      Ich verbeuge mich voller Erfurcht, bei allen die sich hier so toll eindenken und -bringen.
                      Hinweis: Das meinte ich echt ernst.
                      Zuletzt geändert von Wasser_Wanderer; 07.09.2012, 01:38.

                      Kommentar


                      • #12
                        hallo habe mal eine frage wir versuchen auch sowas auf unserer webseite einzubinden! kannst du das evt hochladen?

                        Kommentar


                        • #13
                          Zitat von ragnaroek1 Beitrag anzeigen
                          hallo habe mal eine frage wir versuchen auch sowas auf unserer webseite einzubinden! kannst du das evt hochladen?
                          Hallo,
                          erweiter das Script aus Post #8 von Guenni61 nach deinen Vorstellungen oder erstelle ein Jobangebot

                          Gruß WW

                          Kommentar

                          Lädt...
                          X