Turnuva dirsek

2 Cevap php

Not sure of the best way to go about this? I want to create a tournament bracket of 2,4,8,16,32, etc teams.

The winner of the first two will play winner of the next 2 etc. All the way until there is a winner. Like this

Herkes bana yardımcı olabilir misiniz?

Daha çok bilgi Tamam.

Initially I want to come up with a way to create the tournament with the 2,4,8,16,etc. Then when I have all the users in place, if they are 16 players, there are 8 fixtures. At this point I will send the fixture to the database.

Kazanılan tüm oyuncular bir sonraki tura kadar zaman, ben karşılamak 2 kazananlar için tekrar başka bir sql sorgusu isterim.

Ne demek istediğimi anlıyor musun?

2 Cevap

Ben birkaç yıl önce böyle bir şey yaptım. Bu oldukça bir süre önceydi ve ben bunu farklı bir soru olabilir nasıl çıktı aynı şekilde (gerçekten çift elimintation veya benzeri ölçek değildir) yapmak istiyorum emin değilim. O 2002-2003 yılında olduğu gibi tablolar başvurdu. Bugün daha iyi teknikleri kesinlikle vardır.

Turnuvada mermi miktarı sürece oyuncu olarak, yukarıda belirtilen sayı biridir log2 (oyuncular) + 1 olduğunu. Bu bilgileri kullanarak siz orada kaç tur hesaplayabilirsiniz. Son turun nihai kazanan içerir.

Ben (en iyi uygulamalar için bu tweek) bu gibi oyuncu bilgileri şey saklanır

Tournament
  Name
  Size

Players
  Tournament
  Name
  Position (0 to tournament.size - 1)

Rounds
  Tournament
  Round
  Position (max halves for each round)
  Winner (player position)

Aşağıda tüm sorgularda Not, ben turnuva tanımlamak için "Turnuva = [turnuva]" dahil değildir. Onlar hiç gerek.

Bu bir sorgu ile bu sorgulamak ve farklı tur için gerektiği gibi dışarı bölmek için oldukça basit. Sen sonraki rakibini (orada bir varsayarak) almak için böyle bir şey yapabilirdi. 1. turda için, sadece tek veya çift olup olmadığını dayalı sonraki / önceki oynatıcı almak gerekir:

SELECT * FROM Players WHERE Position = PlayerPosition + 1
SELECT * FROM Players WHERE Position = PlayerPosition - 1

For the next round, if the user's last Round.Position was even, you'll need to make suer that the next position up has a winner: SELECT Player FROM Rounds WHERE Position = [playerRoundPosition] - 1

Değilse, bir sonraki oyuncu karar, ya da bir boşluk var değil (Boşlukların izin yok!)

Kullanıcıların son Round.Position tek olsaydı, orada bunların altında bir kullanıcı var ve emin olun gerekir (oynamak için kimse olduğu gibi), aksi takdirde otomatik olarak bir sonraki tura teşvik edilmelidir Bunların altında bir kazanan var,

SELECT COUNT(*) FROM Players WHERE Position > [Player.Position]
SELECT Player FROM Rounds WHERE Position = [playerRoundPosition] + 1

Son bir not olarak, ben gibi bir şey kullanarak yazdığınız sorguları azaltmak için aşağıdaki gibi bir şey kullanabilirsiniz eminim:

SELECT Player FROM Rounds WHERE Position + Position % 2 = [playerRoundPosition]
SELECT Player FROM Rounds WHERE Position - Position % 2 = [playerRoundPosition]

Güncelleme:

Looking over my original post, I find that the Rounds table was a little ambigous. In reality, it should be named matches. A match is a competition between two players with a winner. The final table should look more like this (only the name changed): Matches Tournament Round Position (max halves for each round) Winner (player position)

Umarım o biraz daha açık hale getirir. Iki oyuncu (bir maçta) birbirlerine karşı gittiğinizde, size bu bilgileri tablosu Maçları olduğunu saklayın. Bu özel uygulama oyuncuların katıldığı bilmek Maçın konumuna bağlıdır.

O benim uygulamasında daha açıktı, çünkü ben 1 de mermi numaralandırma başladı. Eğer seçerseniz, (gibi backwords gitmek tamamen farklı bir şey yapmak veya hatta) 0 seçebilirsiniz.

İlk turda, maç 1 oyuncu 1 ve 2. katıldı demektir. Maçında 2, oyuncular 3-4 katıldı. Esasen ilk turda sadece oyuncuların pozisyonu ve pozisyon + 1 katıldı. Bunun için daha fazla erişim gerekiyorsa da mermi tabloda bu bilgi depolayabilir. Ben programda bu verileri kullanılan her zaman, ben zaten tüm yuvarlak ve oyuncu bilgileri gerekli.

İlk turda sonra, maç son turda bakmak. 2. turda, maç, 1 maç 1 ve 2'den kazananlar katılabilir. Yuvarlak 2, maçı 2 maç 3 ve 4 kazananlar katılabilir. Bu turdan sonra 1 maç tablosunu kullanır dışında, oldukça tanıdık gelecektir. Bunu tekrarlayan görevi yapmak için daha verimli bir yolu vardır eminim, ben (sadece değil, refactored olduğunu kodu refactor için yeterli zaman gidemedik fazla).

Diziler kullanın ve ana diziden kaybeden ekipleri çıkarın. (Ama referans için, ayrı bir dizi üzerinde kalsın ve amaçlarını yeniden).