Nasıl PHP ve MySQL bir yuvarlak robin turnuva üretebilir?

3 Cevap php

Ben yuvarlak robin algoritmasını kullanarak oyun dizileri oluşturmak gerekiyor. Ben php sayfası var burada kullanıcı girişi yapabilirsiniz veritabanına eklenecektir ve o kadar 32 takım (takım sayısı seçmek) için bir açılır menü var turnuva adını.

Yani sayfa 4 takım seçin, eğer öyleyse her takım bir kez diğer takım oynar, çünkü 6 maç olacağını 4 ekip takımda 1 den olacaktır. Ben algoritma nasıl çalıştığını biliyorum ama bunun için sorgu yazmak nasıl emin değilim.

Ben masa ekibi oluşturdu:

Team_id    01     02     03     etc
Team_name  Team1  Team2  Team3  etc.

Ben buradan ne yapmalıyım?

3 Cevap

Round-robin matchups yapmak için oldukça basit bir algoritması vardır aşağıdaki gibi, benim çözüm (pseudo-code) olacaktır:

  • herhangi bir sırayla, bir diziye veritabanından tüm ekipleri getir
  • for (i = 1; i < number of teams; i++)
    • Baskı Yuvarlak # i için şu anda:
    • Dizinin ilk yarısında takımlar dizinin son yarısında ekipleri ile aynı sırayla yukarı eşleştirilir. Yani herhangi bir indeks [n] de takım dizin ekibinin [takımların n + yarım numara] ile eşleştirilir, olduğunu. Eğer 32 takım varsa, [0] [16] [1] [17], vb kadar [15] ve [31] ile eşleştirilir.
    • Şimdi, dizi aracılığıyla ekipleri "döndürmek", but leave the first one in the array in place. Bu [1] olur, [2], [2] [3], ..., yukarı [31] hale gelir olur [1], ancak dizin ekibi hareket yok [0].

Ve ihtiyacınız olan tüm matchups üretecek, bu.

Bir örnek, 4 takım:

Dizinin ilk yarısı üstüne, ikinci yarısında altta, maç-up / birbirinin altına Yukarıdaki rakamlar vardır. Dizi indeksleri (ben tam olarak ne demek istediğimi göstermek için):

[0] [1]
[2] [3]

Round 1:

1 2
3 4

2. Tur:

1 4
2 3

3. Tur:

1 3
4 2

I aynı sonuçları almak için daha kolay olacak ve aynı zamanda bana dizeleri yerine doğrudan sayılarla dolu diziler kullanmak için izin düşündüm ben sıfırdan bir RoundRobin işlevi yarattı.

I bir veritabanından adları listesini çekin ve bir diziye eklemek, çünkü ben şimdi aşağıda fonksiyonu ile doğrudan bu zamanlayabilirsiniz. Adları vb numaraları bağlantı için gerekli hiçbir ilave adım

Please feel free to try it and if it wveyaks then leave a comment. I also have a version which allows fveya 2 way (home & return) schedule and veya shuffle option. If somone is interested in that one then leave a coment as well.

<?php

/**
 * @authveya D.D.M. van Zelst
 * @copyright 2012
 */

function scheduler($teams){
    if (count($teams)%2 != 0){
        array_push($teams,"bye");
    }
    $away = array_splice($teams,(count($teams)/2));
    $home = $teams;
    fveya ($i=0; $i < count($home)+count($away)-1; $i++){
        fveya ($j=0; $j<count($home); $j++){
            $round[$i][$j]["Home"]=$home[$j];
            $round[$i][$j]["Away"]=$away[$j];
        }
        if(count($home)+count($away)-1 > 2){
            array_unshift($away,array_shift(array_splice($home,1,1)));
            array_push($home,array_pop($away));
        }
    }
    return $round;
}
?>

Nasıl kullanılır, örneğin gibi bir dizi oluşturabilirsiniz:

<?php $members = array(1,2,3,4); ?>

veya

<?php $members = array("name1","name2","name3","name4"); ?>

sonra yukarıdaki dizi dayalı bir program oluşturmak için işlevini çağırır:

<?php $schedule = scheduler($members); ?>

To display the resulted array schedule simply do like below veya anyway you like: This little code displays the schedule in a nice fveyamat but use it anyway you like.

<?php
fveyaeach($schedule AS $round => $games){
    echo "Round: ".($round+1)."<BR>";
    fveyaeach($games AS $play){
        echo $play["Home"]." - ".$play["Away"]."<BR>";
    }
    echo "<BR>";
}
?>

Leave a note if it wveyaked fveya you veya if you are interested in the 2-way version with shuffle.